]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/gdiimage.cpp
wxControl and wxDialog coded and supporting module def file.
[wxWidgets.git] / src / msw / gdiimage.cpp
index d8015b11e36e0d96f8047ea193c39b162add81fa..63673882ccc769a568341031ba6e90b328b6adac 100644 (file)
 
 #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"
 
-#include "wx/msw/private.h"
+#if wxUSE_XPM_IN_MSW
+#   include "wx/xpmhand.h"
+#endif // wxUSE_XPM_IN_MSW
+
+#ifdef __WIN16__
+#   include "wx/msw/curico.h"
+#endif // __WIN16__
 
 // ----------------------------------------------------------------------------
 // private classes
@@ -163,12 +174,10 @@ private:
 // wxWin macros
 // ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARIES
     IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler)
     IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
     IMPLEMENT_DYNAMIC_CLASS(wxICOFileHandler, wxGDIImageHandler)
     IMPLEMENT_DYNAMIC_CLASS(wxICOResourceHandler, wxGDIImageHandler)
-#endif
 
 // ----------------------------------------------------------------------------
 // private functions
@@ -293,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);
@@ -320,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;
@@ -390,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'"),
@@ -409,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);
 
@@ -478,7 +522,7 @@ static wxSize GetHiconSize(HICON hicon)
         ICONINFO info;
         if ( !::GetIconInfo(hicon, &info) )
         {
-            wxLogLastError("GetIconInfo");
+            wxLogLastError(wxT("GetIconInfo"));
         }
         else
         {