X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9aa80360d1530664f499a307356f11ed3ab9a127..abb855613bbedf1b3b4e5355c8f0bc30d2274ef8:/src/msw/dialog.cpp diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index bc03783404..ac887e8c85 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -41,7 +41,7 @@ #include "wx/msw/private.h" #include "wx/log.h" -#if wxUSE_COMMON_DIALOGS +#if wxUSE_COMMON_DIALOGS && !defined(__WXMICROWIN__) #include #endif @@ -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,130 +111,19 @@ 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; - - m_windowStyle = style; + SetExtraStyle(GetExtraStyle() | wxTOPLEVEL_EX_DIALOG); - 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"); - -#ifdef __WXMICROWIN__ - extern const wxChar *wxFrameClassName; - - int msflags = WS_OVERLAPPED|WS_POPUP; - if (style & wxCAPTION) - msflags |= WS_CAPTION; - if (style & wxCLIP_CHILDREN) - msflags |= WS_CLIPCHILDREN; - if ((style & wxTHICK_FRAME) == 0) - msflags |= WS_BORDER; - MSWCreate(m_windowId, parent, wxFrameClassName, this, NULL, - x, y, width, height, - msflags, - NULL, - extendedStyle); - -#else - MSWCreate(m_windowId, parent, NULL, this, NULL, - x, y, width, height, - 0, // style is not used if we have dlg template - dlg, - extendedStyle); -#endif - 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; - } - -#ifndef __WXMICROWIN__ - SubclassWin(GetHWND()); -#endif - - SetWindowText(hwnd, title); - return TRUE; -} + SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT)); -bool wxDialog::EnableCloseButton(bool enable) -{ -#ifndef __WXMICROWIN__ - // get system (a.k.a. window) menu - HMENU hmenu = ::GetSystemMenu(GetHwnd(), FALSE /* get it */); - if ( !hmenu ) - { - wxLogLastError(_T("GetSystemMenu")); - - return FALSE; - } - - // enabling/disabling the close item from it also automatically - // disables/enabling the close title bar button - if ( !::EnableMenuItem(hmenu, SC_CLOSE, - MF_BYCOMMAND | (enable ? MF_ENABLED : MF_GRAYED)) ) - { - wxLogLastError(_T("EnableMenuItem(SC_CLOSE)")); - - return FALSE; - } - - // update appearance immediately - if ( !::DrawMenuBar(GetHwnd()) ) - { - wxLogLastError(_T("DrawMenuBar")); - } -#endif - return TRUE; } @@ -264,24 +147,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); - } - } } // ---------------------------------------------------------------------------- @@ -313,56 +180,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 // ---------------------------------------------------------------------------- @@ -473,18 +290,6 @@ bool wxDialog::Show(bool show) { // use it m_parent = parent; - - // VZ: to make dialog behave properly we should reparent - // the dialog for Windows as well - unfortunately, - // following the docs for SetParent() results in this - // code which plainly doesn't work -#if 0 - long dwStyle = ::GetWindowLong(GetHwnd(), GWL_STYLE); - dwStyle &= ~WS_POPUP; - dwStyle |= WS_CHILD; - ::SetWindowLong(GetHwnd(), GWL_STYLE, dwStyle); - ::SetParent(GetHwnd(), GetHwndOf(parent)); -#endif // 0 } } @@ -579,17 +384,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 @@ -672,7 +466,7 @@ long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) rc = FALSE; } break; -#endif +#endif // __WXMICROWIN__ } if ( !processed )