X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b0a6bb75bcd4b5a4873d766a9208ac6376fe8625..0cbff1201aa47e2b73ec90a97886f18e88270ea6:/src/msw/dialog.cpp diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index 9ae185092d..bc03783404 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -107,7 +107,8 @@ void wxDialog::Init() SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); } -bool wxDialog::Create(wxWindow *parent, wxWindowID id, +bool wxDialog::Create(wxWindow *parent, + wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, @@ -122,9 +123,8 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, wxTopLevelWindows.Append(this); - // windowFont = wxTheFontList->FindOrCreateFont(11, wxSWISS, wxNORMAL, wxNORMAL); - - if (parent) parent->AddChild(this); + if ( parent ) + parent->AddChild(this); if ( id == -1 ) m_windowId = (int)NewControlId(); @@ -159,6 +159,7 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, 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) @@ -169,12 +170,30 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, 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 ) @@ -184,14 +203,47 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id, return FALSE; } +#ifndef __WXMICROWIN__ SubclassWin(GetHWND()); - +#endif + 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 ) + { + 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; +} + void wxDialog::SetModal(bool flag) { if ( flag ) @@ -370,11 +422,6 @@ void wxDialog::DoShowModal() wxTheApp->DoMessage(); } -#if 0 //def __WIN32__ - if ( parent ) - ::SetActiveWindow(GetHwndOf(parent)); -#endif // __WIN32__ - // and restore focus // Note that this code MUST NOT access the dialog object's data // in case the object has been deleted (which will be the case @@ -426,6 +473,18 @@ 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 } } @@ -469,7 +528,7 @@ void wxDialog::EndModal(int retCode) // ---------------------------------------------------------------------------- // Standard buttons -void wxDialog::OnOK(wxCommandEvent& event) +void wxDialog::OnOK(wxCommandEvent& WXUNUSED(event)) { if ( Validate() && TransferDataFromWindow() ) { @@ -477,7 +536,7 @@ void wxDialog::OnOK(wxCommandEvent& event) } } -void wxDialog::OnApply(wxCommandEvent& event) +void wxDialog::OnApply(wxCommandEvent& WXUNUSED(event)) { if ( Validate() ) TransferDataFromWindow(); @@ -485,12 +544,12 @@ void wxDialog::OnApply(wxCommandEvent& event) // TODO probably need to disable the Apply button until things change again } -void wxDialog::OnCancel(wxCommandEvent& event) +void wxDialog::OnCancel(wxCommandEvent& WXUNUSED(event)) { EndModal(wxID_CANCEL); } -void wxDialog::OnCloseWindow(wxCloseEvent& event) +void wxDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { // We'll send a Cancel message by default, which may close the dialog. // Check for looping if the Cancel event handler calls Close(). @@ -531,7 +590,7 @@ bool wxDialog::Destroy() return TRUE; } -void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event) +void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event)) { #if wxUSE_CTL3D Ctl3dColorChange(); @@ -587,6 +646,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 @@ -612,6 +672,7 @@ long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) rc = FALSE; } break; +#endif } if ( !processed )