Windows GDI

  • Автор темы iktomy
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

iktomy

Гость
#1
Господа, подскажите новичку, как покончить с 16-ти цветный отображением иконок на тулбаре в приложении созданном при помощи VC 6 и MFC. И еще, подскажите как сделать так, что бы битмап выводился в области диалогового окна с прозрачным фоном (tansparent image).
 
M

Mustang

Гость
#2
1. по поводу 16-ти цветных иконок тулбара - необходимо будет создать имаджлист, куда загрузить свою битмапу тулбаровых кнопочек с полноцветными картинками, заменить в этой битмапе выбранный цвет фона на цвет контролов (получется псевдопрозрачность) и установить этот имаджлист на свой тулбар. Если готов на такие подвиги - накорябаю примерчик.

2. В принципе, если прога будет работать только под Win XP, то там вроде есть свои методы обеспечения прозрачности.
а если универсально - то опять возвращаемся к подмене выбранного фона битмапы цветом фона диалога.
 
Z

Zinya

Гость
#3
подскажите как сделать так, что бы битмап выводился в области диалогового окна с прозрачным фоном (tansparent image).
Можно посмотреть в сторону GDI+. Там все это уже реализовано.

а если универсально - то опять возвращаемся к подмене выбранного фона битмапы цветом фона диалога
А вот это не прокатит. Если изменить цветовую схему винды, то сразу обнаружиться обман.
 
M

Mustang

Гость
#4
не обнаружится, если отлавливать сообщение themechenged (вроде)... и менять фон битмапы снова! :)
 
Y

Yason

Гость
#5
Народ, да вы чего?! Вы ещё DirectDraw присоветуйте... :)

MSDN: Q79212, HOWTO: Drawing Transparent Bitmaps

Код:
void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart, short yStart, COLORREF cTransparentColor)
 {
 BITMAP   bm;
 COLORREF  cColor;
 HBITMAP  bmAndBack, bmAndObject, bmAndMem, bmSave;
 HBITMAP  bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;
 HDC    hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;
 POINT   ptSize;

 hdcTemp = CreateCompatibleDC(hdc);
 SelectObject(hdcTemp, hBitmap);  // Select the bitmap

 GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
 ptSize.x = bm.bmWidth;      // Get width of bitmap
 ptSize.y = bm.bmHeight;      // Get height of bitmap
 DPtoLP(hdcTemp, &ptSize, 1);   // Convert from device

                  // to logical points

 // Create some DCs to hold temporary data.
 hdcBack  = CreateCompatibleDC(hdc);
 hdcObject = CreateCompatibleDC(hdc);
 hdcMem  = CreateCompatibleDC(hdc);
 hdcSave  = CreateCompatibleDC(hdc);

 // Create a bitmap for each DC. DCs are required for a number of
 // GDI functions.

 // Monochrome DC
 bmAndBack  = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

 // Monochrome DC
 bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

 bmAndMem  = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
 bmSave   = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

 // Each DC must select a bitmap object to store pixel data.
 bmBackOld  = SelectObject(hdcBack, bmAndBack);
 bmObjectOld = SelectObject(hdcObject, bmAndObject);
 bmMemOld  = SelectObject(hdcMem, bmAndMem);
 bmSaveOld  = SelectObject(hdcSave, bmSave);

 // Set proper mapping mode.
 SetMapMode(hdcTemp, GetMapMode(hdc));

 // Save the bitmap sent here, because it will be overwritten.
 BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

 // Set the background color of the source DC to the color.
 // contained in the parts of the bitmap that should be transparent
 cColor = SetBkColor(hdcTemp, cTransparentColor);

 // Create the object mask for the bitmap by performing a BitBlt
 // from the source bitmap to a monochrome bitmap.
 BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,
    SRCCOPY);

 // Set the background color of the source DC back to the original
 // color.
 SetBkColor(hdcTemp, cColor);

 // Create the inverse of the object mask.
 BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,
    NOTSRCCOPY);

 // Copy the background of the main DC to the destination.
 BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart,
    SRCCOPY);

 // Mask out the places where the bitmap will be placed.
 BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);

 // Mask out the transparent colored pixels on the bitmap.
 BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);

 // XOR the bitmap with the background on the destination DC.
 BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);

 // Copy the destination to the screen.
 BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0,
    SRCCOPY);

 // Place the original bitmap back into the bitmap sent here.
 BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);

 // Delete the memory bitmaps.
 DeleteObject(SelectObject(hdcBack, bmBackOld));
 DeleteObject(SelectObject(hdcObject, bmObjectOld));
 DeleteObject(SelectObject(hdcMem, bmMemOld));
 DeleteObject(SelectObject(hdcSave, bmSaveOld));

 // Delete the memory DCs.
 DeleteDC(hdcMem);
 DeleteDC(hdcBack);
 DeleteDC(hdcObject);
 DeleteDC(hdcSave);
 DeleteDC(hdcTemp);
 } 

The following is an example of how the DrawTransparentBitmap function might be called: 

 DrawTransparentBitmap(hdc,     // The destination DC.

            hBitmap,   // The bitmap to be drawn.
            xPos,    // X coordinate.
            yPos,    // Y coordinate.
            0x00FFFFFF); // The color for transparent
                  // pixels (white, in this
                  // example).
Кстати, по заверениям того же MSDN, работает, начиная с Windows 3.0 :)
 
Z

Zinya

Гость
#6
А чем GDI+ так плох? Одно время писал, очень удобная, хотя и не очень быстрая, вещь.
Хотя на вкус и цвет.....
 
Статус
Закрыто для дальнейших ответов.