]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/tbar95.cpp
ignore clicks on a toolbar but outside any button
[wxWidgets.git] / src / msw / tbar95.cpp
index 025fc91265df255608eaa8b218d503087f466508..b734360d7b227b901375f8a03667d24cd42dff6b 100644 (file)
@@ -36,6 +36,7 @@
     #include "wx/settings.h"
     #include "wx/bitmap.h"
     #include "wx/dcmemory.h"
+    #include "wx/control.h"
 #endif
 
 #if wxUSE_TOOLBAR && defined(__WIN95__) && wxUSE_TOOLBAR_NATIVE
 #ifndef TBSTYLE_FLAT
     #define TBSTYLE_LIST            0x1000
     #define TBSTYLE_FLAT            0x0800
+#endif
+
+#ifndef TBSTYLE_TRANSPARENT
     #define TBSTYLE_TRANSPARENT     0x8000
 #endif
- // use TBSTYLE_TRANSPARENT if you use TBSTYLE_FLAT
 
 // Messages
 #ifndef TB_GETSTYLE
@@ -232,8 +235,17 @@ bool wxToolBar::Create(wxWindow *parent,
 
     if (style & wxTB_FLAT)
     {
-        if (wxTheApp->GetComCtl32Version() > 400)
-            msflags |= TBSTYLE_FLAT;
+        // static as it doesn't change during the program lifetime
+        static int s_verComCtl = wxTheApp->GetComCtl32Version();
+
+        // comctl32.dll 4.00 doesn't support the flat toolbars and using this
+        // style with 6.00 (part of Windows XP) leads to the toolbar with
+        // incorrect background colour - and not using it still results in the
+        // correct (flat) toolbar, so don't use it there
+        if ( s_verComCtl > 400 && s_verComCtl < 600 )
+        {
+            msflags |= TBSTYLE_FLAT | TBSTYLE_TRANSPARENT;
+        }
     }
 
     // MSW-specific initialisation
@@ -244,9 +256,7 @@ bool wxToolBar::Create(wxWindow *parent,
     ::SendMessage(GetHwnd(), TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
 
     // set up the colors and fonts
-    wxRGBToColour(m_backgroundColour, GetSysColor(COLOR_BTNFACE));
-    m_foregroundColour = *wxBLACK;
-
+    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR));
     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
 
     // position it
@@ -438,12 +448,12 @@ bool wxToolBar::Realize()
         wxToolBarToolBase *tool = node->GetData();
         if ( tool->IsButton() )
         {
-            const wxBitmap& bmp = tool->GetBitmap1();
+            const wxBitmap& bmp = tool->GetNormalBitmap();
             if ( bmp.Ok() )
             {
 #if USE_BITMAP_MASKS
                 // notice the last parameter: do use mask
-                dcAllButtons.DrawBitmap(tool->GetBitmap1(), x, 0, TRUE);
+                dcAllButtons.DrawBitmap(bmp, x, 0, TRUE);
 #else // !USE_BITMAP_MASKS
                 HBITMAP hbmp = GetHbitmapOf(bmp);
                 HBITMAP oldBitmap2 = (HBITMAP)::SelectObject(memoryDC2, hbmp);
@@ -1104,74 +1114,6 @@ long wxToolBar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 
 WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height)
 {
-    // number of the colours we map: if you change this, update
-    // wxBITMAP_STD_COLOURS in the resources as well: it must have the same number
-    // of pixels
-    static const size_t NUM_OF_MAPPED_COLOURS = 4;
-
-    static bool s_coloursInit = FALSE;
-    static long s_stdColours[NUM_OF_MAPPED_COLOURS];
-
-    if (!s_coloursInit)
-    {
-        // When a bitmap is loaded, the RGB values can change (apparently
-        // because Windows adjusts them to care for the old programs always
-        // using 0xc0c0c0 while the transparent colour for the new Windows
-        // versions is different). But we do this adjustment ourselves so we
-        // want to avoid Windows' "help" and for this we need to have a
-        // reference bitmap which can tell us what the RGB values change to.
-        wxBitmap stdColourBitmap(_T("wxBITMAP_STD_COLOURS"));
-        if (stdColourBitmap.Ok())
-        {
-            wxMemoryDC memDC;
-            memDC.SelectObject(stdColourBitmap);
-
-            wxColour colour;
-            for ( size_t i = 0; i < WXSIZEOF(s_stdColours); i++ )
-            {
-                memDC.GetPixel(i, 0, &colour);
-                s_stdColours[i] = wxColourToRGB(colour);
-            }
-        }
-        else
-        {
-            s_stdColours[0] = RGB(000,000,000) ;
-            s_stdColours[1] = RGB(128,128,128) ;
-            s_stdColours[2] = RGB(192,192,192) ;
-            s_stdColours[3] = RGB(255,255,255) ;
-            //s_stdColours[4] = RGB(000,000,255) ;
-            //s_stdColours[5] = RGB(255,000,255) ;
-        }
-
-        s_coloursInit = TRUE;
-    }
-
-    COLORMAP ColorMap[NUM_OF_MAPPED_COLOURS];
-
-    // black        (0, 0 0)
-    ColorMap[0].from = s_stdColours[0];
-    ColorMap[0].to = COLOR_BTNTEXT;
-    // dark grey    (128, 128, 128)
-    ColorMap[1].from = s_stdColours[1];
-    ColorMap[1].to = COLOR_BTNSHADOW;
-    // bright grey  (192, 192, 192)
-    ColorMap[2].from = s_stdColours[2];
-    ColorMap[2].to = COLOR_BTNFACE;
-    // white        (255, 255, 255)
-    ColorMap[3].from = s_stdColours[3];
-    ColorMap[3].to = COLOR_BTNHIGHLIGHT;
-    // blue         (0, 0, 255)
-    //  ColorMap[4].from = s_stdColours[4];
-    //  ColorMap[4].to = COLOR_HIGHLIGHT;
-    // magenta      (255, 0, 255)
-    //  ColorMap[4].from = s_stdColours[5];
-    //  ColorMap[4].to = COLOR_WINDOW;
-
-    for ( size_t n = 0; n < WXSIZEOF(ColorMap); n++ )
-    {
-        ColorMap[n].to = ::GetSysColor(ColorMap[n].to);
-    }
-
     MemoryHDC hdcMem;
 
     if ( !hdcMem )
@@ -1190,20 +1132,22 @@ WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height)
         return bitmap;
     }
 
+    wxCOLORMAP *cmap = wxGetStdColourMap();
+
     for ( int i = 0; i < width; i++ )
     {
         for ( int j = 0; j < height; j++ )
         {
             COLORREF pixel = ::GetPixel(hdcMem, i, j);
 
-            for ( size_t k = 0; k < WXSIZEOF(ColorMap); k++ )
+            for ( size_t k = 0; k < wxSTD_COL_MAX; k++ )
             {
-                COLORREF col = ColorMap[k].from;
+                COLORREF col = cmap[k].from;
                 if ( abs(GetRValue(pixel) - GetRValue(col)) < 10 &&
                      abs(GetGValue(pixel) - GetGValue(col)) < 10 &&
                      abs(GetBValue(pixel) - GetBValue(col)) < 10 )
                 {
-                    ::SetPixel(hdcMem, i, j, ColorMap[k].to);
+                    ::SetPixel(hdcMem, i, j, cmap[k].to);
                     break;
                 }
             }