]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/tbar95.cpp
Allow to set the various buttons explicitly (and
[wxWidgets.git] / src / msw / tbar95.cpp
index 23c0d42f768f7fb931c1922c84c6a5dd433af0f3..d1079d550c28934adfec34c216e52ef5c2179f76 100644 (file)
 
 #include "wx/app.h"         // for GetComCtl32Version
 
-// ----------------------------------------------------------------------------
-// conditional compilation
-// ----------------------------------------------------------------------------
-
-// wxWidgets previously always considered that toolbar buttons have light grey
-// (0xc0c0c0) background and so ignored any bitmap masks - however, this
-// doesn't work with XPMs which then appear to have black background. To make
-// this work, we must respect the bitmap masks - which we do now. This should
-// be ok in any case, but to restore 100% compatible with the old version
-// behaviour, you can set this to 0.
-#define USE_BITMAP_MASKS 1
-
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
     #define TB_HITTEST              (WM_USER + 69)
 #endif
 
+#ifndef TB_GETMAXSIZE
+    #define TB_GETMAXSIZE           (WM_USER + 83)
+#endif
+
 // these values correspond to those used by comctl32.dll
 #define DEFAULTBITMAPX   16
 #define DEFAULTBITMAPY   15
@@ -350,11 +342,32 @@ wxToolBar::~wxToolBar()
 
 wxSize wxToolBar::DoGetBestSize() const
 {
-    wxSize sizeBest = GetToolSize();
-    sizeBest.x *= GetToolsCount();
+    wxSize sizeBest;
 
-    // reverse horz and vertical components if necessary
-    return HasFlag(wxTB_VERTICAL) ? wxSize(sizeBest.y, sizeBest.x) : sizeBest;
+    SIZE size;
+    if ( !::SendMessage(GetHwnd(), TB_GETMAXSIZE, 0, (LPARAM)&size) )
+    {
+        // maybe an old (< 0x400) Windows version? try to approximate the
+        // toolbar size ourselves
+        sizeBest = GetToolSize();
+        sizeBest.y += 2 * ::GetSystemMetrics(SM_CYBORDER); // Add borders
+        sizeBest.x *= GetToolsCount();
+
+        // reverse horz and vertical components if necessary
+        if ( HasFlag(wxTB_VERTICAL) )
+        {
+            int t = sizeBest.x;
+            sizeBest.x = sizeBest.y;
+            sizeBest.y = t;
+        }
+    }
+    else
+    {
+        sizeBest.x = size.cx;
+        sizeBest.y = size.cy;
+    }
+
+    return sizeBest;
 }
 
 WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const
@@ -553,7 +566,6 @@ bool wxToolBar::Realize()
                       totalBitmapHeight = m_defaultHeight;
 
         // Create a bitmap and copy all the tool bitmaps to it
-#if USE_BITMAP_MASKS
         wxMemoryDC dcAllButtons;
         wxBitmap bitmap(totalBitmapWidth, totalBitmapHeight);
         dcAllButtons.SelectObject(bitmap);
@@ -565,39 +577,17 @@ bool wxToolBar::Realize()
 
         m_hBitmap = bitmap.GetHBITMAP();
         HBITMAP hBitmap = (HBITMAP)m_hBitmap;
-#else // !USE_BITMAP_MASKS
-        HBITMAP hBitmap = ::CreateCompatibleBitmap(ScreenHDC(),
-                                                   totalBitmapWidth,
-                                                   totalBitmapHeight);
-        if ( !hBitmap )
-        {
-            wxLogLastError(_T("CreateCompatibleBitmap"));
-
-            return false;
-        }
-
-        m_hBitmap = (WXHBITMAP)hBitmap;
-
-        MemoryHDC memoryDC;
-        SelectInHDC hdcSelector(memoryDC, hBitmap);
-
-        MemoryHDC memoryDC2;
-#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
 
         if (doRemapBg)
         {
-#if USE_BITMAP_MASKS
             dcAllButtons.SelectObject(wxNullBitmap);
-#endif
 
             // Even if we're not remapping the bitmap
             // content, we still have to remap the background.
             hBitmap = (HBITMAP)MapBitmap((WXHBITMAP) hBitmap,
                 totalBitmapWidth, totalBitmapHeight);
 
-#if USE_BITMAP_MASKS
             dcAllButtons.SelectObject(bitmap);
-#endif
         }
 
         // the button position
@@ -616,19 +606,8 @@ bool wxToolBar::Realize()
                 {
                     int xOffset = wxMax(0, (m_defaultWidth - bmp.GetWidth())/2);
                     int yOffset = wxMax(0, (m_defaultHeight - bmp.GetHeight())/2);
-#if USE_BITMAP_MASKS
                     // notice the last parameter: do use mask
                     dcAllButtons.DrawBitmap(bmp, x+xOffset, yOffset, true);
-#else // !USE_BITMAP_MASKS
-                    SelectInHDC hdcSelector2(memoryDC2, GetHbitmapOf(bmp));
-                    if ( !BitBlt(memoryDC,
-                                 x+xOffset, yOffset,  m_defaultWidth, m_defaultHeight,
-                                 memoryDC2,
-                                 0, 0, SRCCOPY) )
-                    {
-                        wxLogLastError(wxT("BitBlt"));
-                    }
-#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
                 }
                 else
                 {
@@ -643,12 +622,10 @@ bool wxToolBar::Realize()
             }
         }
 
-#if USE_BITMAP_MASKS
         dcAllButtons.SelectObject(wxNullBitmap);
 
         // don't delete this HBITMAP!
         bitmap.SetHBITMAP(0);
-#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
 
         if (doRemap)
         {
@@ -871,7 +848,7 @@ bool wxToolBar::Realize()
             TBBUTTONINFO tbbi;
             tbbi.cbSize = sizeof(tbbi);
             tbbi.dwMask = TBIF_SIZE;
-            tbbi.cx = size.x;
+            tbbi.cx = (WORD)size.x;
             if ( !::SendMessage(GetHwnd(), TB_SETBUTTONINFO,
                                 tool->GetId(), (LPARAM)&tbbi) )
             {