1. fixed deletion of buttons in toolbar with old comctl32.dll

2. XPMs can be used in toolbar buttons


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7027 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-04-01 21:21:22 +00:00
parent 89d645f834
commit 37b592312a

View File

@@ -60,6 +60,18 @@
#include "wx/msw/dib.h"
#include "wx/app.h" // for GetComCtl32Version
// ----------------------------------------------------------------------------
// conditional compilation
// ----------------------------------------------------------------------------
// wxWindows 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
// ----------------------------------------------------------------------------
@@ -267,8 +279,32 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos),
bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
{
// normally, we only delete one button, but we use several separators to
// cover the space used by one control sometimes (with old comctl32.dll)
// the main difficulty we have here is with the controls in the toolbars:
// as we (sometimes) use several separators to cover up the space used by
// them, the indices are not the same for us and the toolbar
// first determine the position of the first button to delete: it may be
// different from pos if we use several separators to cover the space used
// by a control
wxToolBarToolsList::Node *node;
for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
{
wxToolBarToolBase *tool2 = node->GetData();
if ( tool2 == tool )
{
// let node point to the next node in the list
node = node->GetNext();
break;
}
if ( tool2->IsControl() )
{
pos += ((wxToolBarTool *)tool2)->GetSeparatorsCount();
}
}
// now determine the number of buttons to delete and the area taken by them
size_t nButtonsToDelete = 1;
// get the size of the button we're going to delete
@@ -287,6 +323,8 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
width *= nButtonsToDelete;
}
// do delete all buttons
m_nButtons -= nButtonsToDelete;
while ( nButtonsToDelete-- > 0 )
{
if ( !::SendMessage(GetHwnd(), TB_DELETEBUTTON, pos, 0) )
@@ -299,11 +337,9 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
tool->Detach();
m_nButtons -= nButtonsToDelete;
// reposition all the controls after this button
wxToolBarToolsList::Node *node = m_tools.Item(pos);
for ( node = node->GetNext(); node; node = node->GetNext() )
// and finally reposition all the controls after this button (the toolbar
// takes care of all normal items)
for ( /* node -> first after deleted */ ; node; node = node->GetNext() )
{
wxToolBarToolBase *tool2 = node->GetData();
if ( tool2->IsControl() )
@@ -339,7 +375,17 @@ bool wxToolBar::Realize()
int totalBitmapWidth = (int)(m_defaultWidth * nTools);
int totalBitmapHeight = (int)m_defaultHeight;
// Create a bitmap for all the tool bitmaps
// Create a bitmap and copy all the tool bitmaps to it
#if USE_BITMAP_MASKS
wxMemoryDC dcAllButtons;
wxBitmap bitmap(totalBitmapWidth, totalBitmapHeight);
dcAllButtons.SelectObject(bitmap);
dcAllButtons.SetBackground(*wxLIGHT_GREY_BRUSH);
dcAllButtons.Clear();
m_hBitmap = bitmap.GetHBITMAP();
HBITMAP hBitmap = (HBITMAP)m_hBitmap;
#else // !USE_BITMAP_MASKS
HBITMAP hBitmap = ::CreateCompatibleBitmap(ScreenHDC(),
totalBitmapWidth,
totalBitmapHeight);
@@ -352,11 +398,11 @@ bool wxToolBar::Realize()
m_hBitmap = (WXHBITMAP)hBitmap;
// Now blit all the tools onto this bitmap
HDC memoryDC = ::CreateCompatibleDC(NULL);
HBITMAP oldBitmap = (HBITMAP) ::SelectObject(memoryDC, hBitmap);
HDC memoryDC2 = ::CreateCompatibleDC(NULL);
#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
// the button position
wxCoord x = 0;
@@ -370,9 +416,14 @@ bool wxToolBar::Realize()
wxToolBarToolBase *tool = node->GetData();
if ( tool->IsButton() )
{
HBITMAP hbmp = GetHbitmapOf(tool->GetBitmap1());
if ( hbmp )
const wxBitmap& bmp = tool->GetBitmap1();
if ( bmp.Ok() )
{
#if USE_BITMAP_MASKS
// notice the last parameter: do use mask
dcAllButtons.DrawBitmap(tool->GetBitmap1(), x, 0, TRUE);
#else // !USE_BITMAP_MASKS
HBITMAP hbmp = GetHbitmapOf(bmp);
HBITMAP oldBitmap2 = (HBITMAP)::SelectObject(memoryDC2, hbmp);
if ( !BitBlt(memoryDC, x, 0, m_defaultWidth, m_defaultHeight,
memoryDC2, 0, 0, SRCCOPY) )
@@ -381,6 +432,7 @@ bool wxToolBar::Realize()
}
::SelectObject(memoryDC2, oldBitmap2);
#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
}
else
{
@@ -397,9 +449,16 @@ bool wxToolBar::Realize()
node = node->GetNext();
}
#if USE_BITMAP_MASKS
dcAllButtons.SelectObject(wxNullBitmap);
// don't delete this HBITMAP!
bitmap.SetHBITMAP(0);
#else // !USE_BITMAP_MASKS
::SelectObject(memoryDC, oldBitmap);
::DeleteDC(memoryDC);
::DeleteDC(memoryDC2);
#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
// Map to system colours
wxMapBitmap(hBitmap, totalBitmapWidth, totalBitmapHeight);