1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/colordlg.cpp
3 // Purpose: wxColourDialog class
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
27 #if wxUSE_COLOURDLG && !(defined(__SMARTPHONE__) && defined(__WXWINCE__))
29 #include "wx/colordlg.h"
32 #include "wx/msw/wrapcdlg.h"
34 #include "wx/colour.h"
35 #include "wx/gdicmn.h"
40 #include "wx/msw/private.h"
45 // ----------------------------------------------------------------------------
47 // ----------------------------------------------------------------------------
49 // standard colors dialog size for the Windows systems
50 // this is ok if color dialog created with standart color
51 // and "Define Custom Colors" extension not shown
52 static wxRect
gs_rectDialog(0, 0, 222, 324);
54 // ----------------------------------------------------------------------------
56 // ----------------------------------------------------------------------------
58 IMPLEMENT_DYNAMIC_CLASS(wxColourDialog
, wxDialog
)
60 // ============================================================================
62 // ============================================================================
64 // ----------------------------------------------------------------------------
65 // colour dialog hook proc
66 // ----------------------------------------------------------------------------
69 wxColourDialogHookProc(HWND hwnd
,
71 WPARAM
WXUNUSED(wParam
),
74 if ( uiMsg
== WM_INITDIALOG
)
76 CHOOSECOLOR
*pCC
= (CHOOSECOLOR
*)lParam
;
77 wxColourDialog
* const
78 dialog
= reinterpret_cast<wxColourDialog
*>(pCC
->lCustData
);
80 const wxString title
= dialog
->GetTitle();
82 ::SetWindowText(hwnd
, title
.wx_str());
84 dialog
->MSWOnInitDone((WXHWND
)hwnd
);
90 // ----------------------------------------------------------------------------
92 // ----------------------------------------------------------------------------
94 void wxColourDialog::Init()
96 m_movedWindow
= false;
99 // reset to zero, otherwise the wx routines won't size the window the
100 // second time the dialog is shown, because they would believe it already
101 // has the requested size/position
106 bool wxColourDialog::Create(wxWindow
*parent
, wxColourData
*data
)
110 m_colourData
= *data
;
115 int wxColourDialog::ShowModal()
117 // initialize the struct used by Windows
118 CHOOSECOLOR chooseColorStruct
;
119 memset(&chooseColorStruct
, 0, sizeof(CHOOSECOLOR
));
123 // and transfer data from m_colourData to it
124 COLORREF custColours
[16];
125 for ( i
= 0; i
< WXSIZEOF(custColours
); i
++ )
127 if ( m_colourData
.GetCustomColour(i
).IsOk() )
128 custColours
[i
] = wxColourToRGB(m_colourData
.GetCustomColour(i
));
130 custColours
[i
] = RGB(255,255,255);
133 chooseColorStruct
.lStructSize
= sizeof(CHOOSECOLOR
);
135 chooseColorStruct
.hwndOwner
= GetHwndOf(m_parent
);
136 chooseColorStruct
.rgbResult
= wxColourToRGB(m_colourData
.GetColour());
137 chooseColorStruct
.lpCustColors
= custColours
;
139 chooseColorStruct
.Flags
= CC_RGBINIT
| CC_ENABLEHOOK
;
140 chooseColorStruct
.lCustData
= (LPARAM
)this;
141 chooseColorStruct
.lpfnHook
= wxColourDialogHookProc
;
143 if ( m_colourData
.GetChooseFull() )
144 chooseColorStruct
.Flags
|= CC_FULLOPEN
;
146 // do show the modal dialog
147 if ( !::ChooseColor(&chooseColorStruct
) )
149 // 0 error means the dialog was simply cancelled, i.e. no real error
151 const DWORD err
= CommDlgExtendedError();
154 wxLogError(_("Colour selection dialog failed with error %0lx."), err
);
161 // transfer the values chosen by user back into m_colourData
162 for ( i
= 0; i
< WXSIZEOF(custColours
); i
++ )
164 wxRGBToColour(m_colourData
.m_custColours
[i
], custColours
[i
]);
167 wxRGBToColour(m_colourData
.GetColour(), chooseColorStruct
.rgbResult
);
169 // this doesn't seem to work (contrary to what MSDN implies) on current
170 // Windows versions: CC_FULLOPEN is never set on return if it wasn't
171 // initially set and vice versa
172 //m_colourData.SetChooseFull((chooseColorStruct.Flags & CC_FULLOPEN) != 0);
177 // ----------------------------------------------------------------------------
179 // ----------------------------------------------------------------------------
181 void wxColourDialog::SetTitle(const wxString
& title
)
186 wxString
wxColourDialog::GetTitle() const
191 // ----------------------------------------------------------------------------
193 // ----------------------------------------------------------------------------
195 void wxColourDialog::DoGetPosition(int *x
, int *y
) const
198 *x
= gs_rectDialog
.x
;
200 *y
= gs_rectDialog
.y
;
203 void wxColourDialog::DoCentre(int dir
)
207 // it's unnecessary to do anything else at this stage as we'll redo it in
208 // MSWOnInitDone() anyhow
211 void wxColourDialog::DoMoveWindow(int x
, int y
, int WXUNUSED(w
), int WXUNUSED(h
))
216 // our HWND is only set when we're called from MSWOnInitDone(), test if
218 HWND hwnd
= GetHwnd();
221 // size of the dialog can't be changed because the controls are not
222 // laid out correctly then
223 ::SetWindowPos(hwnd
, HWND_TOP
, x
, y
, 0, 0, SWP_NOZORDER
| SWP_NOSIZE
);
225 else // just remember that we were requested to move the window
227 m_movedWindow
= true;
229 // if Centre() had been called before, it shouldn't be taken into
235 void wxColourDialog::DoGetSize(int *width
, int *height
) const
238 *width
= gs_rectDialog
.width
;
240 *height
= gs_rectDialog
.height
;
243 void wxColourDialog::DoGetClientSize(int *width
, int *height
) const
246 *width
= gs_rectDialog
.width
;
248 *height
= gs_rectDialog
.height
;
251 void wxColourDialog::MSWOnInitDone(WXHWND hDlg
)
253 // set HWND so that our DoMoveWindow() works correctly
258 // now we have the real dialog size, remember it
260 ::GetWindowRect((HWND
)hDlg
, &rect
);
261 gs_rectDialog
= wxRectFromRECT(rect
);
263 // and position the window correctly: notice that we must use the base
264 // class version as our own doesn't do anything except setting flags
265 wxDialog::DoCentre(m_centreDir
);
267 else if ( m_movedWindow
) // need to just move it to the correct place
269 SetPosition(GetPosition());
272 // we shouldn't destroy hDlg, so disassociate from it
276 #endif // wxUSE_COLOURDLG && !(__SMARTPHONE__ && __WXWINCE__)