1. wxWizard appears in the centre of the screen by default
2. the selected brush isn't damaged any more by DrawBitmap() 3. corrected confusion between current and bg brush in DrawBitmap() 4. added wxGetColourFromUser() (to match wxGetTextFromUser() &c) 5. mem leak/crash in wxListCtrl on mode change fixed 6. wxListCtrl::Set{Fore|Back}groundColour() work as expected now git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5896 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
11f26ea0e2
commit
91b4c08d6f
@ -22,5 +22,9 @@
|
||||
#define sm_classwxColourDialog sm_classwxGenericColourDialog
|
||||
#endif
|
||||
|
||||
// get the colour from user and return it
|
||||
wxColour WXDLLEXPORT wxGetColourFromUser(wxWindow *parent = (wxWindow *)NULL,
|
||||
const wxColour& colInit = wxNullColour);
|
||||
|
||||
#endif
|
||||
// _WX_COLORDLG_H_BASE_
|
||||
|
@ -111,8 +111,8 @@ public:
|
||||
// Attributes
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Sets the background colour (GetBackgroundColour already implicit in
|
||||
// wxWindow class)
|
||||
// Set the control colours
|
||||
bool SetForegroundColour(const wxColour& col);
|
||||
bool SetBackgroundColour(const wxColour& col);
|
||||
|
||||
// Gets information about this column
|
||||
@ -331,8 +331,8 @@ protected:
|
||||
// common part of all ctors
|
||||
void Init();
|
||||
|
||||
// free memory taken by all attributes
|
||||
void FreeAllAttrs();
|
||||
// free memory taken by all attributes and recreate the hash table
|
||||
void FreeAllAttrs(bool dontRecreate = FALSE);
|
||||
|
||||
wxTextCtrl* m_textCtrl; // The control used for editing a label
|
||||
wxImageList * m_imageListNormal; // The image list for normal icons
|
||||
|
@ -59,6 +59,10 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if wxUSE_GUI
|
||||
#include "wx/colordlg.h"
|
||||
#endif // wxUSE_GUI
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#ifndef __MWERKS__
|
||||
@ -908,6 +912,30 @@ wxString wxGetPasswordFromUser(const wxString& message,
|
||||
|
||||
#endif // wxUSE_TEXTDLG
|
||||
|
||||
wxColour wxGetColourFromUser(wxWindow *parent, const wxColour& colInit)
|
||||
{
|
||||
wxColourData data;
|
||||
data.SetChooseFull(TRUE);
|
||||
if ( colInit.Ok() )
|
||||
{
|
||||
data.SetColour((wxColour &)colInit); // const_cast
|
||||
}
|
||||
|
||||
wxColour colRet;
|
||||
wxColourDialog dialog(parent, &data);
|
||||
if ( dialog.ShowModal() == wxID_OK )
|
||||
{
|
||||
colRet = dialog.GetColourData().GetColour();
|
||||
}
|
||||
//else: leave it invalid
|
||||
|
||||
return colRet;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// missing C RTL functions (FIXME shouldn't be here at all)
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#ifdef __MWERKS__
|
||||
char *strdup(const char *s)
|
||||
{
|
||||
|
@ -185,7 +185,7 @@ wxWizard::wxWizard(wxWindow *parent,
|
||||
|
||||
if ( pos == wxDefaultPosition )
|
||||
{
|
||||
Centre();
|
||||
CentreOnScreen();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -657,7 +657,56 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
|
||||
int width = bmp.GetWidth(),
|
||||
height = bmp.GetHeight();
|
||||
|
||||
if ( !useMask )
|
||||
HBITMAP hbmpMask = 0;
|
||||
|
||||
if ( useMask )
|
||||
{
|
||||
wxMask *mask = bmp.GetMask();
|
||||
if ( mask )
|
||||
hbmpMask = (HBITMAP)mask->GetMaskBitmap();
|
||||
|
||||
if ( !hbmpMask )
|
||||
{
|
||||
// don't give assert here because this would break existing
|
||||
// programs - just silently ignore useMask parameter
|
||||
useMask = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if ( useMask )
|
||||
{
|
||||
#ifdef __WIN32__
|
||||
HDC hdcMem = ::CreateCompatibleDC(GetHdc());
|
||||
::SelectObject(hdcMem, GetHbitmapOf(bmp));
|
||||
|
||||
// this will only work if the transparent part of our bitmap is black
|
||||
// because it is combined with the destination rectangle using OR, so
|
||||
// it won't be really transparent otherwise - I don't know what to do
|
||||
// about it, may be use MAKEROP4(SRCCOPY, DSTINVERT) twice? Or create a
|
||||
// copy of the bitmap with the transparent part replaced with black
|
||||
// pixels?
|
||||
bool ok = ::MaskBlt(GetHdc(), x, y, width, height,
|
||||
hdcMem, 0, 0,
|
||||
hbmpMask, 0, 0,
|
||||
MAKEROP4(SRCCOPY, SRCPAINT)) != 0;
|
||||
::DeleteDC(hdcMem);
|
||||
|
||||
if ( !ok )
|
||||
#endif // Win32
|
||||
{
|
||||
// VZ: this is incorrect, Blit() doesn't (and can't) draw
|
||||
// transparently, but it's still better than nothing at all
|
||||
|
||||
// Rather than reproduce wxDC::Blit, let's do it at the wxWin API level
|
||||
wxMemoryDC memDC;
|
||||
memDC.SelectObject(bmp);
|
||||
|
||||
Blit(x, y, width, height, &memDC, 0, 0, wxCOPY, useMask);
|
||||
|
||||
memDC.SelectObject(wxNullBitmap);
|
||||
}
|
||||
}
|
||||
else // no mask, just use BitBlt()
|
||||
{
|
||||
HDC cdc = GetHdc();
|
||||
HDC memdc = ::CreateCompatibleDC( cdc );
|
||||
@ -683,16 +732,6 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
|
||||
::SetTextColor(GetHdc(), old_textground);
|
||||
::SetBkColor(GetHdc(), old_background);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Rather than reproduce wxDC::Blit, let's do it at the wxWin API level
|
||||
wxMemoryDC memDC;
|
||||
memDC.SelectObject(bmp);
|
||||
|
||||
Blit(x, y, width, height, &memDC, 0, 0, wxCOPY, useMask);
|
||||
|
||||
memDC.SelectObject(wxNullBitmap);
|
||||
}
|
||||
}
|
||||
|
||||
void wxDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y)
|
||||
@ -1304,21 +1343,40 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
|
||||
if (useMask)
|
||||
{
|
||||
#ifdef __WIN32__
|
||||
// prepare the mask bitmap
|
||||
HBITMAP hbmpMask = wxInvertMask((HBITMAP)mask->GetMaskBitmap());
|
||||
|
||||
// select the correct brush: the current one by default, background one
|
||||
// if none
|
||||
HBRUSH hbrNew;
|
||||
if ( m_brush.Ok() )
|
||||
{
|
||||
hbrNew = (HBRUSH)m_brush.GetResourceHandle();
|
||||
}
|
||||
else if ( m_backgroundBrush.Ok() )
|
||||
{
|
||||
hbrNew = (HBRUSH)m_backgroundBrush.GetResourceHandle();
|
||||
}
|
||||
else
|
||||
{
|
||||
hbrNew = 0;
|
||||
}
|
||||
|
||||
HGDIOBJ hbrOld = hbrNew ? ::SelectObject(GetHdc(), hbrNew) : 0;
|
||||
|
||||
// we want the part of the image corresponding to the mask to be
|
||||
// transparent, i.e. do PATCOPY there and apply dwRop elsewhere
|
||||
const wxColour& colBg = m_backgroundBrush.GetColour();
|
||||
HBRUSH hbrBg = (HBRUSH)::CreateSolidBrush(wxColourToRGB(colBg));
|
||||
HBRUSH hbrOld = (HBRUSH)::SelectObject(GetHdc(), hbrBg);
|
||||
|
||||
success = ::MaskBlt(GetHdc(), xdest, ydest, width, height,
|
||||
GetHdcOf(*source), xsrc, ysrc,
|
||||
hbmpMask, 0, 0,
|
||||
MAKEROP4(PATCOPY, dwRop)) != 0;
|
||||
|
||||
(void)::SelectObject(GetHdc(), hbrOld);
|
||||
::DeleteObject(hbrOld);
|
||||
if ( hbrNew )
|
||||
{
|
||||
(void)::SelectObject(GetHdc(), hbrOld);
|
||||
}
|
||||
|
||||
::DeleteObject(hbmpMask);
|
||||
|
||||
if ( !success )
|
||||
|
@ -239,7 +239,7 @@ void wxListCtrl::UpdateStyle()
|
||||
}
|
||||
}
|
||||
|
||||
void wxListCtrl::FreeAllAttrs()
|
||||
void wxListCtrl::FreeAllAttrs(bool dontRecreate)
|
||||
{
|
||||
if ( m_hasAnyAttr )
|
||||
{
|
||||
@ -249,6 +249,10 @@ void wxListCtrl::FreeAllAttrs()
|
||||
}
|
||||
|
||||
m_attrs.Destroy();
|
||||
if ( !dontRecreate )
|
||||
{
|
||||
m_attrs.Create(wxKEY_INTEGER, 1000); // just as def ctor
|
||||
}
|
||||
|
||||
m_hasAnyAttr = FALSE;
|
||||
}
|
||||
@ -256,6 +260,8 @@ void wxListCtrl::FreeAllAttrs()
|
||||
|
||||
wxListCtrl::~wxListCtrl()
|
||||
{
|
||||
FreeAllAttrs(TRUE /* no need to recreate hash any more */);
|
||||
|
||||
if ( m_textCtrl )
|
||||
{
|
||||
m_textCtrl->UnsubclassWin();
|
||||
@ -416,14 +422,28 @@ long wxListCtrl::ConvertToMSWStyle(long& oldStyle, long style) const
|
||||
// accessors
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Sets the background colour (GetBackgroundColour already implicit in
|
||||
// wxWindow class)
|
||||
// Sets the foreground, i.e. text, colour
|
||||
bool wxListCtrl::SetForegroundColour(const wxColour& col)
|
||||
{
|
||||
if ( !wxWindow::SetForegroundColour(col) )
|
||||
return FALSE;
|
||||
|
||||
ListView_SetTextColor(GetHwnd(), wxColourToRGB(col));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Sets the background colour
|
||||
bool wxListCtrl::SetBackgroundColour(const wxColour& col)
|
||||
{
|
||||
if ( !wxWindow::SetBackgroundColour(col) )
|
||||
return FALSE;
|
||||
|
||||
ListView_SetBkColor(GetHwnd(), PALETTERGB(col.Red(), col.Green(), col.Blue()));
|
||||
// we set the same colour for both the "empty" background and the items
|
||||
// background
|
||||
COLORREF color = wxColourToRGB(col);
|
||||
ListView_SetBkColor(GetHwnd(), color);
|
||||
ListView_SetTextBkColor(GetHwnd(), color);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user