]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/gdiimage.cpp
made mutexes recursive under Unix as well as under Win32
[wxWidgets.git] / src / msw / gdiimage.cpp
index d34a94c64c0bebfad8586acec55ed46d8ffa3c34..63673882ccc769a568341031ba6e90b328b6adac 100644 (file)
@@ -30,6 +30,7 @@
 
 #ifndef WX_PRECOMP
     #include "wx/string.h"
+    #include "wx/log.h"
 #endif // WX_PRECOMP
 
 #include "wx/msw/private.h"
 #include "wx/app.h"
 
 #include "wx/msw/dib.h"
+#include "wx/msw/bitmap.h"
 #include "wx/msw/gdiimage.h"
+#include "wx/bitmap.h"
+
+#if wxUSE_XPM_IN_MSW
+#   include "wx/xpmhand.h"
+#endif // wxUSE_XPM_IN_MSW
 
 #ifdef __WIN16__
-    #include "wx/msw/curico.h"
+#   include "wx/msw/curico.h"
 #endif // __WIN16__
 
 // ----------------------------------------------------------------------------
@@ -295,10 +302,12 @@ void wxGDIImage::InitStandardHandlers()
     AddHandler(new wxBMPResourceHandler);
     AddHandler(new wxBMPFileHandler);
 
-    // Not added by default: include xpmhand.h in your app
-    // and call these in your wxApp::OnInit.
-    //  AddHandler(new wxXPMFileHandler);
-    //  AddHandler(new wxXPMDataHandler);
+    // GRG: Add these handlers by default if XPM support is enabled
+
+#if wxUSE_XPM_IN_MSW
+    AddHandler(new wxXPMFileHandler);
+    AddHandler(new wxXPMDataHandler);
+#endif // wxUSE_XPM_IN_MSW
 
     AddHandler(new wxICOResourceHandler);
     AddHandler(new wxICOFileHandler);
@@ -322,7 +331,7 @@ bool wxBMPResourceHandler::LoadFile(wxBitmap *bitmap,
         BITMAP bm;
         if ( !::GetObject(GetHbitmapOf(*bitmap), sizeof(BITMAP), (LPSTR) &bm) )
         {
-            wxLogLastError("GetObject(HBITMAP)");
+            wxLogLastError(wxT("GetObject(HBITMAP)"));
         }
 
         data->m_width = bm.bmWidth;
@@ -392,7 +401,41 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon,
     wxSize size;
 
 #ifdef __WIN32__
-    HICON hicon = ::ExtractIcon(wxGetInstance(), name, 0 /* first */);
+    HICON hicon = NULL;
+
+    // were we asked for a large icon?
+    if ( desiredWidth == ::GetSystemMetrics(SM_CXICON) &&
+         desiredHeight == ::GetSystemMetrics(SM_CYICON) )
+    {
+        // get the first large icon from file
+        if ( !::ExtractIconEx(name, 0, &hicon, NULL, 1) )
+        {
+            // it is not an error, but it might still be useful to be informed
+            // about it optionally
+            wxLogTrace(_T("iconload"),
+                       _T("No large icons found in the file '%s'."),
+                       name.c_str());
+        }
+    }
+    else if ( desiredWidth == ::GetSystemMetrics(SM_CXSMICON) &&
+              desiredHeight == ::GetSystemMetrics(SM_CYSMICON) )
+    {
+        // get the first small icon from file
+        if ( !::ExtractIconEx(name, 0, NULL, &hicon, 1) )
+        {
+            wxLogTrace(_T("iconload"),
+                       _T("No small icons found in the file '%s'."),
+                       name.c_str());
+        }
+    }
+    //else: not standard size, load below
+
+    if ( !hicon )
+    {
+        // take any (the first one) icon from the file by default
+        hicon = ::ExtractIcon(wxGetInstance(), name, 0 /* first */);
+    }
+
     if ( !hicon )
     {
         wxLogSysError(_T("Failed to load icon from the file '%s'"),
@@ -411,11 +454,10 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon,
     if ( (desiredWidth != -1 && desiredWidth != size.x) ||
          (desiredHeight != -1 && desiredHeight != size.y) )
     {
-        wxLogDebug(_T("Returning FALSE from wxICOFileHandler::Load because "
-                      "of the size mismatch: actual (%d, %d), "
-                      "requested (%d, %d)"),
-                      size.x, size.y,
-                      desiredWidth, desiredHeight);
+        wxLogTrace(_T("iconload"),
+                   _T("Returning FALSE from wxICOFileHandler::Load because of the size mismatch: actual (%d, %d), requested (%d, %d)"),
+                   size.x, size.y,
+                   desiredWidth, desiredHeight);
 
         ::DestroyIcon(hicon);
 
@@ -480,7 +522,7 @@ static wxSize GetHiconSize(HICON hicon)
         ICONINFO info;
         if ( !::GetIconInfo(hicon, &info) )
         {
-            wxLogLastError("GetIconInfo");
+            wxLogLastError(wxT("GetIconInfo"));
         }
         else
         {