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