X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/566fb29935da8c9728dc8aa9a9441ddf15df65b1..8b3fddc49326c0b6019cd7082218726aa17a5727:/src/msw/tbar95.cpp diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index 749aa2bd52..b734360d7b 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -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 @@ -94,9 +95,11 @@ #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,10 +256,8 @@ 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; - - SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR)); + SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); // position it int x = pos.x; @@ -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; - 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,22 +1132,22 @@ 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 1 + 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++ ) { - if ( pixel == 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; } } @@ -1213,7 +1155,12 @@ WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height) } return bitmap; -#else // 1 + + // 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 ) { @@ -1268,7 +1215,7 @@ WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height) ::DeleteObject((HBITMAP)bitmap); return (WXHBITMAP)hbmpDst; -#endif // 0/1 +#endif // 0 } #endif // wxUSE_TOOLBAR && Win95