]> git.saurik.com Git - wxWidgets.git/commitdiff
1. wxMDIParentFrame::~wxMDIParentFrame() bug fixed
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 25 Nov 1999 23:28:41 +0000 (23:28 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 25 Nov 1999 23:28:41 +0000 (23:28 +0000)
2. tooltips work with wxRadioBox
3. duplicated OnCtlColor()s moved to wxControl

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4693 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

29 files changed:
Makefile.in
docs/changes.txt
include/wx/msw/button.h
include/wx/msw/checkbox.h
include/wx/msw/control.h
include/wx/msw/listbox.h
include/wx/msw/radiobox.h
include/wx/msw/radiobut.h
include/wx/msw/statbox.h
include/wx/msw/stattext.h
include/wx/msw/textctrl.h
include/wx/msw/tooltip.h
samples/checklst/checklst.cpp
samples/controls/controls.cpp
samples/image/image.cpp
src/msw/button.cpp
src/msw/checkbox.cpp
src/msw/control.cpp
src/msw/listbox.cpp
src/msw/mdi.cpp
src/msw/radiobox.cpp
src/msw/radiobut.cpp
src/msw/slider95.cpp
src/msw/slidrmsw.cpp
src/msw/statbox.cpp
src/msw/stattext.cpp
src/msw/textctrl.cpp
src/msw/tooltip.cpp
src/msw/window.cpp

index e69d24a979934d1fbcfe642bb1da8a67886d69b7..50a848d8e3225eddba749637418c83eae01f19ea 100644 (file)
@@ -1,5 +1,5 @@
 #
-# This file was automatically generated by tmake at 20:10, 1999/11/21
+# This file was automatically generated by tmake at 13:22, 1999/11/24
 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T!
 
 #
@@ -514,6 +514,7 @@ MSW_HEADERS = \
                msw/gauge.h \
                msw/gauge95.h \
                msw/gaugemsw.h \
+               msw/gdiimage.h \
                msw/gdiobj.h \
                msw/helpwin.h \
                msw/icon.h \
@@ -1657,6 +1658,7 @@ MSW_GUIOBJS = \
                fontutil.o \
                frame.o \
                gauge95.o \
+               gdiimage.o \
                gdiobj.o \
                gsocket.o \
                helpwin.o \
@@ -1746,6 +1748,7 @@ MSW_GUIDEPS = \
                fontutil.d \
                frame.d \
                gauge95.d \
+               gdiimage.d \
                gdiobj.d \
                gsocket.d \
                helpwin.d \
index 79e3fb59373d539d4e58d9b549849a754bb7939a..d1aaacd3fec56fadd068361e9fcc305daf6ca3f4 100644 (file)
@@ -16,6 +16,8 @@ all:
 
 wxMSW:
 
+- tooltips work with wxRadioBox
+
 - arbitrary controls (and not only buttons) can be put into a toolbar
 
 wxGTK:
index fa828361edce6246fc59f72561461b9ebbaeb990..8af354a03ad60779215e3d9205cafbe6af315f46 100644 (file)
@@ -55,12 +55,6 @@ public:
     virtual void Command(wxCommandEvent& event);
     virtual long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
     virtual bool MSWCommand(WXUINT param, WXWORD id);
-    virtual WXHBRUSH OnCtlColor(WXHDC pDC,
-                                WXHWND pWnd,
-                                WXUINT nCtlColor,
-                                WXUINT message,
-                                WXWPARAM wParam,
-                                WXLPARAM lParam);
 
 protected:
     // send a notification event, return TRUE if processed
index eb7f87b0a273c37e38f4e953c98a79a0ab2b9ba2..2dc291ebb97d71fae7bf990db9d1ce8bbe75f78c 100644 (file)
@@ -49,8 +49,6 @@ public:
     virtual bool MSWCommand(WXUINT param, WXWORD id);
     virtual void SetLabel(const wxString& label);
     virtual void Command(wxCommandEvent& event);
-    virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-            WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
 
 protected:
     virtual wxSize DoGetBestSize() const;
index 430aa7cfdb657bd080c3f1bac2f3707d062eff4d..f597ccf02a06429ec210e9844c6a528986bb72b5 100644 (file)
@@ -43,10 +43,13 @@ public:
    virtual bool MSWOnDraw(WXDRAWITEMSTRUCT *WXUNUSED(item)) { return FALSE; };
    virtual bool MSWOnMeasure(WXMEASUREITEMSTRUCT *WXUNUSED(item)) { return FALSE; };
 
-   wxList& GetSubcontrols() { return m_subControls; }
+   wxArrayLong GetSubcontrols() { return m_subControls; }
 
    void OnEraseBackground(wxEraseEvent& event);
 
+   virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
+                               WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
+
 #if WXWIN_COMPATIBILITY
    virtual void SetButtonColour(const wxColour& WXUNUSED(col)) { }
    wxColour* GetButtonColour() const { return NULL; }
@@ -66,8 +69,9 @@ protected:
 #endif // WXWIN_COMPATIBILITY
 
 protected:
-   // For controls like radiobuttons which are really composite
-   wxList m_subControls;
+   // for controls like radiobuttons which are really composite this array
+   // holds the ids (not HWNDs!) of the sub controls
+   wxArrayLong m_subControls;
 
    virtual wxSize DoGetBestSize() const;
 
index 1dbd35f32bd047e4c464cf0d8aba4e267746c08e..7f7f1b679c3133b2b6a08344584b2469db6c88ed 100644 (file)
@@ -108,10 +108,6 @@ public:
     virtual void SetHorizontalExtent(const wxString& s = wxEmptyString);
 
     // Windows callbacks
-    virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                                WXUINT message,
-                                WXWPARAM wParam, WXLPARAM lParam);
-
     bool MSWCommand(WXUINT param, WXWORD id);
 
     virtual void SetupColours();
index b867313031f4495a9fda60be38572c9c1ca96902..6ae78e6b9d59327c57b2adb38006636cb019a368 100644 (file)
@@ -47,8 +47,6 @@ public:
             const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr);
 
     virtual bool MSWCommand(WXUINT param, WXWORD id);
-    virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                                WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
 
     int FindString(const wxString& s) const;
     void SetSelection(int N);
index 35cb5dc292edabc100ccf9b917802d00b11a2b4e..f5bb924c9160b8981aba245f9133def6240e24b6 100644 (file)
@@ -49,8 +49,6 @@ class WXDLLEXPORT wxRadioButton: public wxControl
 
   bool MSWCommand(WXUINT param, WXWORD id);
   void Command(wxCommandEvent& event);
-  virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                       WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
 };
 
 // Not implemented
index 734392f53b0e3c722babe70ccc4ba8bf483445be..54ad5e352e29c3e2ffc42c15cbea5e9cd83e810d 100644 (file)
@@ -50,9 +50,6 @@ public:
 
     virtual long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
 
-    virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                                WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
-
     // overriden base class virtuals
     virtual bool AcceptsFocus() const { return FALSE; }
 
index f2ab5e5f7408cf9de9df074ffe4fb17a8dfe6383..fd0f63d801d9057a7b49d562b78719e4e824d3ce 100644 (file)
@@ -51,8 +51,6 @@ public:
     virtual bool AcceptsFocus() const { return FALSE; }
 
     // callbacks
-    virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                                WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
     virtual long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
 
 protected:
index 4290b207c95ae299a97f8899f5ac0740f3cedced..184655a8d5ea6a8f224c26f6fbbf86d04c8e9e64 100644 (file)
@@ -128,10 +128,6 @@ public:
     void SetRichEdit(bool isRich) { m_isRich = isRich; }
 #endif // wxUSE_RICHEDIT
 
-    virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                                WXUINT message, WXWPARAM wParam,
-                                WXLPARAM lParam);
-
     virtual void AdoptAttributesFromHWND();
     virtual void SetupColours();
 
index d4a29c4f9cd4d5e394d99b4323e9f193583a5403..135e87116e987fb769d2e802904872ad0b023a24 100644 (file)
@@ -35,14 +35,17 @@ public:
     void RelayEvent(WXMSG *msg);
 
 private:
-    static WXHWND hwndTT;
-    // create the tooltip ctrl for our parent frame if it doesn't exist yet
-    // and return its window handle
+    static WXHWND ms_hwndTT;
+
+    // create the tooltip ctrl if it doesn't exist yet and return its HWND
     WXHWND GetToolTipCtrl();
 
     // remove this tooltip from the tooltip control
     void Remove();
 
+    // add a window to the tooltip control
+    void Add(WXHWND hwnd);
+
     wxString  m_text;           // tooltip text
     wxWindow *m_window;         // window we're associated with
 };
index fdefc46f6ce38985fbe7126d06aea805f04ec6ad..039e1402265600f41a636b377de44245fbf74cd5 100644 (file)
@@ -62,6 +62,8 @@ public:
 private:
     void OnButtonMove(bool up);
 
+    void AdjustColour(size_t index);
+
     wxCheckListBox *m_pListBox;
 
     DECLARE_EVENT_TABLE()
@@ -157,13 +159,10 @@ CheckListBoxFrame::CheckListBoxFrame(wxFrame *frame,
 
     delete [] astrChoices;
 
-    // not implemented in other ports yet
-#ifdef __WXMSW__
     // set grey background for every second entry
     for ( ui = 0; ui < WXSIZEOF(aszChoices); ui += 2 ) {
-        m_pListBox->GetItem(ui)->SetBackgroundColour(wxColor(200, 200, 200));
+        AdjustColour(ui);
     }
-#endif // wxGTK
 
     m_pListBox->Check(2);
 
@@ -252,7 +251,7 @@ void CheckListBoxFrame::OnButtonMove(bool up)
         wxString label = m_pListBox->GetString(selection);
 
         int positionNew = up ? selection - 1 : selection + 2;
-        if ( positionNew < 0 || positionNew > m_pListBox->Number() )
+        if ( positionNew < 0 || positionNew > m_pListBox->GetCount() )
         {
             wxLogStatus(this, _T("Can't move this item %s"), up ? _T("up") : _T("down"));
         }
@@ -272,6 +271,9 @@ void CheckListBoxFrame::OnButtonMove(bool up)
             m_pListBox->Check(selectionNew, wasChecked);
             m_pListBox->SetSelection(selectionNew);
 
+            AdjustColour(selection);
+            AdjustColour(selectionNew);
+
             wxLogStatus(this, _T("Item moved %s"), up ? _T("up") : _T("down"));
         }
     }
@@ -280,3 +282,13 @@ void CheckListBoxFrame::OnButtonMove(bool up)
         wxLogStatus(this, _T("Please select an item"));
     }
 }
+
+void CheckListBoxFrame::AdjustColour(size_t index)
+{
+    // not implemented in other ports yet
+#ifdef __WXMSW__
+    // even items have grey backround, odd ones - white
+    unsigned char c = index % 2 ? 255 : 200;
+    m_pListBox->GetItem(index)->SetBackgroundColour(wxColor(c, c, c));
+#endif // wxMSW
+}
index a7c43c9165c1ac5e2439b1625e27a0abf73283c5..9bfc350010d6786172e8655c048d4c736466400f 100644 (file)
 
 #include "wx/progdlg.h"
 
-// VZ: this is a temp. hack, will remove soon
-#ifndef wxUSE_SPINCTRL
-#define wxUSE_SPINCTRL 1
-#endif
-
 #if wxUSE_SPINCTRL
     #include "wx/spinctrl.h"
 #endif // wxUSE_SPINCTRL
@@ -167,6 +162,8 @@ public:
     void OnSize( wxSizeEvent& event );
     void OnMove( wxMoveEvent& event );
 
+    MyPanel *GetPanel() const { return m_panel; }
+
 private:
     void UpdateStatusBar(const wxPoint& pos, const wxSize& size)
     {
@@ -176,7 +173,7 @@ private:
         SetStatusText(msg, 1);
     }
 
-    wxPanel *m_panel;
+    MyPanel *m_panel;
 
     DECLARE_EVENT_TABLE()
 };
@@ -259,6 +256,8 @@ bool MyApp::OnInit()
     frame->Show(TRUE);
     frame->SetCursor(wxCursor(wxCURSOR_HAND));
 
+    frame->GetPanel()->m_notebook->SetSelection(3);
+
     SetTopWindow(frame);
 
     return TRUE;
@@ -504,7 +503,9 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice);
 
     panel = new wxPanel(m_notebook);
-    m_combo = new wxComboBox( panel, ID_COMBO, "This", wxPoint(10,10), wxSize(120,-1), 5, choices, wxCB_READONLY );
+    (void)new wxStaticBox( panel, -1, "Box around combobox",
+                           wxPoint(5, 5), wxSize(150, 100));
+    m_combo = new wxComboBox( panel, ID_COMBO, "This", wxPoint(20,20), wxSize(120,-1), 5, choices, wxCB_READONLY );
     (void)new wxButton( panel, ID_COMBO_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
     (void)new wxButton( panel, ID_COMBO_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
     (void)new wxButton( panel, ID_COMBO_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
@@ -525,6 +526,11 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     panel = new wxPanel(m_notebook);
     (void)new wxRadioBox( panel, ID_RADIOBOX, "That", wxPoint(10,160), wxSize(-1,-1), WXSIZEOF(choices2), choices2, 1, wxRA_SPECIFY_ROWS );
     m_radio = new wxRadioBox( panel, ID_RADIOBOX, "This", wxPoint(10,10), wxSize(-1,-1), WXSIZEOF(choices), choices, 1, wxRA_SPECIFY_COLS );
+
+#if wxUSE_TOOLTIPS
+    m_radio->SetToolTip("Ever seen a radiobox?");
+#endif // wxUSE_TOOLTIPS
+
     (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
     (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, "Select 'This'", wxPoint(180,80), wxSize(140,30) );
     m_fontButton = new wxButton( panel, ID_SET_FONT, "Set more Italic font", wxPoint(340,30), wxSize(140,30) );
@@ -584,7 +590,8 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
 
 #ifndef __WXMOTIF__  // wxStaticBitmap not working under Motif yet. MB
     wxIcon icon = wxTheApp->GetStdIcon(wxICON_INFORMATION);
-    wxStaticBitmap *bmpStatic = new wxStaticBitmap(panel, -1, icon, wxPoint(10, 10));
+    wxStaticBitmap *bmpStatic = new wxStaticBitmap(panel, -1, icon,
+                                                   wxPoint(10, 10));
 
     bmpStatic = new wxStaticBitmap(panel, -1, wxNullIcon, wxPoint(50, 10));
     bmpStatic->SetIcon(wxTheApp->GetStdIcon(wxICON_QUESTION));
@@ -594,11 +601,25 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     wxMemoryDC dc;
     dc.SelectObject( bitmap );
     dc.SetPen(*wxGREEN_PEN);
+    dc.Clear();
     dc.DrawEllipse(5, 5, 90, 90);
-    dc.DrawText("Bitmap", 20, 20);
+    dc.DrawText("Bitmap", 30, 40);
     dc.SelectObject( wxNullBitmap );
 
     (void)new wxBitmapButton(panel, -1, bitmap, wxPoint(100, 20));
+
+    wxBitmap bmp1(wxTheApp->GetStdIcon(wxICON_INFORMATION)),
+             bmp2(wxTheApp->GetStdIcon(wxICON_WARNING)),
+             bmp3(wxTheApp->GetStdIcon(wxICON_QUESTION));
+    wxBitmapButton *bmpBtn = new wxBitmapButton
+                                 (
+                                  panel, -1,
+                                  bmp1,
+                                  wxPoint(30, 50)
+                                 );
+    bmpBtn->SetBitmapSelected(bmp2);
+    bmpBtn->SetBitmapFocus(bmp3);
+
     (void)new wxButton(panel, ID_BUTTON_LABEL, "Toggle label", wxPoint(250, 20));
     m_label = new wxStaticText(panel, -1, "Label with some long text",
                                wxPoint(250, 60), wxDefaultSize,
index 687a1e1f22c31b733855ac5d67b92b3d88c5f9d8..48f873d72acf7476de798b532809215d840eb156 100644 (file)
@@ -121,15 +121,15 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id,
       wxLogWarning("Can't find image files in either '.' or '..'!");
 
   wxImage image( bitmap );
-  
+
   if ( !image.SaveFile( dir + wxString("test.png"), wxBITMAP_TYPE_PNG ) )
       wxLogError("Can't save file");
-  
+
   if ( !image.LoadFile( dir + wxString("horse.png"), wxBITMAP_TYPE_PNG ) )
       wxLogError("Can't load PNG image");
   else
     my_horse_png = new wxBitmap( image.ConvertToBitmap() );
-  
+
   if ( !image.LoadFile( dir + wxString("horse.jpg") ) )
       wxLogError("Can't load JPG image");
   else
@@ -160,10 +160,10 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id,
   else
     my_horse_pnm = new wxBitmap( image.ConvertToBitmap() );
 #endif
-  
+
   image.LoadFile( dir + wxString("test.png") );
   my_square = new wxBitmap( image.ConvertToBitmap() );
-  
+
   CreateAntiAliasedBitmap();
 }
 
@@ -186,20 +186,20 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
 
   dc.DrawText( "Loaded image", 30, 10 );
   if (my_square && my_square->Ok()) dc.DrawBitmap( *my_square, 30, 30 );
-  
+
   dc.DrawText( "Drawn directly", 150, 10 );
   dc.SetBrush( wxBrush( "orange", wxSOLID ) );
   dc.SetPen( *wxWHITE_PEN );
   dc.DrawRectangle( 150, 30, 100, 100 );
 
   if (my_anti && my_anti->Ok()) dc.DrawBitmap( *my_anti, 250, 140 );
-  
+
   dc.DrawText( "PNG handler", 30, 135 );
   if (my_horse_png && my_horse_png->Ok()) dc.DrawBitmap( *my_horse_png, 30, 150 );
-  
+
   dc.DrawText( "JPEG handler", 30, 365 );
   if (my_horse_jpeg && my_horse_jpeg->Ok()) dc.DrawBitmap( *my_horse_jpeg, 30, 380 );
-  
+
   dc.DrawText( "GIF handler", 30, 595 );
   if (my_horse_gif && my_horse_gif->Ok()) dc.DrawBitmap( *my_horse_gif, 30, 610 );
 
@@ -222,41 +222,41 @@ void MyCanvas::CreateAntiAliasedBitmap()
   dc.SelectObject( bitmap );
 
   dc.Clear();
-  
+
   dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL) );
   dc.SetTextForeground( "RED" );
   dc.DrawText( "This is anti-aliased Text.", 20, 20 );
   dc.DrawText( "And a Rectangle.", 20, 60 );
-  
+
   dc.SetBrush( *wxRED_BRUSH );
   dc.SetPen( *wxTRANSPARENT_PEN );
   dc.DrawRoundedRectangle( 20, 100, 200, 180, 20 );
-  
+
   wxImage original( bitmap );
   wxImage anti( 150, 150 );
 
   /* This is quite slow, but safe. Use wxImage::GetData() for speed instead. */
-  
+
   for (int y = 1; y < 149; y++)
     for (int x = 1; x < 149; x++)
     {
        int red = original.GetRed( x*2, y*2 ) +
-                 original.GetRed( x*2-1, y*2 ) + 
-                 original.GetRed( x*2, y*2+1 ) + 
+                 original.GetRed( x*2-1, y*2 ) +
+                 original.GetRed( x*2, y*2+1 ) +
                  original.GetRed( x*2+1, y*2+1 );
-       red = red/4; 
-       
+       red = red/4;
+
        int green = original.GetGreen( x*2, y*2 ) +
-                   original.GetGreen( x*2-1, y*2 ) + 
-                   original.GetGreen( x*2, y*2+1 ) + 
+                   original.GetGreen( x*2-1, y*2 ) +
+                   original.GetGreen( x*2, y*2+1 ) +
                    original.GetGreen( x*2+1, y*2+1 );
-       green = green/4; 
-       
+       green = green/4;
+
        int blue = original.GetBlue( x*2, y*2 ) +
-                  original.GetBlue( x*2-1, y*2 ) + 
-                  original.GetBlue( x*2, y*2+1 ) + 
+                  original.GetBlue( x*2-1, y*2 ) +
+                  original.GetBlue( x*2, y*2+1 ) +
                   original.GetBlue( x*2+1, y*2+1 );
-       blue = blue/4; 
+       blue = blue/4;
        anti.SetRGB( x, y, red, green, blue );
     }
   my_anti = new wxBitmap( anti.ConvertToBitmap() );
index 4e113f40a17bfce8d2eb83a38fd1048bc67d112f..490c1154e420892c82a2305f3185aaa59cfc701a 100644 (file)
@@ -242,29 +242,6 @@ bool wxButton::MSWCommand(WXUINT param, WXWORD id)
     return processed;
 }
 
-WXHBRUSH wxButton::OnCtlColor(WXHDC pDC,
-                              WXHWND pWnd,
-                              WXUINT nCtlColor,
-                              WXUINT message,
-                              WXWPARAM wParam,
-                              WXLPARAM lParam)
-{
-    const HDC& hdc = (HDC)pDC;
-
-    const wxColour& colBack = GetBackgroundColour();
-    ::SetBkColor(hdc, RGB(colBack.Red(), colBack.Green(), colBack.Blue()));
-
-    const wxColour& colFor = GetForegroundColour();
-    ::SetTextColor(hdc, RGB(colFor.Red(), colFor.Green(), colFor.Blue()));
-
-    ::SetBkMode(hdc, OPAQUE);
-
-    wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(colBack,
-                                                                 wxSOLID);
-    backgroundBrush->RealizeResource();
-    return (WXHBRUSH)backgroundBrush->GetResourceHandle();
-}
-
 long wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 {
     // make sure that we won't have BS_DEFPUSHBUTTON style any more if the
index 8b7ba211b9daee599683972d6f9f217045999adc..63458de14b5bb947ae13e4140c9926f5e752fa22 100644 (file)
@@ -179,34 +179,6 @@ bool wxCheckBox::GetValue() const
 #endif
 }
 
-WXHBRUSH wxCheckBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                                WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
-#if wxUSE_CTL3D
-  if ( m_useCtl3D )
-  {
-    HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-
-      return (WXHBRUSH) hbrush;
-  }
-#endif
-
-  if (GetParent()->GetTransparentBackground())
-    SetBkMode((HDC) pDC, TRANSPARENT);
-  else
-    SetBkMode((HDC) pDC, OPAQUE);
-
-  ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-  ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-  wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-
-  // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
-  // has a zero usage count.
-//  backgroundBrush->RealizeResource();
-  return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-}
-
 void wxCheckBox::Command (wxCommandEvent & event)
 {
   SetValue ((event.GetInt() != 0));
index d45fa4d01ff06fee19789e420d0ba0bfd46aaec0..75130e2547da2e1b3c13af714bdb420f2f864ba3 100644 (file)
@@ -208,6 +208,34 @@ void wxControl::OnEraseBackground(wxEraseEvent& event)
     ::SetMapMode(hdc, mode);
 }
 
+WXHBRUSH wxControl::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
+                               WXUINT message,
+                               WXWPARAM wParam,
+                               WXLPARAM lParam)
+{
+#if wxUSE_CTL3D
+    if ( m_useCtl3D )
+    {
+        HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
+        return (WXHBRUSH) hbrush;
+    }
+#endif // wxUSE_CTL3D
+
+    HDC hdc = (HDC)pDC;
+    if (GetParent()->GetTransparentBackground())
+        SetBkMode(hdc, TRANSPARENT);
+    else
+        SetBkMode(hdc, OPAQUE);
+
+    const wxColour& colBack = GetBackgroundColour();
+    ::SetBkColor(hdc, wxColourToRGB(colBack));
+    ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour()));
+
+    wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBack, wxSOLID);
+
+    return (WXHBRUSH)brush->GetResourceHandle();
+}
+
 WXDWORD wxControl::GetExStyle(WXDWORD& style, bool *want3D) const
 {
     WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, want3D);
index 93c6f176896511782aabc64a77d582a6c2b30919..1f51b5ded8cbf42a39c415844dbf235c441c9487 100644 (file)
@@ -696,33 +696,6 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
     return FALSE;
 }
 
-WXHBRUSH wxListBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                               WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
-#if wxUSE_CTL3D
-    if ( m_useCtl3D )
-    {
-        HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-        return (WXHBRUSH) hbrush;
-    }
-#endif
-
-    if (GetParent()->GetTransparentBackground())
-        SetBkMode((HDC) pDC, TRANSPARENT);
-    else
-        SetBkMode((HDC) pDC, OPAQUE);
-
-    ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-    ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-    wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-
-    // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
-    // has a zero usage count.
-    backgroundBrush->RealizeResource();
-    return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-}
-
 // ----------------------------------------------------------------------------
 // wxCheckListBox support
 // ----------------------------------------------------------------------------
index fe708c0538acae5731ee83ecbc7fb583a52b249f..f91d0a6cb364de385d96a88fa4395e3721650929 100644 (file)
@@ -213,6 +213,9 @@ wxMDIParentFrame::~wxMDIParentFrame()
 {
     DestroyChildren();
 
+    // already delete by DestroyChildren()
+    m_frameToolBar = NULL;
+
     ::DestroyMenu((HMENU)m_windowMenu);
     m_windowMenu = 0;
 
index 48666d0859b1fad52bd2f2710c453bf677279be7..d33f534cf228e1de8a6d8e3cc53a21ea1ad8a5cd 100644 (file)
@@ -29,8 +29,6 @@
 #endif
 
 #ifndef WX_PRECOMP
-    #include <stdio.h>
-    #include "wx/setup.h"
     #include "wx/bitmap.h"
     #include "wx/brush.h"
     #include "wx/radiobox.h"
 
 #include "wx/msw/private.h"
 
+#if wxUSE_TOOLTIPS
+    #include <commctrl.h>
+
+    #include "wx/tooltip.h"
+#endif // wxUSE_TOOLTIPS
+
 #if !USE_SHARED_LIBRARY
     IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl)
 #endif
 
+// VZ: the new behaviour is to create the radio buttons as children of the
+//     radiobox instead of creating them as children of the radiobox' parent.
+//
+//     This seems more logical, more consistent with what other frameworks do
+//     and allows tooltips to work with radioboxes, so there should be no
+//     reason to revert to the backward compatible behaviour - but I still
+//     leave this possibility just in case.
+#define RADIOBTN_PARENT_IS_RADIOBOX 1
+
 // ---------------------------------------------------------------------------
 // private functions
 // ---------------------------------------------------------------------------
@@ -154,116 +167,101 @@ wxRadioBox::wxRadioBox()
     m_radioHeight = NULL;
 }
 
-bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title,
-        const wxPoint& pos, const wxSize& size,
-        int n, const wxString choices[],
-        int majorDim, long style,
-        const wxValidator& val, const wxString& name)
+bool wxRadioBox::Create(wxWindow *parent,
+                        wxWindowID id,
+                        const wxString& title,
+                        const wxPoint& pos,
+                        const wxSize& size,
+                        int n,
+                        const wxString choices[],
+                        int majorDim,
+                        long style,
+                        const wxValidator& val,
+                        const wxString& name)
 {
+    // initialize members
     m_selectedButton = -1;
     m_noItems = n;
 
-    SetName(name);
-    SetValidator(val);
-
-    parent->AddChild(this);
-    m_backgroundColour = parent->GetBackgroundColour();
-    m_foregroundColour = parent->GetForegroundColour();
-
-    m_windowStyle = (long&)style;
-
-    int x = pos.x;
-    int y = pos.y;
-    int width = size.x;
-    int height = size.y;
-
-    if (id == -1)
-        m_windowId = NewControlId();
-    else
-        m_windowId = id;
-
-    if ( majorDim == 0 )
-        m_majorDim = n;
-    else
-        m_majorDim = majorDim;
+    m_majorDim =  majorDim == 0 ? n : majorDim;
     m_noRowsOrCols = majorDim;
 
-    long msStyle = GROUP_FLAGS;
-
-    bool want3D;
-    WXDWORD exStyle = Determine3DEffects(0, &want3D);
-
-    HWND hwndParent = (HWND)parent->GetHWND();
-
-    m_hWnd = (WXHWND)::CreateWindowEx
-                        (
-                         (DWORD)exStyle,
-                         GROUP_CLASS,
-                         title,
-                         msStyle,
-                         0, 0, 0, 0,
-                         hwndParent,
-                         (HMENU)m_windowId,
-                         wxGetInstance(),
-                         NULL
-                        );
-
-#if wxUSE_CTL3D
-    if (want3D)
-    {
-        Ctl3dSubclassCtl((HWND)m_hWnd);
-        m_useCtl3D = TRUE;
-    }
-#endif // wxUSE_CTL3D
+    // common initialization
+    if ( !CreateControl(parent, id, pos, size, style, val, name) )
+        return FALSE;
 
-    SetFont(parent->GetFont());
+    // create the static box
+    if ( !MSWCreateControl(wxT("BUTTON"), BS_GROUPBOX, pos, size, title, 0) )
+        return FALSE;
 
-    SubclassWin(m_hWnd);
+    // and now create the buttons
+#if RADIOBTN_PARENT_IS_RADIOBOX
+    HWND hwndParent = GetHwnd();
+#else
+    HWND hwndParent = GetHwndOf(parent);
+#endif
 
     // Some radio boxes test consecutive id.
     (void)NewControlId();
     m_radioButtons = new WXHWND[n];
     m_radioWidth = new int[n];
     m_radioHeight = new int[n];
-    int i;
-    for (i = 0; i < n; i++)
+
+    WXHFONT hfont = 0;
+    wxFont& font = GetFont();
+    if ( font.Ok() )
     {
-        m_radioWidth[i] = m_radioHeight[i] = -1;
-        long groupStyle = 0;
+        hfont = font.GetResourceHandle();
+    }
+
+    for ( int i = 0; i < n; i++ )
+    {
+        m_radioWidth[i] =
+        m_radioHeight[i] = -1;
+        long styleBtn = BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE;
         if ( i == 0 && style == 0 )
-            groupStyle = WS_GROUP;
+            styleBtn |= WS_GROUP;
+
         long newId = NewControlId();
-        long msStyle = groupStyle | RADIO_FLAGS;
 
-        HWND hwndBtn = CreateWindowEx(exStyle, RADIO_CLASS,
-                                      choices[i], msStyle,
-                                      0,0,0,0,
+        HWND hwndBtn = ::CreateWindow(_T("BUTTON"),
+                                      choices[i],
+                                      styleBtn,
+                                      0, 0, 0, 0,   // will be set in SetSize()
                                       hwndParent,
-                                      (HMENU)newId, wxGetInstance(),
+                                      (HMENU)newId,
+                                      wxGetInstance(),
                                       NULL);
 
+        if ( !hwndBtn )
+        {
+            wxLogLastError("CreateWindow(radio btn)");
+
+            return FALSE;
+        }
+
         m_radioButtons[i] = (WXHWND)hwndBtn;
 
         SubclassRadioButton((WXHWND)hwndBtn);
 
-        wxFont& font = GetFont();
-        if ( font.Ok() )
+        if ( hfont )
         {
-            SendMessage(hwndBtn, WM_SETFONT,
-                        (WPARAM)font.GetResourceHandle(), 0L);
+            ::SendMessage(hwndBtn, WM_SETFONT, (WPARAM)hfont, 0L);
         }
 
-        m_subControls.Append((wxObject *)(WXDWORD)(WXWORD)newId);
+        m_subControls.Add(newId);
     }
 
     // Create a dummy radio control to end the group.
-    (void)CreateWindowEx(0, RADIO_CLASS, wxT(""), WS_GROUP | RADIO_FLAGS,
+    (void)::CreateWindow(_T("BUTTON"),
+                         _T(""),
+                         WS_GROUP | BS_AUTORADIOBUTTON | WS_CHILD,
                          0, 0, 0, 0, hwndParent,
                          (HMENU)NewControlId(), wxGetInstance(), NULL);
 
     SetSelection(0);
 
-    SetSize(x, y, width, height);
+    SetSize(pos.x, pos.y, size.x, size.y);
 
     return TRUE;
 }
@@ -364,10 +362,14 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
     if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
         yy = currentY;
 
-    wxString buf;
-
+#if RADIOBTN_PARENT_IS_RADIOBOX
+    int y_offset = 0;
+    int x_offset = 0;
+#else
     int y_offset = yy;
     int x_offset = xx;
+#endif
+
     int current_width, cyf;
 
     int cx1,cy1;
@@ -386,8 +388,8 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
         if (m_radioWidth[i]<0)
         {
             // It's a labelled toggle
-            buf = wxGetWindowText(m_radioButtons[i]);
-            GetTextExtent(buf, &current_width, &cyf);
+            GetTextExtent(wxGetWindowText(m_radioButtons[i]),
+                          &current_width, &cyf);
             eachWidth = (int)(current_width + RADIO_SIZE);
             eachHeight = (int)((3*cyf)/2);
         }
@@ -409,7 +411,7 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
         int totHeight;
 
         int nbHor = GetNumHor(),
-        nbVer = GetNumVer();
+            nbVer = GetNumVer();
 
         // this formula works, but I don't know why.
         // Please, be sure what you do if you modify it!!
@@ -444,7 +446,7 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
                 height = heightOld;
         }
 
-        MoveWindow(GetHwnd(), x_offset, y_offset, width, height, TRUE);
+        ::MoveWindow(GetHwnd(), xx, yy, width, height, TRUE);
 
         x_offset += cx1;
         y_offset += cy1;
@@ -480,8 +482,8 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
         if (m_radioWidth[i]<0)
         {
             // It's a labeled item
-            buf = wxGetWindowText(m_radioButtons[i]);
-            GetTextExtent(buf, &current_width, &cyf);
+            GetTextExtent(wxGetWindowText(m_radioButtons[i]),
+                          &current_width, &cyf);
 
             // How do we find out radio button bitmap size!!
             // By adjusting them carefully, manually :-)
@@ -494,9 +496,13 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
             eachHeight = m_radioHeight[i];
         }
 
-        MoveWindow((HWND)m_radioButtons[i], x_offset, y_offset,
-                   eachWidth, eachHeight,
-                   TRUE);
+        // VZ: make all buttons of the same, maximal size - like this they
+        //     cover the radiobox entirely and the radiobox tooltips are always
+        //     shown (otherwise they are not when the mouse pointer is in the
+        //     radiobox part not belonging to any radiobutton)
+        ::MoveWindow((HWND)m_radioButtons[i],
+                     x_offset, y_offset, maxWidth, maxHeight,
+                     TRUE);
 
         if (m_windowStyle & wxRA_SPECIFY_ROWS)
         {
@@ -528,8 +534,7 @@ void wxRadioBox::GetSize(int *width, int *height) const
 void wxRadioBox::GetPosition(int *x, int *y) const
 {
     wxWindow *parent = GetParent();
-    RECT rect;
-    rect.left = -1; rect.right = -1; rect.top = -1; rect.bottom = -1;
+    RECT rect = { -1, -1, -1, -1 };
 
     int i;
     for (i = 0; i < m_noItems; i++)
@@ -538,8 +543,8 @@ void wxRadioBox::GetPosition(int *x, int *y) const
     if (m_hWnd)
         wxFindMaxSize(m_hWnd, &rect);
 
-    // Since we now have the absolute screen coords,
-    // if there's a parent we must subtract its top left corner
+    // Since we now have the absolute screen coords, if there's a parent we
+    // must subtract its top left corner
     POINT point;
     point.x = rect.left;
     point.y = rect.top;
@@ -547,9 +552,9 @@ void wxRadioBox::GetPosition(int *x, int *y) const
     {
         ::ScreenToClient((HWND) parent->GetHWND(), &point);
     }
-    // We may be faking the client origin.
-    // So a window that's really at (0, 30) may appear
-    // (to wxWin apps) to be at (0, 0).
+
+    // We may be faking the client origin. So a window that's really at (0, 30)
+    // may appear (to wxWin apps) to be at (0, 0).
     if (GetParent())
     {
         wxPoint pt(GetParent()->GetClientAreaOrigin());
@@ -617,30 +622,6 @@ void wxRadioBox::Show(int item, bool show)
     ::ShowWindow((HWND)m_radioButtons[item], show ? SW_SHOW : SW_HIDE);
 }
 
-WXHBRUSH wxRadioBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-        WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
-#if wxUSE_CTL3D
-    if ( m_useCtl3D )
-    {
-        HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-        return (WXHBRUSH) hbrush;
-    }
-#endif
-
-    if (GetParent()->GetTransparentBackground())
-        SetBkMode((HDC) pDC, TRANSPARENT);
-    else
-        SetBkMode((HDC) pDC, OPAQUE);
-
-    ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-    ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-    wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-
-    return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-}
-
 // For single selection items only
 wxString wxRadioBox::GetStringSelection() const
 {
@@ -716,68 +697,91 @@ LRESULT APIENTRY _EXPORT wxRadioBtnWndProc(HWND hwnd,
                                            WPARAM wParam,
                                            LPARAM lParam)
 {
-    bool processed = TRUE;
-    if ( msg != WM_KEYDOWN )
-        processed = FALSE;
-
-    if ( processed )
+    bool processed = FALSE;
+    if ( msg == WM_KEYDOWN
+#if wxUSE_TOOLTIPS
+         || msg == WM_NOTIFY
+#endif // wxUSE_TOOLTIPS
+       )
     {
         wxRadioBox *radiobox = (wxRadioBox *)::GetWindowLong(hwnd, GWL_USERDATA);
 
         wxCHECK_MSG( radiobox, 0, wxT("radio button without radio box?") );
 
-        int sel = radiobox->GetSelection();
-
-        switch ( wParam )
+#if wxUSE_TOOLTIPS
+        if ( msg == WM_NOTIFY )
         {
-            case VK_UP:
-                sel--;
-                break;
-
-            case VK_LEFT:
-                sel -= radiobox->GetNumVer();
-                break;
-
-            case VK_DOWN:
-                sel++;
-                break;
-
-            case VK_RIGHT:
-                sel += radiobox->GetNumVer();
-                break;
-
-            case VK_TAB:
+            NMHDR* hdr = (NMHDR *)lParam;
+            if ( (int)hdr->code == TTN_NEEDTEXT )
+            {
+                wxToolTip *tt = radiobox->GetToolTip();
+                if ( tt )
                 {
-                    wxNavigationKeyEvent event;
-                    event.SetDirection(!(::GetKeyState(VK_SHIFT) & 0x100));
-                    event.SetWindowChange(FALSE);
-                    event.SetEventObject(radiobox);
+                    TOOLTIPTEXT *ttt = (TOOLTIPTEXT *)lParam;
+                    ttt->lpszText = (wxChar *)tt->GetTip().c_str();
 
-                    if ( radiobox->GetEventHandler()->ProcessEvent(event) )
-                        return 0;
+                    processed = TRUE;
                 }
-                // fall through
-
-            default:
-                processed = FALSE;
+            }
         }
-
-        if ( processed )
+        else // msg == WM_KEYDOWN
+#endif // wxUSE_TOOLTIPS
         {
-            if ( sel >= 0 && sel < radiobox->Number() )
+            processed = TRUE;
+
+            int sel = radiobox->GetSelection();
+
+            switch ( wParam )
             {
-                radiobox->SetSelection(sel);
+                case VK_UP:
+                    sel--;
+                    break;
+
+                case VK_LEFT:
+                    sel -= radiobox->GetNumVer();
+                    break;
+
+                case VK_DOWN:
+                    sel++;
+                    break;
+
+                case VK_RIGHT:
+                    sel += radiobox->GetNumVer();
+                    break;
+
+                case VK_TAB:
+                    {
+                        wxNavigationKeyEvent event;
+                        event.SetDirection(!(::GetKeyState(VK_SHIFT) & 0x100));
+                        event.SetWindowChange(FALSE);
+                        event.SetEventObject(radiobox);
+
+                        if ( radiobox->GetEventHandler()->ProcessEvent(event) )
+                            return 0;
+                    }
+                    // fall through
+
+                default:
+                    processed = FALSE;
+            }
+
+            if ( processed )
+            {
+                if ( sel >= 0 && sel < radiobox->Number() )
+                {
+                    radiobox->SetSelection(sel);
 
-                // emulate the button click
-                radiobox->SendNotificationEvent();
+                    // emulate the button click
+                    radiobox->SendNotificationEvent();
+                }
             }
         }
     }
 
-    if ( !processed )
-        return ::CallWindowProc(CASTWNDPROC s_wndprocRadioBtn, hwnd, msg, wParam, lParam);
-    else
+    if ( processed )
         return 0;
+
+    return ::CallWindowProc(CASTWNDPROC s_wndprocRadioBtn, hwnd, msg, wParam, lParam);
 }
 
 #endif // __WIN32__
index 2995d492286dd84876a45e29793ba9d92f27f1c2..d63f27cc79aa4e7fe43c689b05049254785f15d2 100644 (file)
@@ -157,33 +157,6 @@ bool wxRadioButton::GetValue(void) const
   return (SendMessage((HWND) GetHWND(), BM_GETCHECK, 0, 0L) != 0);
 }
 
-WXHBRUSH wxRadioButton::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-      WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
-#if wxUSE_CTL3D
-  if ( m_useCtl3D )
-  {
-    HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-    return (WXHBRUSH) hbrush;
-  }
-#endif
-
-  if (GetParent()->GetTransparentBackground())
-    SetBkMode((HDC) pDC, TRANSPARENT);
-  else
-    SetBkMode((HDC) pDC, OPAQUE);
-
-  ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-  ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-  wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-
-  // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
-  // has a zero usage count.
-//  backgroundBrush->RealizeResource();
-  return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-}
-
 void wxRadioButton::Command (wxCommandEvent & event)
 {
   SetValue ( (event.m_commandInt != 0) );
index da73283d1c786fccc0462833731ef3e913894353..56abc963b7c43e6f7a549e011267b290339fa9d2 100644 (file)
@@ -531,16 +531,7 @@ WXHBRUSH wxSlider95::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
     return 0;
 
   // Otherwise, it's a static
-  if (GetParent()->GetTransparentBackground())
-    SetBkMode((HDC) pDC, TRANSPARENT);
-  else
-    SetBkMode((HDC) pDC, OPAQUE);
-
-  ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-  ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-  wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-  return (WXHBRUSH) backgroundBrush->GetResourceHandle();
+  return wxControl::OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam);
 }
 
 // For trackbars only
index c2d4ed2a4ae5d84d088a3a2e1efeef549734c85e..c6124f512cc8905b7d7c4cdb1b350b1454753b21 100644 (file)
@@ -481,17 +481,7 @@ WXHBRUSH wxSliderMSW::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
     return 0;
 
   // Otherwise, it's a static
-  if (GetParent()->GetTransparentBackground())
-    SetBkMode((HDC) pDC, TRANSPARENT);
-  else
-    SetBkMode((HDC) pDC, OPAQUE);
-
-  ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-  ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-  wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-
-  return (WXHBRUSH) backgroundBrush->GetResourceHandle();
+  return wxControl::OnCtlColor(pDC, pWnd, nCtlColor, message, wParam, lParam);
 }
 
 // For trackbars only
index c07beec6ae80357294b405af2b5a551e6ff062f5..e9d67bec8adecb9cf280673f12da0cd6c1ccf150 100644 (file)
@@ -61,7 +61,7 @@ bool wxStaticBox::Create(wxWindow *parent,
                          long style,
                          const wxString& name)
 {
-    if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) )
+    if ( !CreateControl(parent, id, pos, size, style, name) )
         return FALSE;
 
     if ( !MSWCreateControl(wxT("BUTTON"), BS_GROUPBOX, pos, size, label, 0) )
@@ -84,34 +84,6 @@ wxSize wxStaticBox::DoGetBestSize() const
     return wxSize(wBox, hBox);
 }
 
-WXHBRUSH wxStaticBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                                 WXUINT message,
-                                 WXWPARAM wParam,
-                                 WXLPARAM lParam)
-{
-#if wxUSE_CTL3D
-    if ( m_useCtl3D )
-    {
-        HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-        return (WXHBRUSH) hbrush;
-    }
-#endif // wxUSE_CTL3D
-
-    HDC hdc = (HDC)pDC;
-    if (GetParent()->GetTransparentBackground())
-        SetBkMode(hdc, TRANSPARENT);
-    else
-        SetBkMode(hdc, OPAQUE);
-
-    const wxColour& colBack = GetBackgroundColour();
-    ::SetBkColor(hdc, wxColourToRGB(colBack));
-    ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour()));
-
-    wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBack, wxSOLID);
-
-    return (WXHBRUSH)brush->GetResourceHandle();
-}
-
 long wxStaticBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 {
     switch ( nMsg )
index 2a8bfaad15328b198ae4337c890f5f361ea426cb..4ab6b6c42db6065a540de8b64a2fd3476ab4bdd9 100644 (file)
@@ -150,39 +150,6 @@ void wxStaticText::SetLabel(const wxString& label)
     }
 }
 
-WXHBRUSH wxStaticText::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-      WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
-/*
-#if wxUSE_CTL3D
-  if ( m_useCtl3D )
-  {
-    HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-
-    if (hbrush != (HBRUSH) 0)
-      return hbrush;
-    else
-      return (HBRUSH)MSWDefWindowProc(message, wParam, lParam);
-  }
-#endif
-*/
-
-  if (GetParent()->GetTransparentBackground())
-    SetBkMode((HDC) pDC, TRANSPARENT);
-  else
-    SetBkMode((HDC) pDC, OPAQUE);
-
-  ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-  ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-  wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-
-  // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
-  // has a zero usage count.
-//  backgroundBrush->RealizeResource();
-  return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-}
-
 long wxStaticText::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 {
   // Ensure that static items get messages. Some controls don't like this
index 49bd3207c45ba23eeaded06b6bca474aa186e51c..e3930803b0502d00ee6993000b1ad208b98c7b06 100644 (file)
@@ -764,30 +764,6 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
     }
 }
 
-WXHBRUSH wxTextCtrl::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                                WXUINT message, WXWPARAM wParam,
-                                WXLPARAM lParam)
-{
-#if wxUSE_CTL3D
-    if ( m_useCtl3D )
-    {
-        HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-        return (WXHBRUSH) hbrush;
-    }
-#endif
-
-    HDC hdc = (HDC)pDC;
-    SetBkMode(hdc, GetParent()->GetTransparentBackground() ? TRANSPARENT
-                                                           : OPAQUE);
-
-    ::SetBkColor(hdc, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-    ::SetTextColor(hdc, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-    wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-
-    return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-}
-
 void wxTextCtrl::OnChar(wxKeyEvent& event)
 {
     switch ( event.KeyCode() )
index ebf490177d85aa6c3f8b657192bfb94f0075a236..0bac53472b783c6b28d0b93cedc896215f5b183a 100644 (file)
 #include "wx/tooltip.h"
 #include "wx/msw/private.h"
 
-#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__) || defined(wxUSE_NORLANDER_HEADERS)
-#include <commctrl.h>
+#if defined(__WIN95__) && !defined(__GNUWIN32_OLD__)
+    #include <commctrl.h>
 #endif
 
+// VZ: normally, the trick with subclassing the tooltip control and processing
+//     TTM_WINDOWFROMPOINT should work but, somehow, it doesn't. I leave the
+//     code here for now (but it's not compiled) in case we need it later.
+//
+//     For now, instead of this, we just add all radiobox buttons to the
+//     tooltip control as well (see SetWindow) - this is probably less
+//     efficient, but it works.
+#define wxUSE_TTM_WINDOWFROMPOINT   0
+
 // ----------------------------------------------------------------------------
 // global variables
 // ----------------------------------------------------------------------------
 
 // the tooltip parent window
-WXHWND wxToolTip::hwndTT = (WXHWND)NULL;
+WXHWND wxToolTip::ms_hwndTT = (WXHWND)NULL;
+
+#if wxUSE_TTM_WINDOWFROMPOINT
+
+// the tooltip window proc
+static WNDPROC gs_wndprocToolTip = (WNDPROC)NULL;
+
+#endif // wxUSE_TTM_WINDOWFROMPOINT
 
 // ----------------------------------------------------------------------------
 // private classes
@@ -54,14 +70,14 @@ WXHWND wxToolTip::hwndTT = (WXHWND)NULL;
 class wxToolInfo : public TOOLINFO
 {
 public:
-    wxToolInfo(wxWindow *win)
+    wxToolInfo(HWND hwnd)
     {
         // initialize all members
         ::ZeroMemory(this, sizeof(TOOLINFO));
 
         cbSize = sizeof(TOOLINFO);
         uFlags = TTF_IDISHWND;
-        uId = (UINT)win->GetHWND();
+        uId = (UINT)hwnd;
     }
 };
 #ifdef __VISUALC__
@@ -88,28 +104,68 @@ static void SendTooltipMessageToAll(WXHWND hwnd,
                                     WPARAM wParam,
                                     LPARAM lParam)
 {
-   if ( hwnd )
-     (void)SendTooltipMessage((WXHWND)hwnd, msg, wParam, (void *)lParam);
+    (void)SendTooltipMessage((WXHWND)hwnd, msg, wParam, (void *)lParam);
 }
 
 // ============================================================================
 // implementation
 // ============================================================================
 
+#if wxUSE_TTM_WINDOWFROMPOINT
+
 // ----------------------------------------------------------------------------
-// static functions
+// window proc for our tooltip control
 // ----------------------------------------------------------------------------
 
+LRESULT APIENTRY wxToolTipWndProc(HWND hwndTT,
+                                  UINT msg,
+                                  WPARAM wParam,
+                                  LPARAM lParam)
+{
+    if ( msg == TTM_WINDOWFROMPOINT )
+    {
+        LPPOINT ppt = (LPPOINT)lParam;
+        // is the window under control a wxWindow?
+        HWND hwnd = ::WindowFromPoint(*ppt);
+
+        // return a HWND correspondign to wxWindow because only wxWindows are
+        // associated with tooltips using TTM_ADDTOOL
+        while ( hwnd && !wxFindWinFromHandle((WXHWND)hwnd) )
+        {
+            hwnd = ::GetParent(hwnd);
+        }
+
+        if ( hwnd )
+        {
+            // modify the point too!
+            RECT rect;
+            GetWindowRect(hwnd, &rect);
+
+            ppt->x = rect.left;
+            ppt->y = rect.top;
 
+            return (LRESULT)hwnd;
+        }
+    }
+
+    return ::CallWindowProc(gs_wndprocToolTip, hwndTT, msg, wParam, lParam);
+}
+
+#endif // wxUSE_TTM_WINDOWFROMPOINT
+
+// ----------------------------------------------------------------------------
+// static functions
+// ----------------------------------------------------------------------------
 
 void wxToolTip::Enable(bool flag)
 {
-    SendTooltipMessageToAll((WXHWND)hwndTT,TTM_ACTIVATE, flag, 0);
+    SendTooltipMessageToAll(ms_hwndTT, TTM_ACTIVATE, flag, 0);
 }
 
 void wxToolTip::SetDelay(long milliseconds)
 {
-    SendTooltipMessageToAll((WXHWND)hwndTT,TTM_SETDELAYTIME, TTDT_INITIAL, milliseconds);
+    SendTooltipMessageToAll(ms_hwndTT, TTM_SETDELAYTIME,
+                            TTDT_INITIAL, milliseconds);
 }
 
 // ---------------------------------------------------------------------------
@@ -119,25 +175,31 @@ void wxToolTip::SetDelay(long milliseconds)
 // create the tooltip ctrl for our parent frame if it doesn't exist yet
 WXHWND wxToolTip::GetToolTipCtrl()
 {
-    if ( !hwndTT )
+    if ( !ms_hwndTT )
     {
-        hwndTT = (WXHWND)::CreateWindow(TOOLTIPS_CLASS,
-                                (LPSTR)NULL,
-                                TTS_ALWAYSTIP,
-                                CW_USEDEFAULT, CW_USEDEFAULT,
-                                CW_USEDEFAULT, CW_USEDEFAULT,
-                                NULL, (HMENU)NULL,
-                                wxGetInstance(),
-                                NULL);
-       if ( hwndTT )
+        ms_hwndTT = (WXHWND)::CreateWindow(TOOLTIPS_CLASS,
+                                           (LPSTR)NULL,
+                                           TTS_ALWAYSTIP,
+                                           CW_USEDEFAULT, CW_USEDEFAULT,
+                                           CW_USEDEFAULT, CW_USEDEFAULT,
+                                           NULL, (HMENU)NULL,
+                                           wxGetInstance(),
+                                           NULL);
+       if ( ms_hwndTT )
        {
-           SetWindowPos((HWND)hwndTT, HWND_TOPMOST, 0, 0, 0, 0,
+           HWND hwnd = (HWND)ms_hwndTT;
+           SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0,
                         SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
-       }
 
+#if wxUSE_TTM_WINDOWFROMPOINT
+           // subclass the newly created control
+           gs_wndprocToolTip = (WNDPROC)::GetWindowLong(hwnd, GWL_WNDPROC);
+           ::SetWindowLong(hwnd, GWL_WNDPROC, (long)wxToolTipWndProc);
+#endif // wxUSE_TTM_WINDOWFROMPOINT
+       }
     }
 
-    return (WXHWND)hwndTT;
+    return ms_hwndTT;
 }
 
 void wxToolTip::RelayEvent(WXMSG *msg)
@@ -170,32 +232,57 @@ void wxToolTip::Remove()
     // remove this tool from the tooltip control
     if ( m_window )
     {
-        wxToolInfo ti(m_window);
+        wxToolInfo ti(GetHwndOf(m_window));
         (void)SendTooltipMessage(GetToolTipCtrl(), TTM_DELTOOL, 0, &ti);
     }
 }
 
+void wxToolTip::Add(WXHWND hWnd)
+{
+    HWND hwnd = (HWND)hWnd;
+
+    wxToolInfo ti(hwnd);
+
+    // as we store our text anyhow, it seems useless to waste system memory
+    // by asking the tooltip ctrl to remember it too - instead it will send
+    // us TTN_NEEDTEXT (via WM_NOTIFY) when it is about to be shown
+    ti.hwnd = hwnd;
+    ti.lpszText = LPSTR_TEXTCALLBACK;
+    // instead of: ti.lpszText = (char *)m_text.c_str();
+
+    if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, 0, &ti) )
+    {
+        wxLogSysError(_("Failed to create the tooltip '%s'"),
+                      m_text.c_str());
+    }
+}
+
 void wxToolTip::SetWindow(wxWindow *win)
 {
     Remove();
 
     m_window = win;
 
+    // add the window itself
     if ( m_window )
     {
-        wxToolInfo ti(m_window);
-
-        // as we store our text anyhow, it seems useless to waste system memory
-        // by asking the tooltip ctrl to remember it too - instead it will send
-        // us TTN_NEEDTEXT (via WM_NOTIFY) when it is about to be shown
-        ti.hwnd = (HWND)m_window->GetHWND();
-        ti.lpszText = LPSTR_TEXTCALLBACK;
-        // instead of: ti.lpszText = (char *)m_text.c_str();
+        Add(m_window->GetHWND());
+    }
 
-        if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, 0, &ti) )
+    // and all of its subcontrols (e.g. radiobuttons in a radiobox) as well
+    wxControl *control = wxDynamicCast(m_window, wxControl);
+    if ( control )
+    {
+        size_t count = control->GetSubcontrols().GetCount();
+        for ( size_t n = 0; n < count; n++ )
         {
-            wxLogSysError(_("Failed to create the tooltip '%s'"),
-                          m_text.c_str());
+            wxWindowID id = control->GetSubcontrols()[n];
+            HWND hwnd = GetDlgItem(GetHwndOf(m_window), id);
+
+            if ( hwnd )
+            {
+                Add((WXHWND)hwnd);
+            }
         }
     }
 }
@@ -207,7 +294,7 @@ void wxToolTip::SetTip(const wxString& tip)
     if ( m_window )
     {
         // update it immediately
-        wxToolInfo ti(m_window);
+        wxToolInfo ti(GetHwndOf(m_window));
         ti.lpszText = (wxChar *)m_text.c_str();
 
         (void)SendTooltipMessage(GetToolTipCtrl(), TTM_UPDATETIPTEXT, 0, &ti);
index 0df00e969648be80347192f913c745ce62ca4ab6..7459dda31174f7dd3cd9635bb5a08e8c74c5d6a8 100644 (file)
@@ -163,6 +163,17 @@ END_EVENT_TABLE()
 // Find an item given the MS Windows id
 wxWindow *wxWindow::FindItem(long id) const
 {
+    wxControl *item = wxDynamicCast(this, wxControl);
+    if ( item )
+    {
+        // i it we or one of our "internal" children?
+        if ( item->GetId() == id ||
+             (item->GetSubcontrols().Index(id) != wxNOT_FOUND) )
+        {
+            return item;
+        }
+    }
+
     wxWindowList::Node *current = GetChildren().GetFirst();
     while (current)
     {
@@ -172,19 +183,6 @@ wxWindow *wxWindow::FindItem(long id) const
         if ( wnd )
             return wnd;
 
-        if ( childWin->IsKindOf(CLASSINFO(wxControl)) )
-        {
-            wxControl *item = (wxControl *)childWin;
-            if ( item->GetId() == id )
-                return item;
-            else
-            {
-                // In case it's a 'virtual' control (e.g. radiobox)
-                if ( item->GetSubcontrols().Member((wxObject *)id) )
-                    return item;
-            }
-        }
-
         current = current->GetNext();
     }
 
@@ -2946,7 +2944,8 @@ bool wxWindow::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control)
         return popupMenu->MSWCommand(cmd, id);
     }
 
-    wxWindow *win = FindItem(id);
+    // must cast to a signed type before comparing with other ids!
+    wxWindow *win = FindItem((signed short)id);
     if ( !win )
     {
         win = wxFindWinFromHandle(control);