]> git.saurik.com Git - wxWidgets.git/blame - src/msw/nativdlg.cpp
wxWindow::Fit() infinite loop bug fixed
[wxWidgets.git] / src / msw / nativdlg.cpp
CommitLineData
2bda0e17
KB
1/////////////////////////////////////////////////////////////////////////////
2// Name: nativdlg.cpp
3// Purpose: Native dialog loading code (part of wxWindow)
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart and Markus Holzem
cc2b7472 9// Licence: wxWindows license
2bda0e17
KB
10/////////////////////////////////////////////////////////////////////////////
11
cc2b7472
VZ
12// ===========================================================================
13// declarations
14// ===========================================================================
15
16// ---------------------------------------------------------------------------
17// headers
18// ---------------------------------------------------------------------------
19
2bda0e17 20#ifdef __GNUG__
cc2b7472 21 #pragma implementation
2bda0e17
KB
22#endif
23
24// For compilers that support precompilation, includes "wx.h".
25#include "wx/wxprec.h"
26
27#ifdef __BORLANDC__
cc2b7472 28 #pragma hdrstop
2bda0e17
KB
29#endif
30
31#ifndef WX_PRECOMP
cc2b7472
VZ
32 #include <stdio.h>
33
34 #include "wx/wx.h"
2bda0e17
KB
35#endif
36
37#include "wx/spinbutt.h"
38#include "wx/msw/private.h"
39
cc2b7472
VZ
40// ---------------------------------------------------------------------------
41// global functions
42// ---------------------------------------------------------------------------
43
2bda0e17 44extern wxWindow *wxWndHook;
cc2b7472
VZ
45extern LONG APIENTRY _EXPORT wxDlgProc(HWND hWnd, UINT message,
46 WPARAM wParam, LPARAM lParam);
47
48// ===========================================================================
49// implementation
50// ===========================================================================
2bda0e17 51
debe6624 52bool wxWindow::LoadNativeDialog(wxWindow* parent, wxWindowID& id)
2bda0e17 53{
cc2b7472 54 m_windowId = id;
2bda0e17 55 wxWndHook = this;
cc2b7472
VZ
56 m_hWnd = (WXHWND)::CreateDialog((HINSTANCE)wxGetInstance(),
57 MAKEINTRESOURCE(id),
58 parent ? (HWND)parent->GetHWND() : 0,
59 (DLGPROC) wxDlgProc);
2bda0e17
KB
60 wxWndHook = NULL;
61
cc2b7472
VZ
62 if ( !m_hWnd )
63 return FALSE;
2bda0e17 64
cc2b7472 65 SubclassWin(GetHWND());
2bda0e17 66
cc2b7472
VZ
67 if ( parent )
68 parent->AddChild(this);
69 else
70 wxTopLevelWindows.Append(this);
2bda0e17 71
cc2b7472 72 // Enumerate all children
2bda0e17
KB
73 HWND hWndNext;
74 hWndNext = ::GetWindow((HWND) m_hWnd, GW_CHILD);
75
cc2b7472
VZ
76 wxWindow* child = NULL;
77 if (hWndNext)
78 child = CreateWindowFromHWND(this, (WXHWND) hWndNext);
2bda0e17 79
57c208c5 80 while (hWndNext != (HWND) NULL)
2bda0e17 81 {
cc2b7472
VZ
82 hWndNext = ::GetWindow(hWndNext, GW_HWNDNEXT);
83 if (hWndNext)
84 child = CreateWindowFromHWND(this, (WXHWND) hWndNext);
2bda0e17
KB
85 }
86
cc2b7472 87 return TRUE;
2bda0e17
KB
88}
89
90bool wxWindow::LoadNativeDialog(wxWindow* parent, const wxString& name)
91{
cc2b7472 92 SetName(name);
2bda0e17
KB
93
94 wxWndHook = this;
cc2b7472
VZ
95 m_hWnd = (WXHWND)::CreateDialog((HINSTANCE) wxGetInstance(),
96 name.c_str(),
97 parent ? (HWND)parent->GetHWND() : 0,
98 (DLGPROC)wxDlgProc);
2bda0e17
KB
99 wxWndHook = NULL;
100
cc2b7472
VZ
101 if ( !m_hWnd )
102 return FALSE;
2bda0e17 103
cc2b7472 104 SubclassWin(GetHWND());
2bda0e17 105
cc2b7472
VZ
106 if ( parent )
107 parent->AddChild(this);
108 else
109 wxTopLevelWindows.Append(this);
2bda0e17 110
cc2b7472 111 // FIXME why don't we enum all children here?
2bda0e17 112
cc2b7472 113 return TRUE;
2bda0e17
KB
114}
115
cc2b7472
VZ
116// ---------------------------------------------------------------------------
117// look for child by id
118// ---------------------------------------------------------------------------
119
120wxWindow* wxWindow::GetWindowChild1(wxWindowID id)
2bda0e17 121{
cc2b7472
VZ
122 if ( m_windowId == id )
123 return this;
124
125 wxWindowList::Node *node = GetChildren().GetFirst();
126 while ( node )
127 {
128 wxWindow* child = node->GetData();
129 wxWindow* win = child->GetWindowChild1(id);
130 if ( win )
131 return win;
132
133 node = node->GetNext();
134 }
135
136 return NULL;
2bda0e17
KB
137}
138
cc2b7472 139wxWindow* wxWindow::GetWindowChild(wxWindowID id)
2bda0e17 140{
cc2b7472
VZ
141 wxWindow* win = GetWindowChild1(id);
142 if ( !win )
143 {
144 HWND hWnd = ::GetDlgItem((HWND) GetHWND(), id);
145
146 if (hWnd)
147 {
148 wxWindow* child = CreateWindowFromHWND(this, (WXHWND) hWnd);
149 if (child)
150 {
151 child->AddChild(this);
152 return child;
153 }
154 }
155 }
156
157 return NULL;
2bda0e17
KB
158}
159
cc2b7472
VZ
160// ---------------------------------------------------------------------------
161// create wxWin window from a native HWND
162// ---------------------------------------------------------------------------
2bda0e17
KB
163
164wxWindow* wxWindow::CreateWindowFromHWND(wxWindow* parent, WXHWND hWnd)
165{
cc2b7472
VZ
166 wxString str(wxGetWindowClass(hWnd));
167 str.UpperCase();
2bda0e17 168
cc2b7472
VZ
169 long id = wxGetWindowId(hWnd);
170 long style = GetWindowLong((HWND) hWnd, GWL_STYLE);
2bda0e17 171
cc2b7472 172 wxWindow* win = NULL;
2bda0e17 173
cc2b7472
VZ
174 if (str == "BUTTON")
175 {
176 int style1 = (style & 0xFF);
177 if ((style1 == BS_3STATE) || (style1 == BS_AUTO3STATE) || (style1 == BS_AUTOCHECKBOX) ||
178 (style1 == BS_CHECKBOX))
179 {
180 win = new wxCheckBox;
181 }
182 else if ((style1 == BS_AUTORADIOBUTTON) || (style1 == BS_RADIOBUTTON))
183 {
184 win = new wxRadioButton;
185 }
2432b92d 186#if defined(__WIN32__) && defined(BS_BITMAP)
cc2b7472
VZ
187 else if (style & BS_BITMAP)
188 {
189 // TODO: how to find the bitmap?
190 win = new wxBitmapButton;
191 wxLogError("Have not yet implemented bitmap button as BS_BITMAP button.");
192 }
2bda0e17 193#endif
cc2b7472
VZ
194 else if (style1 == BS_OWNERDRAW)
195 {
196 // TODO: how to find the bitmap?
197 // TODO: can't distinguish between bitmap button and bitmap static.
198 // Change implementation of wxStaticBitmap to SS_BITMAP.
199 // PROBLEM: this assumes that we're using resource-based bitmaps.
200 // So maybe need 2 implementations of bitmap buttons/static controls,
201 // with a switch in the drawing code. Call default proc if BS_BITMAP.
202 win = new wxBitmapButton;
203 }
204 else if ((style1 == BS_PUSHBUTTON) || (style1 == BS_DEFPUSHBUTTON))
205 {
206 win = new wxButton;
207 }
208 else if (style1 == BS_GROUPBOX)
209 {
210 win = new wxStaticBox;
211 }
212 else
213 {
214 wxLogError(_T("Don't know what kind of button this is: id = %d"),
215 id);
216 }
217 }
218 else if (str == "COMBOBOX")
219 {
220 win = new wxComboBox;
221 }
222 // TODO: Problem if the user creates a multiline - but not rich text - text control,
223 // since wxWin assumes RichEdit control for this. Should have m_isRichText in
224 // wxTextCtrl. Also, convert as much of the window style as is necessary
225 // for correct functioning.
226 // Could have wxWindow::AdoptAttributesFromHWND(WXHWND)
227 // to be overridden by each control class.
228 else if (str == "EDIT")
229 {
230 win = new wxTextCtrl;
231 }
232 else if (str == "LISTBOX")
233 {
234 win = new wxListBox;
235 }
236 else if (str == "SCROLLBAR")
237 {
238 win = new wxScrollBar;
239 }
57c208c5 240#if defined(__WIN95__) && !defined(__TWIN32__)
cc2b7472
VZ
241 else if (str == "MSCTLS_UPDOWN32")
242 {
243 win = new wxSpinButton;
244 }
2bda0e17 245#endif
cc2b7472
VZ
246 else if (str == "MSCTLS_TRACKBAR32")
247 {
248 // Need to ascertain if it's horiz or vert
249 win = new wxSlider;
250 }
251 else if (str == "STATIC")
252 {
253 int style1 = (style & 0xFF);
254
255 if ((style1 == SS_LEFT) || (style1 == SS_RIGHT) || (style1 == SS_SIMPLE))
256 win = new wxStaticText;
2432b92d 257#if defined(__WIN32__) && defined(BS_BITMAP)
cc2b7472
VZ
258 else if (style1 == SS_BITMAP)
259 {
260 win = new wxStaticBitmap;
2bda0e17 261
cc2b7472
VZ
262 // Help! this doesn't correspond with the wxWin implementation.
263 wxLogError("Please make SS_BITMAP statics into owner-draw buttons.");
264 }
2bda0e17 265#endif
cc2b7472
VZ
266 }
267 else
268 {
269 wxString msg("Don't know how to convert from Windows class ");
270 msg += str;
271 wxLogError(msg);
272 }
273
274 if (win)
275 {
276 parent->AddChild(win);
277 win->SetEventHandler(win);
278 win->SetHWND(hWnd);
279 win->SetId(id);
280 win->SubclassWin(hWnd);
281 win->AdoptAttributesFromHWND();
282 win->SetupColours();
283
284 return win;
285 }
286 else
287 return NULL;
2bda0e17
KB
288}
289
290// Make sure the window style (etc.) reflects the HWND style (roughly)
291void wxWindow::AdoptAttributesFromHWND(void)
292{
cc2b7472
VZ
293 HWND hWnd = (HWND) GetHWND();
294 long style = GetWindowLong((HWND) hWnd, GWL_STYLE);
2bda0e17 295
cc2b7472
VZ
296 if (style & WS_VSCROLL)
297 m_windowStyle |= wxVSCROLL;
298 if (style & WS_HSCROLL)
299 m_windowStyle |= wxHSCROLL;
2bda0e17
KB
300}
301