1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/nativdlg.cpp
3 // Purpose: Native dialog loading code (part of wxWindow)
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"
33 #include "wx/spinbutt.h"
34 #include "wx/msw/private.h"
36 // ---------------------------------------------------------------------------
38 // ---------------------------------------------------------------------------
40 extern LONG APIENTRY _EXPORT
wxDlgProc(HWND hWnd
, UINT message
,
41 WPARAM wParam
, LPARAM lParam
);
43 // ===========================================================================
45 // ===========================================================================
47 bool wxWindow::LoadNativeDialog(wxWindow
* parent
, wxWindowID
& id
)
51 wxWindowCreationHook
hook(this);
52 m_hWnd
= (WXHWND
)::CreateDialog((HINSTANCE
)wxGetInstance(),
54 parent
? (HWND
)parent
->GetHWND() : 0,
60 SubclassWin(GetHWND());
63 parent
->AddChild(this);
65 wxTopLevelWindows
.Append(this);
67 // Enumerate all children
69 hWndNext
= ::GetWindow((HWND
) m_hWnd
, GW_CHILD
);
72 CreateWindowFromHWND(this, (WXHWND
) hWndNext
);
74 while (hWndNext
!= (HWND
) NULL
)
76 hWndNext
= ::GetWindow(hWndNext
, GW_HWNDNEXT
);
78 CreateWindowFromHWND(this, (WXHWND
) hWndNext
);
84 bool wxWindow::LoadNativeDialog(wxWindow
* parent
, const wxString
& name
)
88 wxWindowCreationHook
hook(this);
89 m_hWnd
= (WXHWND
)::CreateDialog((HINSTANCE
) wxGetInstance(),
91 parent
? (HWND
)parent
->GetHWND() : 0,
97 SubclassWin(GetHWND());
100 parent
->AddChild(this);
102 wxTopLevelWindows
.Append(this);
104 // Enumerate all children
106 hWndNext
= ::GetWindow((HWND
) m_hWnd
, GW_CHILD
);
109 CreateWindowFromHWND(this, (WXHWND
) hWndNext
);
111 while (hWndNext
!= (HWND
) NULL
)
113 hWndNext
= ::GetWindow(hWndNext
, GW_HWNDNEXT
);
115 CreateWindowFromHWND(this, (WXHWND
) hWndNext
);
121 // ---------------------------------------------------------------------------
122 // look for child by id
123 // ---------------------------------------------------------------------------
125 wxWindow
* wxWindow::GetWindowChild1(wxWindowID id
)
127 if ( m_windowId
== id
)
130 wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
133 wxWindow
* child
= node
->GetData();
134 wxWindow
* win
= child
->GetWindowChild1(id
);
138 node
= node
->GetNext();
144 wxWindow
* wxWindow::GetWindowChild(wxWindowID id
)
146 wxWindow
* win
= GetWindowChild1(id
);
149 HWND hwnd
= ::GetDlgItem(GetHwnd(), id
);
152 win
= CreateWindowFromHWND(this, (WXHWND
) hwnd
);
159 // ---------------------------------------------------------------------------
160 // create wxWin window from a native HWND
161 // ---------------------------------------------------------------------------
163 wxWindow
* wxWindow::CreateWindowFromHWND(wxWindow
* parent
, WXHWND hWnd
)
165 wxCHECK_MSG( parent
, NULL
, _T("must have valid parent for a control") );
167 wxString
str(wxGetWindowClass(hWnd
));
170 long id
= wxGetWindowId(hWnd
);
171 long style
= GetWindowLong((HWND
) hWnd
, GWL_STYLE
);
173 wxWindow
* win
= NULL
;
175 if (str
== wxT("BUTTON"))
177 int style1
= (style
& 0xFF);
179 if ((style1
== BS_3STATE
) || (style1
== BS_AUTO3STATE
) || (style1
== BS_AUTOCHECKBOX
) ||
180 (style1
== BS_CHECKBOX
))
182 win
= new wxCheckBox
;
187 if ((style1
== BS_AUTORADIOBUTTON
) || (style1
== BS_RADIOBUTTON
))
189 win
= new wxRadioButton
;
194 #if defined(__WIN32__) && defined(BS_BITMAP)
195 if (style
& BS_BITMAP
)
197 // TODO: how to find the bitmap?
198 win
= new wxBitmapButton
;
199 wxLogError(wxT("Have not yet implemented bitmap button as BS_BITMAP button."));
203 if (style1
== BS_OWNERDRAW
)
205 // TODO: how to find the bitmap?
206 // TODO: can't distinguish between bitmap button and bitmap static.
207 // Change implementation of wxStaticBitmap to SS_BITMAP.
208 // PROBLEM: this assumes that we're using resource-based bitmaps.
209 // So maybe need 2 implementations of bitmap buttons/static controls,
210 // with a switch in the drawing code. Call default proc if BS_BITMAP.
211 win
= new wxBitmapButton
;
216 if ((style1
== BS_PUSHBUTTON
) || (style1
== BS_DEFPUSHBUTTON
))
223 if (style1
== BS_GROUPBOX
)
225 win
= new wxStaticBox
;
230 wxLogError(wxT("Don't know what kind of button this is: id = %ld"),
235 else if (str
== wxT("COMBOBOX"))
237 win
= new wxComboBox
;
241 // TODO: Problem if the user creates a multiline - but not rich text - text control,
242 // since wxWin assumes RichEdit control for this. Should have m_isRichText in
243 // wxTextCtrl. Also, convert as much of the window style as is necessary
244 // for correct functioning.
245 // Could have wxWindow::AdoptAttributesFromHWND(WXHWND)
246 // to be overridden by each control class.
247 else if (str
== wxT("EDIT"))
249 win
= new wxTextCtrl
;
253 else if (str
== wxT("LISTBOX"))
259 else if (str
== wxT("SCROLLBAR"))
261 win
= new wxScrollBar
;
265 else if (str
== wxT("MSCTLS_UPDOWN32"))
267 win
= new wxSpinButton
;
271 else if (str
== wxT("MSCTLS_TRACKBAR32"))
273 // Need to ascertain if it's horiz or vert
276 #endif // wxUSE_SLIDER
278 else if (str
== wxT("STATIC"))
280 int style1
= (style
& 0xFF);
282 if ((style1
== SS_LEFT
) || (style1
== SS_RIGHT
)
284 || (style1
== SS_SIMPLE
)
287 win
= new wxStaticText
;
289 #if defined(__WIN32__) && defined(BS_BITMAP)
290 else if (style1
== SS_BITMAP
)
292 win
= new wxStaticBitmap
;
294 // Help! this doesn't correspond with the wxWin implementation.
295 wxLogError(wxT("Please make SS_BITMAP statics into owner-draw buttons."));
298 #endif /* wxUSE_STATBMP */
303 wxString
msg(wxT("Don't know how to convert from Windows class "));
310 parent
->AddChild(win
);
311 win
->SubclassWin(hWnd
);
312 win
->AdoptAttributesFromHWND();
319 // Make sure the window style (etc.) reflects the HWND style (roughly)
320 void wxWindow::AdoptAttributesFromHWND()
322 SetId(wxGetWindowId(m_hWnd
));
324 long style
= GetWindowLong(GetHwnd(), GWL_STYLE
);
326 if (style
& WS_VSCROLL
)
327 m_windowStyle
|= wxVSCROLL
;
328 if (style
& WS_HSCROLL
)
329 m_windowStyle
|= wxHSCROLL
;