]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/tbar95.cpp
DMC warning fix.
[wxWidgets.git] / src / msw / tbar95.cpp
index 43a159862d3ec6056a17495b95586ea694cdda34..16ccaa00b37a7d1979821f058d46092feaea8cde 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        msw/tbar95.cpp
+// Name:        src/msw/tbar95.cpp
 // Purpose:     wxToolBar
 // Author:      Julian Smart
 // Modified by:
     #pragma hdrstop
 #endif
 
+#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && !defined(__SMARTPHONE__)
+
 #ifndef WX_PRECOMP
+    #include "wx/dynarray.h"
     #include "wx/frame.h"
     #include "wx/log.h"
     #include "wx/intl.h"
-    #include "wx/dynarray.h"
     #include "wx/settings.h"
     #include "wx/bitmap.h"
     #include "wx/dcmemory.h"
     #include "wx/control.h"
+    #include "wx/app.h"         // for GetComCtl32Version
 #endif
 
-#if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE && !defined(__SMARTPHONE__)
-
 #include "wx/toolbar.h"
 #include "wx/sysopt.h"
 #include "wx/image.h"
 // include <commctrl.h> "properly"
 #include "wx/msw/wrapcctl.h"
 
-#include "wx/app.h"         // for GetComCtl32Version
+// this define controls whether the code for button colours remapping (only
+// useful for 16 or 256 colour images) is active at all, it's always turned off
+// for CE where it doesn't compile (and is probably not needed anyhow) and may
+// also be turned off for other systems if you always use 24bpp images and so
+// never need it
+#ifndef __WXWINCE__
+    #define wxREMAP_BUTTON_COLOURS
+#endif // !__WXWINCE__
 
 // ----------------------------------------------------------------------------
 // constants
@@ -455,6 +463,7 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
     {
         nButtonsToDelete = ((wxToolBarTool *)tool)->GetSeparatorsCount();
         width *= nButtonsToDelete;
+        tool->GetControl()->Destroy();
     }
 
     // do delete all buttons
@@ -534,22 +543,27 @@ bool wxToolBar::Realize()
 
     const bool isVertical = HasFlag(wxTB_VERTICAL);
 
-    bool doRemap, doRemapBg, doTransparent;
-    doRemapBg = doRemap = doTransparent = false;
-
-#ifndef __WXWINCE__
-    int remapValue = (-1);
-    const wxChar *remapOptionStr = wxT("msw.remap");
-    if (wxSystemOptions::HasOption( remapOptionStr ))
-        remapValue = wxSystemOptions::GetOptionInt( remapOptionStr );
-
-    doTransparent = (remapValue == 2);
-    if (!doTransparent)
+#ifdef wxREMAP_BUTTON_COLOURS
+    // don't change the values of these constants, they can be set from the
+    // user code via wxSystemOptions
+    enum
     {
-        doRemap = (remapValue != 0);
-        doRemapBg = !doRemap;
-    }
-#endif
+        Remap_None = -1,
+        Remap_Bg,
+        Remap_Buttons,
+        Remap_TransparentBg
+    };
+
+    // the user-specified option overrides anything, but if it wasn't set, only
+    // remap the buttons on 8bpp displays as otherwise the bitmaps usually look
+    // much worse after remapping
+    static const wxChar *remapOption = wxT("msw.remap");
+    const int remapValue = wxSystemOptions::HasOption(remapOption)
+                                ? wxSystemOptions::GetOptionInt(remapOption)
+                                : wxDisplayDepth() <= 8 ? Remap_Buttons
+                                                        : Remap_None;
+
+#endif // wxREMAP_BUTTON_COLOURS
 
     // delete all old buttons, if any
     for ( size_t pos = 0; pos < m_nButtons; pos++ )
@@ -591,21 +605,26 @@ bool wxToolBar::Realize()
         wxBitmap bitmap(totalBitmapWidth, totalBitmapHeight);
         dcAllButtons.SelectObject(bitmap);
 
-#ifndef __WXWINCE__
-        if (doTransparent)
-            dcAllButtons.SetBackground(*wxTRANSPARENT_BRUSH);
-        else
-            dcAllButtons.SetBackground(wxBrush(GetBackgroundColour()));
-#else
-        dcAllButtons.SetBackground(wxBrush(wxColour(192,192,192)));
-#endif
-        dcAllButtons.Clear();
+#ifdef wxREMAP_BUTTON_COLOURS
+        if ( remapValue != Remap_TransparentBg )
+#endif // wxREMAP_BUTTON_COLOURS
+        {
+            // VZ: why do we hardcode grey colour for CE?
+            dcAllButtons.SetBackground(wxBrush(
+#ifdef __WXWINCE__
+                                        wxColour(0xc0, 0xc0, 0xc0)
+#else // !__WXWINCE__
+                                        GetBackgroundColour()
+#endif // __WXWINCE__/!__WXWINCE__
+                                       ));
+            dcAllButtons.Clear();
+        }
 
         m_hBitmap = bitmap.GetHBITMAP();
         HBITMAP hBitmap = (HBITMAP)m_hBitmap;
 
-#ifndef __WXWINCE__
-        if (doRemapBg)
+#ifdef wxREMAP_BUTTON_COLOURS
+        if ( remapValue == Remap_Bg )
         {
             dcAllButtons.SelectObject(wxNullBitmap);
 
@@ -616,7 +635,7 @@ bool wxToolBar::Realize()
 
             dcAllButtons.SelectObject(bitmap);
         }
-#endif // !__WXWINCE__
+#endif // wxREMAP_BUTTON_COLOURS
 
         // the button position
         wxCoord x = 0;
@@ -661,7 +680,8 @@ bool wxToolBar::Realize()
                         wxImage imgGreyed;
                         wxCreateGreyedImage(bmp.ConvertToImage(), imgGreyed);
 
-                        if (doRemap)
+#ifdef wxREMAP_BUTTON_COLOURS
+                        if ( remapValue == Remap_Buttons )
                         {
                             // we need to have light grey background colour for
                             // MapBitmap() to work correctly
@@ -677,13 +697,16 @@ bool wxToolBar::Realize()
                                 }
                             }
                         }
+#endif // wxREMAP_BUTTON_COLOURS
 
                         bmpDisabled = wxBitmap(imgGreyed);
                     }
 #endif // wxUSE_IMAGE
 
-                    if (doRemap)
+#ifdef wxREMAP_BUTTON_COLOURS
+                    if ( remapValue == Remap_Buttons )
                         MapBitmap(bmpDisabled.GetHBITMAP(), w, h);
+#endif // wxREMAP_BUTTON_COLOURS
 
                     m_disabledImgList->Add(bmpDisabled);
                 }
@@ -701,12 +724,14 @@ bool wxToolBar::Realize()
         // don't delete this HBITMAP!
         bitmap.SetHBITMAP(0);
 
-        if (doRemap)
+#ifdef wxREMAP_BUTTON_COLOURS
+        if ( remapValue == Remap_Buttons )
         {
             // Map to system colours
             hBitmap = (HBITMAP)MapBitmap((WXHBITMAP) hBitmap,
-                totalBitmapWidth, totalBitmapHeight);
+                                         totalBitmapWidth, totalBitmapHeight);
         }
+#endif // wxREMAP_BUTTON_COLOURS
 
         bool addBitmap = true;
 
@@ -1226,7 +1251,10 @@ wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
 
 void wxToolBar::UpdateSize()
 {
+    wxPoint pos = GetPosition();
     ::SendMessage(GetHwnd(), TB_AUTOSIZE, 0, 0);
+    if (pos != GetPosition())
+        Move(pos);
 
     // In case Realize is called after the initial display (IOW the programmer
     // may have rebuilt the toolbar) give the frame the option of resizing the
@@ -1579,6 +1607,8 @@ WXLRESULT wxToolBar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam
 // private functions
 // ----------------------------------------------------------------------------
 
+#ifdef wxREMAP_BUTTON_COLOURS
+
 WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height)
 {
     MemoryHDC hdcMem;
@@ -1614,7 +1644,8 @@ WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height)
                      abs(GetGValue(pixel) - GetGValue(col)) < 10 &&
                      abs(GetBValue(pixel) - GetBValue(col)) < 10 )
                 {
-                    ::SetPixel(hdcMem, i, j, cmap[k].to);
+                    if ( cmap[k].to != pixel )
+                        ::SetPixel(hdcMem, i, j, cmap[k].to);
                     break;
                 }
             }
@@ -1622,68 +1653,8 @@ WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height)
     }
 
     return bitmap;
-
-    // VZ: I leave here my attempts to map the bitmap to the system colours
-    //     faster by using BitBlt() even though it's broken currently - but
-    //     maybe someone else can finish it? It should be faster than iterating
-    //     over all pixels...
-#if 0
-    MemoryHDC hdcMask, hdcDst;
-    if ( !hdcMask || !hdcDst )
-    {
-        wxLogLastError(_T("CreateCompatibleDC"));
-
-        return bitmap;
-    }
-
-    // create the target bitmap
-    HBITMAP hbmpDst = ::CreateCompatibleBitmap(hdcDst, width, height);
-    if ( !hbmpDst )
-    {
-        wxLogLastError(_T("CreateCompatibleBitmap"));
-
-        return bitmap;
-    }
-
-    // create the monochrome mask bitmap
-    HBITMAP hbmpMask = ::CreateBitmap(width, height, 1, 1, 0);
-    if ( !hbmpMask )
-    {
-        wxLogLastError(_T("CreateBitmap(mono)"));
-
-        ::DeleteObject(hbmpDst);
-
-        return bitmap;
-    }
-
-    SelectInHDC bmpInDst(hdcDst, hbmpDst),
-                bmpInMask(hdcMask, hbmpMask);
-
-    // for each colour:
-    for ( n = 0; n < NUM_OF_MAPPED_COLOURS; n++ )
-    {
-        // create the mask for this colour
-        ::SetBkColor(hdcMem, ColorMap[n].from);
-        ::BitBlt(hdcMask, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY);
-
-        // replace this colour with the target one in the dst bitmap
-        HBRUSH hbr = ::CreateSolidBrush(ColorMap[n].to);
-        HGDIOBJ hbrOld = ::SelectObject(hdcDst, hbr);
-
-        ::MaskBlt(hdcDst, 0, 0, width, height,
-                  hdcMem, 0, 0,
-                  hbmpMask, 0, 0,
-                  MAKEROP4(PATCOPY, SRCCOPY));
-
-        (void)::SelectObject(hdcDst, hbrOld);
-        ::DeleteObject(hbr);
-    }
-
-    ::DeleteObject((HBITMAP)bitmap);
-
-    return (WXHBITMAP)hbmpDst;
-#endif // 0
 }
 
-#endif // wxUSE_TOOLBAR
+#endif // wxREMAP_BUTTON_COLOURS
 
+#endif // wxUSE_TOOLBAR