X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c4d305b7bd7c0889bb6300775d66d31bf42a5e4a..5a8f04e382a2b5ebeb50e8719889910f813b9d11:/src/msw/dialog.cpp diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index 78d54abe46..3fbad08474 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -61,12 +61,6 @@ // globals // ---------------------------------------------------------------------------- -// all objects to be deleted during next idle processing - from window.cpp -extern wxList WXDLLEXPORT wxPendingDelete; - -// all frames and modeless dialogs - not static, used in frame.cpp, mdi.cpp &c -wxWindowList wxModelessWindows; - // all modal dialogs currently shown static wxWindowList wxModalDialogs; @@ -74,9 +68,9 @@ static wxWindowList wxModalDialogs; // wxWin macros // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel) +IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxTopLevelWindow) -BEGIN_EVENT_TABLE(wxDialog, wxPanel) +BEGIN_EVENT_TABLE(wxDialog, wxTopLevelWindow) EVT_BUTTON(wxID_OK, wxDialog::OnOK) EVT_BUTTON(wxID_APPLY, wxDialog::OnApply) EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel) @@ -117,83 +111,25 @@ bool wxDialog::Create(wxWindow *parent, { Init(); - m_oldFocus = FindFocus(); - - SetName(name); - - wxTopLevelWindows.Append(this); - - if ( parent ) - parent->AddChild(this); - - if ( id == -1 ) - m_windowId = (int)NewControlId(); - else - m_windowId = id; - - int x = pos.x; - int y = pos.y; - int width = size.x; - int height = size.y; - - if (x < 0) - x = wxDIALOG_DEFAULT_X; - if (y < 0) - y = wxDIALOG_DEFAULT_Y; + SetExtraStyle(GetExtraStyle() | wxTOPLEVEL_EX_DIALOG); - m_windowStyle = style; - - if (width < 0) - width = wxDIALOG_DEFAULT_WIDTH; - if (height < 0) - height = wxDIALOG_DEFAULT_HEIGHT; + // save focus before doing anything which can potentially change it + m_oldFocus = FindFocus(); // All dialogs should really have this style - m_windowStyle |= wxTAB_TRAVERSAL; - - WXDWORD extendedStyle = MakeExtendedStyle(m_windowStyle); - if (m_windowStyle & wxSTAY_ON_TOP) - extendedStyle |= WS_EX_TOPMOST; - -#ifndef __WIN16__ - if (m_exStyle & wxDIALOG_EX_CONTEXTHELP) - extendedStyle |= WS_EX_CONTEXTHELP; -#endif - - // Allows creation of dialogs with & without captions under MSWindows, - // resizeable or not (but a resizeable dialog always has caption - - // otherwise it would look too strange) - const wxChar *dlg; - if ( style & wxRESIZE_BORDER ) - dlg = wxT("wxResizeableDialog"); - else if ( style & wxCAPTION ) - dlg = wxT("wxCaptionDialog"); - else - dlg = wxT("wxNoCaptionDialog"); - MSWCreate(m_windowId, parent, NULL, this, NULL, - x, y, width, height, - 0, // style is not used if we have dlg template - dlg, - extendedStyle); - - HWND hwnd = (HWND)GetHWND(); - - if ( !hwnd ) - { - wxFAIL_MSG(_("Failed to create dialog. You probably forgot to include wx/msw/wx.rc in your resources.")); + style |= wxTAB_TRAVERSAL; + if ( !wxTopLevelWindow::Create(parent, id, title, pos, size, style, name) ) return FALSE; - } - - SubclassWin(GetHWND()); - SetWindowText(hwnd, title); + SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT)); return TRUE; } bool wxDialog::EnableCloseButton(bool enable) { +#ifndef __WXMICROWIN__ // get system (a.k.a. window) menu HMENU hmenu = ::GetSystemMenu(GetHwnd(), FALSE /* get it */); if ( !hmenu ) @@ -208,7 +144,7 @@ bool wxDialog::EnableCloseButton(bool enable) if ( !::EnableMenuItem(hmenu, SC_CLOSE, MF_BYCOMMAND | (enable ? MF_ENABLED : MF_GRAYED)) ) { - wxLogLastError(_T("DeleteMenu(SC_CLOSE)")); + wxLogLastError(_T("EnableMenuItem(SC_CLOSE)")); return FALSE; } @@ -218,6 +154,7 @@ bool wxDialog::EnableCloseButton(bool enable) { wxLogLastError(_T("DrawMenuBar")); } +#endif return TRUE; } @@ -242,24 +179,8 @@ wxDialog::~wxDialog() { m_isBeingDeleted = TRUE; - wxTopLevelWindows.DeleteObject(this); - // this will also reenable all the other windows for a modal dialog Show(FALSE); - - if ( !IsModal() ) - wxModelessWindows.DeleteObject(this); - - // If this is the last top-level window, exit. - if ( wxTheApp && (wxTopLevelWindows.Number() == 0) ) - { - wxTheApp->SetTopWindow(NULL); - - if ( wxTheApp->GetExitOnFrameDelete() ) - { - ::PostQuitMessage(0); - } - } } // ---------------------------------------------------------------------------- @@ -291,56 +212,6 @@ void wxDialog::OnCharHook(wxKeyEvent& event) event.Skip(); } -// ---------------------------------------------------------------------------- -// Windows dialog boxes can't be iconized -// ---------------------------------------------------------------------------- - -void wxDialog::Iconize(bool WXUNUSED(iconize)) -{ -} - -bool wxDialog::IsIconized() const -{ - return FALSE; -} - -// ---------------------------------------------------------------------------- -// size/position handling -// ---------------------------------------------------------------------------- - -void wxDialog::DoSetClientSize(int width, int height) -{ - HWND hWnd = (HWND) GetHWND(); - RECT rect; - ::GetClientRect(hWnd, &rect); - - RECT rect2; - GetWindowRect(hWnd, &rect2); - - // Find the difference between the entire window (title bar and all) - // and the client area; add this to the new client size to move the - // window - int actual_width = rect2.right - rect2.left - rect.right + width; - int actual_height = rect2.bottom - rect2.top - rect.bottom + height; - - MoveWindow(hWnd, rect2.left, rect2.top, actual_width, actual_height, TRUE); - - wxSizeEvent event(wxSize(actual_width, actual_height), m_windowId); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event); -} - -void wxDialog::DoGetPosition(int *x, int *y) const -{ - RECT rect; - GetWindowRect(GetHwnd(), &rect); - - if ( x ) - *x = rect.left; - if ( y ) - *y = rect.top; -} - // ---------------------------------------------------------------------------- // showing the dialogs // ---------------------------------------------------------------------------- @@ -557,17 +428,6 @@ void wxDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) closing.DeleteObject(this); } -// Destroy the window (delayed, if a managed window) -bool wxDialog::Destroy() -{ - wxCHECK_MSG( !wxPendingDelete.Member(this), FALSE, - _T("wxDialog destroyed twice") ); - - wxPendingDelete.Append(this); - - return TRUE; -} - void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event)) { #if wxUSE_CTL3D @@ -624,6 +484,7 @@ long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) processed = !Close(); break; +#ifndef __WXMICROWIN__ case WM_SETCURSOR: // we want to override the busy cursor for modal dialogs: // typically, wxBeginBusyCursor() is called and then a modal dialog @@ -649,6 +510,7 @@ long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) rc = FALSE; } break; +#endif // __WXMICROWIN__ } if ( !processed )