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:
@@ -60,6 +60,18 @@
|
|||||||
#include "wx/msw/dib.h"
|
#include "wx/msw/dib.h"
|
||||||
#include "wx/app.h" // for GetComCtl32Version
|
#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
|
// constants
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -267,8 +279,32 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos),
|
|||||||
|
|
||||||
bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
|
bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
|
||||||
{
|
{
|
||||||
// normally, we only delete one button, but we use several separators to
|
// the main difficulty we have here is with the controls in the toolbars:
|
||||||
// cover the space used by one control sometimes (with old comctl32.dll)
|
// 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;
|
size_t nButtonsToDelete = 1;
|
||||||
|
|
||||||
// get the size of the button we're going to delete
|
// 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;
|
width *= nButtonsToDelete;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// do delete all buttons
|
||||||
|
m_nButtons -= nButtonsToDelete;
|
||||||
while ( nButtonsToDelete-- > 0 )
|
while ( nButtonsToDelete-- > 0 )
|
||||||
{
|
{
|
||||||
if ( !::SendMessage(GetHwnd(), TB_DELETEBUTTON, pos, 0) )
|
if ( !::SendMessage(GetHwnd(), TB_DELETEBUTTON, pos, 0) )
|
||||||
@@ -299,11 +337,9 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
|
|||||||
|
|
||||||
tool->Detach();
|
tool->Detach();
|
||||||
|
|
||||||
m_nButtons -= nButtonsToDelete;
|
// and finally reposition all the controls after this button (the toolbar
|
||||||
|
// takes care of all normal items)
|
||||||
// reposition all the controls after this button
|
for ( /* node -> first after deleted */ ; node; node = node->GetNext() )
|
||||||
wxToolBarToolsList::Node *node = m_tools.Item(pos);
|
|
||||||
for ( node = node->GetNext(); node; node = node->GetNext() )
|
|
||||||
{
|
{
|
||||||
wxToolBarToolBase *tool2 = node->GetData();
|
wxToolBarToolBase *tool2 = node->GetData();
|
||||||
if ( tool2->IsControl() )
|
if ( tool2->IsControl() )
|
||||||
@@ -339,7 +375,17 @@ bool wxToolBar::Realize()
|
|||||||
int totalBitmapWidth = (int)(m_defaultWidth * nTools);
|
int totalBitmapWidth = (int)(m_defaultWidth * nTools);
|
||||||
int totalBitmapHeight = (int)m_defaultHeight;
|
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(),
|
HBITMAP hBitmap = ::CreateCompatibleBitmap(ScreenHDC(),
|
||||||
totalBitmapWidth,
|
totalBitmapWidth,
|
||||||
totalBitmapHeight);
|
totalBitmapHeight);
|
||||||
@@ -352,11 +398,11 @@ bool wxToolBar::Realize()
|
|||||||
|
|
||||||
m_hBitmap = (WXHBITMAP)hBitmap;
|
m_hBitmap = (WXHBITMAP)hBitmap;
|
||||||
|
|
||||||
// Now blit all the tools onto this bitmap
|
|
||||||
HDC memoryDC = ::CreateCompatibleDC(NULL);
|
HDC memoryDC = ::CreateCompatibleDC(NULL);
|
||||||
HBITMAP oldBitmap = (HBITMAP) ::SelectObject(memoryDC, hBitmap);
|
HBITMAP oldBitmap = (HBITMAP) ::SelectObject(memoryDC, hBitmap);
|
||||||
|
|
||||||
HDC memoryDC2 = ::CreateCompatibleDC(NULL);
|
HDC memoryDC2 = ::CreateCompatibleDC(NULL);
|
||||||
|
#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
|
||||||
|
|
||||||
// the button position
|
// the button position
|
||||||
wxCoord x = 0;
|
wxCoord x = 0;
|
||||||
@@ -370,9 +416,14 @@ bool wxToolBar::Realize()
|
|||||||
wxToolBarToolBase *tool = node->GetData();
|
wxToolBarToolBase *tool = node->GetData();
|
||||||
if ( tool->IsButton() )
|
if ( tool->IsButton() )
|
||||||
{
|
{
|
||||||
HBITMAP hbmp = GetHbitmapOf(tool->GetBitmap1());
|
const wxBitmap& bmp = tool->GetBitmap1();
|
||||||
if ( hbmp )
|
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);
|
HBITMAP oldBitmap2 = (HBITMAP)::SelectObject(memoryDC2, hbmp);
|
||||||
if ( !BitBlt(memoryDC, x, 0, m_defaultWidth, m_defaultHeight,
|
if ( !BitBlt(memoryDC, x, 0, m_defaultWidth, m_defaultHeight,
|
||||||
memoryDC2, 0, 0, SRCCOPY) )
|
memoryDC2, 0, 0, SRCCOPY) )
|
||||||
@@ -381,6 +432,7 @@ bool wxToolBar::Realize()
|
|||||||
}
|
}
|
||||||
|
|
||||||
::SelectObject(memoryDC2, oldBitmap2);
|
::SelectObject(memoryDC2, oldBitmap2);
|
||||||
|
#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -397,9 +449,16 @@ bool wxToolBar::Realize()
|
|||||||
node = node->GetNext();
|
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);
|
::SelectObject(memoryDC, oldBitmap);
|
||||||
::DeleteDC(memoryDC);
|
::DeleteDC(memoryDC);
|
||||||
::DeleteDC(memoryDC2);
|
::DeleteDC(memoryDC2);
|
||||||
|
#endif // USE_BITMAP_MASKS/!USE_BITMAP_MASKS
|
||||||
|
|
||||||
// Map to system colours
|
// Map to system colours
|
||||||
wxMapBitmap(hBitmap, totalBitmapWidth, totalBitmapHeight);
|
wxMapBitmap(hBitmap, totalBitmapWidth, totalBitmapHeight);
|
||||||
|
Reference in New Issue
Block a user