]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/toplevel.cpp
Add a SetSize to wxSizeEvent
[wxWidgets.git] / src / msw / toplevel.cpp
index dfb7b19ef462f9a12f1edc97b516c295cf9c100c..87508df811e6f6aa4f0d3d6939b6f0223e5d2b9d 100644 (file)
@@ -1051,14 +1051,24 @@ bool wxTopLevelWindowMSW::DoSelectAndSetIcon(const wxIconBundle& icons,
 {
     const wxSize size(::GetSystemMetrics(smX), ::GetSystemMetrics(smY));
 
-    const wxIcon icon = icons.GetIconOfExactSize(size);
-    if ( icon.Ok() )
+    // Try the exact size first.
+    wxIcon icon = icons.GetIconOfExactSize(size);
+
+    if ( !icon.IsOk() )
     {
-        ::SendMessage(GetHwnd(), WM_SETICON, i, (LPARAM)GetHiconOf(icon));
-        return true;
+        // If we didn't find any, set at least some icon: it will look scaled
+        // and ugly but in practice it's impossible to prevent this because not
+        // everyone can provide the icons in all sizes used by all versions of
+        // Windows in all DPIs (this would include creating them in at least
+        // 14, 16, 22, 32, 48, 64 and 128 pixel sizes).
+        icon = icons.GetIcon(size);
     }
 
-    return false;
+    if ( !icon.IsOk() )
+        return false;
+
+    ::SendMessage(GetHwnd(), WM_SETICON, i, (LPARAM)GetHiconOf(icon));
+    return true;
 }
 
 void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons)
@@ -1073,15 +1083,8 @@ void wxTopLevelWindowMSW::SetIcons(const wxIconBundle& icons)
         return;
     }
 
-    bool anySet =
-        DoSelectAndSetIcon(icons, SM_CXSMICON, SM_CYSMICON, ICON_SMALL);
-    if ( DoSelectAndSetIcon(icons, SM_CXICON, SM_CYICON, ICON_BIG) )
-        anySet = true;
-
-    if ( !anySet )
-    {
-        wxFAIL_MSG( "icon bundle doesn't contain any suitable icon" );
-    }
+    DoSelectAndSetIcon(icons, SM_CXSMICON, SM_CYSMICON, ICON_SMALL);
+    DoSelectAndSetIcon(icons, SM_CXICON, SM_CYICON, ICON_BIG);
 }
 
 bool wxTopLevelWindowMSW::EnableCloseButton(bool enable)
@@ -1276,6 +1279,17 @@ bool wxTopLevelWindowMSW::CanSetTransparent()
     return (os_type == wxOS_WINDOWS_NT && ver_major >= 5);
 }
 
+void wxTopLevelWindowMSW::DoEnable(bool enable)
+{
+    wxTopLevelWindowBase::DoEnable(enable);
+
+    // Enabling or disabling a window may change its appearance. Unfortunately,
+    // in at least some situation, toplevel windows don't repaint themselves,
+    // so we have to issue explicit refresh to avoid rendering artifacts.
+    //
+    // TODO: find out just what exactly is wrong here
+    Refresh();
+}
 
 void wxTopLevelWindowMSW::DoFreeze()
 {