00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <background_wnd/painters/transparent_painter.hpp>
00016
00017
00018 namespace win32 { namespace gui {
00019
00026 transparent_painter::transparent_painter(param0 crTransparent) : crTransparent_(crTransparent)
00027 {}
00028
00029 transparent_painter* transparent_painter::clone() const
00030 {
00031 return new transparent_painter(*this);
00032 }
00033
00034 void transparent_painter::draw(HDC hDC, int cx, int cy)
00035 {
00036 if (cx <= 0 || cy <= 0)
00037 return;
00038
00039 if (painter_available()) {
00040
00041 painter_base& painter = get_painter();
00042 HDC hPainterDC = CreateCompatibleDC(hDC);
00043 HBITMAP hBmp = CreateCompatibleBitmap(hDC, cx, cy);
00044 HBITMAP hOldBmp = (HBITMAP) SelectObject(hPainterDC, hBmp);
00045
00046
00047
00048 RECT rc = { 0, 0, cx, cy };
00049 HBRUSH hbr = CreateSolidBrush(crTransparent_);
00050 FillRect(hPainterDC, &rc, hbr);
00051 DeleteObject(hbr);
00052
00053
00054 painter.draw(hPainterDC, cx, cy);
00055
00056 #if (!defined WINVER || WINVER < 0x0500)
00057 SelectObject(hPainterDC, hOldBmp);
00058 DeleteDC(hPainterDC);
00059
00060
00061 HBITMAP hMaskBmp = prepare_mask(hBmp, cx, cy);
00062
00063
00064 HDC hTemp = CreateCompatibleDC(NULL);
00065 hOldBmp = (HBITMAP) SelectObject(hTemp, hBmp);
00066 draw_transparent_bitmap(hDC, hTemp, hMaskBmp, cx, cy);
00067
00068
00069 SelectObject(hTemp, hOldBmp);
00070 DeleteObject(hBmp);
00071 DeleteObject(hMaskBmp);
00072 DeleteDC(hTemp);
00073 #else
00074 TransparentBlt(hDC, 0, 0, cx, cy, hPainterDC, 0, 0, cx, cy, crTransparent_);
00075
00076
00077 SelectObject(hPainterDC, hOldBmp);
00078 DeleteObject(hBmp);
00079 DeleteDC(hPainterDC);
00080 #endif
00081 }
00082 }
00083
00084
00085 #if (!defined WINVER || WINVER < 0x0500)
00086
00087 HBITMAP transparent_painter::prepare_mask(HBITMAP hSourceBmp, int cx, int cy)
00088 {
00089
00090 HBITMAP hMaskBmp = CreateBitmap(cx, cy, 1, 1, NULL);
00091
00092
00093 HDC hSourceDC = CreateCompatibleDC(NULL);
00094 HDC hMaskDC = CreateCompatibleDC(NULL);
00095 HBITMAP hOldSourceBmp = (HBITMAP) SelectObject(hSourceDC, hSourceBmp);
00096 HBITMAP hOldMaskBmp = (HBITMAP) SelectObject(hMaskDC, hMaskBmp);
00097
00098
00099 COLORREF clrSaveBk = SetBkColor(hSourceDC, crTransparent_);
00100 BitBlt(hMaskDC, 0, 0, cx, cy, hSourceDC, 0, 0, SRCCOPY);
00101
00102
00103 COLORREF crOldText = SetTextColor(hSourceDC, RGB(255, 255, 255));
00104 SetBkColor(hSourceDC, RGB(0, 0, 0));
00105 BitBlt(hSourceDC, 0, 0, cx, cy, hMaskDC, 0, 0, SRCAND);
00106
00107
00108 SetTextColor(hSourceDC, crOldText);
00109 SetBkColor(hSourceDC, clrSaveBk);
00110 SelectObject(hSourceDC, hOldSourceBmp);
00111 SelectObject(hMaskDC, hOldMaskBmp);
00112 DeleteDC(hSourceDC);
00113 DeleteDC(hMaskDC);
00114
00115 return hMaskBmp;
00116 }
00117
00118 void transparent_painter::draw_transparent_bitmap(HDC hDC, HDC hSourceDC, HBITMAP hMaskBmp, int cx, int cy)
00119 {
00120 HDC hMaskDC = CreateCompatibleDC(NULL);
00121 HBITMAP hOldMaskBmp = (HBITMAP) SelectObject(hMaskDC, hMaskBmp);
00122
00123
00124 BitBlt(hDC, 0, 0, cx, cy, hMaskDC, 0, 0, SRCAND);
00125 BitBlt(hDC, 0, 0, cx, cy, hSourceDC, 0, 0, SRCPAINT);
00126
00127
00128 SelectObject(hMaskDC, hOldMaskBmp);
00129 DeleteDC(hMaskDC);
00130 }
00131 #endif // #ifndef WINVER || WINVER < 0x0500
00132
00133
00135 void transparent_painter::transparent_color(COLORREF crTransparent)
00136 {
00137 crTransparent_ = crTransparent;
00138 }
00139
00141 COLORREF transparent_painter::transparent_color() const
00142 {
00143 return crTransparent_;
00144 }
00145
00146 } }