1///////////////////////////////////////////////////////////////////////////// 2// Name: nativdlg.cpp 3// Purpose: Native dialog loading code (part of wxWindow) 4// Author: David Webster 5// Modified by: 6// Created: 10/12/99 7// RCS-ID: $Id: nativdlg.cpp 30809 2004-11-28 18:39:30Z SN $ 8// Copyright: (c) David Webster 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12// =========================================================================== 13// declarations 14// =========================================================================== 15 16// --------------------------------------------------------------------------- 17// headers 18// --------------------------------------------------------------------------- 19 20// For compilers that support precompilation, includes "wx.h". 21#include "wx/wxprec.h" 22 23#ifndef WX_PRECOMP 24 #include <stdio.h> 25 #include "wx/wx.h" 26#endif 27 28#include "wx/os2/private.h" 29#include "wx/spinbutt.h" 30 31// --------------------------------------------------------------------------- 32// global functions 33// --------------------------------------------------------------------------- 34 35extern wxWindow* wxWndHook; 36extern MRESULT EXPENTRY wxDlgProc( HWND hWnd 37 ,UINT message 38 ,MPARAM wParam 39 ,MPARAM lParam 40 ); 41 42// =========================================================================== 43// implementation 44// =========================================================================== 45 46bool wxWindow::LoadNativeDialog ( 47 wxWindow* pParent 48, wxWindowID& vId 49) 50{ 51 wxWindow* pChild = NULL; 52 HWND hWndOwner; 53 HWND hWndNext = NULLHANDLE; 54 HENUM hEnum; 55 56 if (pParent) 57 hWndOwner = GetHwndOf(pParent); 58 else 59 hWndOwner = HWND_DESKTOP; 60 61 m_windowId = vId; 62 wxWndHook = this; 63 64 m_hWnd = ::WinLoadDlg( HWND_DESKTOP 65 ,hWndOwner 66 ,(PFNWP)wxDlgProc 67 ,NULL 68 ,(ULONG)131 // Caption dialog from the resource file 69 ,(PVOID)this 70 ); 71 wxWndHook = NULL; 72 73 if ( !m_hWnd ) 74 return FALSE; 75 76 SubclassWin(GetHWND()); 77 78 if (pParent) 79 pParent->AddChild(this); 80 else 81 wxTopLevelWindows.Append(this); 82 83 // 84 // Enumerate the children 85 // 86 hEnum = ::WinBeginEnumWindows(GetHwndOf(pParent)); 87 while ((hWndNext = ::WinGetNextWindow(hEnum)) != NULLHANDLE) 88 pChild = CreateWindowFromHWND( this 89 ,(WXHWND)hWndNext 90 ); 91 ::WinEndEnumWindows(hEnum); 92 return TRUE; 93} // end of wxWindow::LoadNativeDialog 94 95bool wxWindow::LoadNativeDialog ( 96 wxWindow* pParent 97, const wxString& rsName 98) 99{ 100 HWND hWndOwner; 101 102 if (pParent) 103 hWndOwner = GetHwndOf(pParent); 104 else 105 hWndOwner = HWND_DESKTOP; 106 SetName(rsName); 107 108 wxWndHook = this; 109 m_hWnd = ::WinLoadDlg( HWND_DESKTOP 110 ,hWndOwner 111 ,(PFNWP)wxDlgProc 112 ,NULL 113 ,(ULONG)131 // Caption dialog from the resource file 114 ,(PVOID)this 115 ); 116 wxWndHook = NULL; 117 118 if (!m_hWnd) 119 return FALSE; 120 121 SubclassWin(GetHWND()); 122 123 if (pParent) 124 pParent->AddChild(this); 125 else 126 wxTopLevelWindows.Append(this); 127 return TRUE; 128} // end of wxWindow::LoadNativeDialog 129 130// --------------------------------------------------------------------------- 131// look for child by id 132// --------------------------------------------------------------------------- 133wxWindow* wxWindow::GetWindowChild1 ( 134 wxWindowID vId 135) 136{ 137 if (m_windowId == vId) 138 return this; 139 140 wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); 141 142 while (node) 143 { 144 wxWindow* pChild = node->GetData(); 145 wxWindow* pWin = pChild->GetWindowChild1(vId); 146 147 if (pWin) 148 return pWin; 149 150 node = node->GetNext(); 151 } 152 return NULL; 153} // end of wxWindow::GetWindowChild1 154 155wxWindow* wxWindow::GetWindowChild ( 156 wxWindowID vId 157) 158{ 159 wxWindow* pWin = GetWindowChild1(vId); 160 161 if (!pWin) 162 { 163 HWND hWnd = 0; // TODO: ::GetDlgItem((HWND) GetHWND(), id); 164 165 if (hWnd) 166 { 167 wxWindow* pChild = CreateWindowFromHWND( this 168 ,(WXHWND)hWnd 169 ); 170 if (pChild) 171 { 172 pChild->AddChild(this); 173 return pChild; 174 } 175 } 176 } 177 return NULL; 178} // end of wxWindow::GetWindowChild 179 180// --------------------------------------------------------------------------- 181// create wxWin window from a native HWND 182// --------------------------------------------------------------------------- 183 184wxWindow* wxWindow::CreateWindowFromHWND ( 185 wxWindow* pParent 186, WXHWND hWnd 187) 188{ 189 wxString sStr(wxGetWindowClass(hWnd)); 190 long lId = wxGetWindowId(hWnd); 191 long lStyle = ::WinQueryWindowULong((HWND)hWnd 192 ,QWL_STYLE 193 ); 194 wxWindow* pWin = NULL; 195 196 sStr.UpperCase(); 197 198 199 200 if (sStr == wxT("BUTTON")) 201 { 202 if (lStyle == BS_AUTOCHECKBOX) 203 { 204 pWin = new wxCheckBox; 205 } 206 else if (lStyle == BS_AUTORADIOBUTTON) 207 { 208 pWin = new wxRadioButton; 209 } 210 else if (lStyle & BS_BITMAP || lStyle == BS_USERBUTTON) 211 { 212 pWin = new wxBitmapButton; 213 } 214 else if (lStyle == BS_PUSHBUTTON) 215 { 216 pWin = new wxButton; 217 } 218 else if (lStyle == SS_GROUPBOX) 219 { 220 pWin = new wxStaticBox; 221 } 222 else 223 { 224 wxLogError(wxT("Don't know what kind of button this is: id = %ld"), 225 lId); 226 } 227 } 228 else if (sStr == wxT("COMBOBOX")) 229 { 230 pWin = new wxComboBox; 231 } 232 else if (sStr == wxT("EDIT")) 233 { 234 pWin = new wxTextCtrl; 235 } 236 else if (sStr == wxT("LISTBOX")) 237 { 238 pWin = new wxListBox; 239 } 240 else if (sStr == wxT("SCROLLBAR")) 241 { 242 pWin = new wxScrollBar; 243 } 244 else if (sStr == wxT("MSCTLS_UPDOWN32")) 245 { 246 pWin = new wxSpinButton; 247 } 248 else if (sStr == wxT("MSCTLS_TRACKBAR32")) 249 { 250 pWin = new wxSlider; 251 } 252 else if (sStr == wxT("STATIC")) 253 { 254 if (lStyle == SS_TEXT) 255 pWin = new wxStaticText; 256 else if (lStyle == SS_ICON) 257 { 258 pWin = new wxStaticBitmap; 259 } 260 } 261 else 262 { 263 wxString sMsg(wxT("Don't know how to convert from Windows class ")); 264 265 sMsg += sStr; 266 wxLogError(sMsg); 267 } 268 if (pWin) 269 { 270 pParent->AddChild(pWin); 271 pWin->SetEventHandler(pWin); 272 pWin->SetHWND(hWnd); 273 pWin->SetId(lId); 274 pWin->SubclassWin(hWnd); 275 pWin->AdoptAttributesFromHWND(); 276 pWin->SetupColours(); 277 return pWin; 278 } 279 else 280 return NULL; 281} // end of wxWindow::CreateWindowFromHWND 282 283// 284// Make sure the window style (etc.) reflects the HWND style (roughly) 285// 286void wxWindow::AdoptAttributesFromHWND() 287{ 288 // Does nothing under OS/2 289} // end of wxWindow::AdoptAttributesFromHWND 290 291