Windows GDI

Тема в разделе "MS Visual C++", создана пользователем iktomy, 18 май 2004.

Статус темы:
Закрыта.
  1. iktomy

    iktomy Гость

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

    Mustang Гость

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

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

    Zinya Гость

    Можно посмотреть в сторону GDI+. Там все это уже реализовано.

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

    Mustang Гость

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

    Yason Гость

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

    MSDN: Q79212, HOWTO: Drawing Transparent Bitmaps

    Код (Text):
    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 :)
     
  6. Zinya

    Zinya Гость

    А чем GDI+ так плох? Одно время писал, очень удобная, хотя и не очень быстрая, вещь.
    Хотя на вкус и цвет.....
     
  7. Yason

    Yason Гость

    Есть такая штука - совместимость...
    - вот тут полностью солидарен :)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей