From 4004f41e3ce1655f9fa05c55a697ac0f8677c23a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 2 Feb 2000 00:52:06 +0000 Subject: [PATCH] 1. wxStaticBitmap now uses mask even for bitmaps (and not only icons) 2. we now catch WM_SYSKEYDOWN/UP events as well as normal ones git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5795 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/icon.h | 9 +++++--- include/wx/msw/statbmp.h | 6 +++--- src/msw/statbmp.cpp | 45 ++++++++++++++++++++++++++++++++-------- src/msw/window.cpp | 2 ++ 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/include/wx/msw/icon.h b/include/wx/msw/icon.h index 101671a656..1d9305e9aa 100644 --- a/include/wx/msw/icon.h +++ b/include/wx/msw/icon.h @@ -90,11 +90,17 @@ public: bool operator != (const wxIcon& icon) const { return m_refData != icon.m_refData; } + // implementation only from now on wxIconRefData *GetIconData() const { return (wxIconRefData *)m_refData; } void SetHICON(WXHICON icon) { SetHandle((WXHANDLE)icon); } WXHICON GetHICON() const { return (WXHICON)GetHandle(); } + // create from bitmap (which should have a mask unless it's monochrome): + // there shouldn't be any implicit bitmap -> icon conversion (i.e. no + // ctors, assignment operators...), but it's ok to have such function + void CopyFromBitmap(const wxBitmap& bmp); + protected: virtual wxGDIImageRefData *CreateData() const { @@ -104,9 +110,6 @@ protected: // create from XPM data void CreateIconFromXpm(const char **data); - // create from bitmap (which should have a mask unless it's monochrome) - void CopyFromBitmap(const wxBitmap& bmp); - private: DECLARE_DYNAMIC_CLASS(wxIcon) }; diff --git a/include/wx/msw/statbmp.h b/include/wx/msw/statbmp.h index 3715b09f7c..fb294bbc60 100644 --- a/include/wx/msw/statbmp.h +++ b/include/wx/msw/statbmp.h @@ -51,8 +51,8 @@ public: virtual ~wxStaticBitmap() { Free(); } - void SetIcon(const wxIcon& icon) { SetImage(icon); } - void SetBitmap(const wxBitmap& bitmap) { SetImage(bitmap); } + void SetIcon(const wxIcon& icon) { SetImage(&icon); } + void SetBitmap(const wxBitmap& bitmap) { SetImage(&bitmap); } // assert failure is provoked by an attempt to get an icon from bitmap or // vice versa @@ -79,7 +79,7 @@ protected: // TRUE if icon/bitmap is valid bool ImageIsOk() const; - void SetImage(const wxGDIImage& image); + void SetImage(const wxGDIImage* image); // we can have either an icon or a bitmap bool m_isIcon; diff --git a/src/msw/statbmp.cpp b/src/msw/statbmp.cpp index 0b47d28c65..909a09c532 100644 --- a/src/msw/statbmp.cpp +++ b/src/msw/statbmp.cpp @@ -42,7 +42,7 @@ // macors // --------------------------------------------------------------------------- - IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl) // =========================================================================== // implementation @@ -80,7 +80,23 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, m_windowStyle = style; + // we may have either bitmap or icon: if a bitmap with mask is passed, we + // will transform it to an icon ourselves because otherwise the mask will + // be ignored by Windows + wxIcon *icon = (wxIcon *)NULL; m_isIcon = bitmap.IsKindOf(CLASSINFO(wxIcon)); + if ( !m_isIcon ) + { + const wxBitmap& bmp = (const wxBitmap&)bitmap; + wxMask *mask = bmp.GetMask(); + if ( mask && mask->GetMaskBitmap() ) + { + icon = new wxIcon; + icon->CopyFromBitmap(bmp); + + m_isIcon = TRUE; + } + } #ifdef __WIN32__ // create a static control with either SS_BITMAP or SS_ICON style depending @@ -96,7 +112,7 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, ( classname, wxT(""), - winstyle | WS_CHILD | WS_VISIBLE, + winstyle | WS_CHILD | WS_VISIBLE | WS_DISABLED, 0, 0, 0, 0, (HWND)parent->GetHWND(), (HMENU)m_windowId, @@ -106,7 +122,8 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id, wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") ); - SetImage(bitmap); + SetImage(icon ? icon : &bitmap); + delete icon; // may be NULL, ok // Subclass again for purposes of dialog editing mode SubclassWin(m_hWnd); @@ -137,15 +154,25 @@ wxSize wxStaticBitmap::DoGetBestSize() const return wxWindow::DoGetBestSize(); } -void wxStaticBitmap::SetImage(const wxGDIImage& bitmap) +void wxStaticBitmap::SetImage(const wxGDIImage* image) { Free(); - m_isIcon = bitmap.IsKindOf(CLASSINFO(wxIcon)); + const wxIcon *icon = wxDynamicCast(image, wxIcon); + m_isIcon = icon != NULL; if ( m_isIcon ) - m_image = new wxIcon((const wxIcon&)bitmap); + { + m_image = new wxIcon(*icon); + } else - m_image = new wxBitmap((const wxBitmap &)bitmap); + { + wxASSERT_MSG( wxDynamicCast(image, wxBitmap), + _T("not an icon and not a bitmap?") ); + + const wxBitmap *bitmap = (wxBitmap *)image; + + m_image = new wxBitmap(*bitmap); + } int x, y; int w, h; @@ -160,8 +187,8 @@ void wxStaticBitmap::SetImage(const wxGDIImage& bitmap) if ( ImageIsOk() ) { - int width = bitmap.GetWidth(), - height = bitmap.GetHeight(); + int width = image->GetWidth(), + height = image->GetHeight(); if ( width && height ) { w = width; diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 955b2024e7..591f1d6ab0 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -1956,6 +1956,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) //else: get the dlg code from the DefWindowProc() break; + case WM_SYSKEYDOWN: case WM_KEYDOWN: // If this has been processed by an event handler, // return 0 now (we've handled it). @@ -2024,6 +2025,7 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) } break; + case WM_SYSKEYUP: case WM_KEYUP: processed = HandleKeyUp((WORD) wParam, lParam); break; -- 2.45.2