From 0a1f778483d80f30d29695a0d47f643134f3bf9a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 25 Jan 2009 14:38:44 +0000 Subject: [PATCH] add wxDrawStateBitmap() (closes #10289) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58397 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/private.h | 16 ++++++++++++++ src/msw/ownerdrw.cpp | 46 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index 462bf91ec7..3a0ffc9e75 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -306,6 +306,22 @@ extern HICON wxBitmapToHICON(const wxBitmap& bmp); extern HCURSOR wxBitmapToHCURSOR(const wxBitmap& bmp, int hotSpotX, int hotSpotY); + +#if wxUSE_OWNER_DRAWN + +// Draw the bitmap in specified state (this is used by owner drawn controls) +enum wxDSBStates +{ + wxDSB_NORMAL = 0, + wxDSB_SELECTED, + wxDSB_DISABLED +}; + +extern +BOOL wxDrawStateBitmap(HDC hDC, HBITMAP hBitmap, int x, int y, UINT uState); + +#endif // wxUSE_OWNER_DRAWN + // get (x, y) from DWORD - notice that HI/LOWORD can *not* be used because they // will fail on system with multiple monitors where the coords may be negative // diff --git a/src/msw/ownerdrw.cpp b/src/msw/ownerdrw.cpp index 3dfc9d0065..b25513c602 100644 --- a/src/msw/ownerdrw.cpp +++ b/src/msw/ownerdrw.cpp @@ -532,4 +532,50 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc, } +// ---------------------------------------------------------------------------- +// global helper functions implemented here +// ---------------------------------------------------------------------------- + +BOOL wxDrawStateBitmap(HDC hDC, HBITMAP hBitmap, int x, int y, UINT uState) +{ + // determine size of bitmap image + BITMAP bmp; + if ( !::GetObject(hBitmap, sizeof(BITMAP), &bmp) ) + return FALSE; + + BOOL result; + + switch ( uState ) + { + case wxDSB_NORMAL: + case wxDSB_SELECTED: + { + // uses image list functions to draw + // - normal bitmap with support transparency + // (image list internally create mask etc.) + // - blend bitmap with the background colour + // (like default selected items) + HIMAGELIST hIml = ::ImageList_Create(bmp.bmWidth, bmp.bmHeight, + ILC_COLOR32 | ILC_MASK, 1, 1); + ::ImageList_Add(hIml, hBitmap, NULL); + UINT fStyle = uState == wxDSB_SELECTED ? ILD_SELECTED : ILD_NORMAL; + result = ::ImageList_Draw(hIml, 0, hDC, x, y, fStyle); + ::ImageList_Destroy(hIml); + } + break; + + case wxDSB_DISABLED: + result = ::DrawState(hDC, NULL, NULL, (LPARAM)hBitmap, 0, x, y, + bmp.bmWidth, bmp.bmHeight, + DST_BITMAP | DSS_DISABLED); + break; + + default: + wxFAIL_MSG( _T("DrawStateBitmap: unknown wxDSBStates value") ); + result = FALSE; + } + + return result; +} + #endif // wxUSE_OWNER_DRAWN -- 2.45.2