]> git.saurik.com Git - wxWidgets.git/commitdiff
1. wxWizard appears in the centre of the screen by default
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 8 Feb 2000 01:08:51 +0000 (01:08 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 8 Feb 2000 01:08:51 +0000 (01:08 +0000)
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

include/wx/colordlg.h
include/wx/msw/listctrl.h
src/common/utilscmn.cpp
src/generic/wizard.cpp
src/msw/dc.cpp
src/msw/listctrl.cpp

index 4f322491404907a7ca9e0856390f9a2a2daafc9b..984ce43dc84f43764a4f7b2b8db647b7f84b28f6 100644 (file)
@@ -22,5 +22,9 @@
 #define sm_classwxColourDialog sm_classwxGenericColourDialog
 #endif
 
 #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_
 #endif
     // _WX_COLORDLG_H_BASE_
index 106c8572489c94dc2c13e3e461fa9944b99009fe..81378145cbb5e47a48423fa0b9a09d070518bd1d 100644 (file)
@@ -111,8 +111,8 @@ public:
     // Attributes
     ////////////////////////////////////////////////////////////////////////////
 
     // 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
     bool SetBackgroundColour(const wxColour& col);
 
     // Gets information about this column
@@ -331,8 +331,8 @@ protected:
     // common part of all ctors
     void Init();
 
     // 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
 
     wxTextCtrl*       m_textCtrl;        // The control used for editing a label
     wxImageList *     m_imageListNormal; // The image list for normal icons
index 9af79de3296495dc1990c7d8bfc6467896988ebd..5a685ccc754f50eb7f42318c072f493ea31c96ed 100644 (file)
     #endif
 #endif
 
     #endif
 #endif
 
+#if wxUSE_GUI
+    #include "wx/colordlg.h"
+#endif // wxUSE_GUI
+
 #include <time.h>
 
 #ifndef __MWERKS__
 #include <time.h>
 
 #ifndef __MWERKS__
@@ -908,6 +912,30 @@ wxString wxGetPasswordFromUser(const wxString& message,
 
 #endif // wxUSE_TEXTDLG
 
 
 #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)
 {
 #ifdef __MWERKS__
 char *strdup(const char *s)
 {
index 34ef1e74952d6915c3b9cdca9364721e45155376..fdd9dc7a8ccbca1d4a4336f3fc0d10edd6d54b0c 100644 (file)
@@ -185,7 +185,7 @@ wxWizard::wxWizard(wxWindow *parent,
 
     if ( pos == wxDefaultPosition )
     {
 
     if ( pos == wxDefaultPosition )
     {
-        Centre();
+        CentreOnScreen();
     }
 }
 
     }
 }
 
index 3c1d51c5081cac7334ad07967af0eeb4c043df9c..c720b36fa35d304be3ed4af3cd9bafa4e24680db 100644 (file)
@@ -657,7 +657,56 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
     int width = bmp.GetWidth(),
         height = bmp.GetHeight();
 
     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 );
     {
         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);
     }
         ::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)
 }
 
 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__
     if (useMask)
     {
 #ifdef __WIN32__
+        // prepare the mask bitmap
         HBITMAP hbmpMask = wxInvertMask((HBITMAP)mask->GetMaskBitmap());
 
         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
         // 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;
 
 
         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 )
         ::DeleteObject(hbmpMask);
 
         if ( !success )
index 029cbe1b31741f8045743210029172cb61abf0ef..f38207bed6ecbe520be77703f31222ea49f019c5 100644 (file)
@@ -239,7 +239,7 @@ void wxListCtrl::UpdateStyle()
     }
 }
 
     }
 }
 
-void wxListCtrl::FreeAllAttrs()
+void wxListCtrl::FreeAllAttrs(bool dontRecreate)
 {
     if ( m_hasAnyAttr )
     {
 {
     if ( m_hasAnyAttr )
     {
@@ -249,6 +249,10 @@ void wxListCtrl::FreeAllAttrs()
         }
 
         m_attrs.Destroy();
         }
 
         m_attrs.Destroy();
+        if ( !dontRecreate )
+        {
+            m_attrs.Create(wxKEY_INTEGER, 1000);        // just as def ctor
+        }
 
         m_hasAnyAttr = FALSE;
     }
 
         m_hasAnyAttr = FALSE;
     }
@@ -256,6 +260,8 @@ void wxListCtrl::FreeAllAttrs()
 
 wxListCtrl::~wxListCtrl()
 {
 
 wxListCtrl::~wxListCtrl()
 {
+    FreeAllAttrs(TRUE /* no need to recreate hash any more */);
+
     if ( m_textCtrl )
     {
         m_textCtrl->UnsubclassWin();
     if ( m_textCtrl )
     {
         m_textCtrl->UnsubclassWin();
@@ -416,14 +422,28 @@ long wxListCtrl::ConvertToMSWStyle(long& oldStyle, long style) const
 // accessors
 // ----------------------------------------------------------------------------
 
 // 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;
 
 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;
 }
 
     return TRUE;
 }