From c4d305b7bd7c0889bb6300775d66d31bf42a5e4a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 9 Jun 2001 16:49:56 +0000 Subject: [PATCH] fixed bug 424212 (unworking close button in the progress dialog) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10473 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/dialog.h | 3 +++ src/generic/progdlgg.cpp | 30 ++++++++++++++++++++++++------ src/msw/dialog.cpp | 30 ++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/include/wx/msw/dialog.h b/include/wx/msw/dialog.h index f97ed29db0..5fb90d68c3 100644 --- a/include/wx/msw/dialog.h +++ b/include/wx/msw/dialog.h @@ -82,6 +82,9 @@ public: bool Iconized() const { return IsIconized(); }; #endif + // wxMSW only: remove the "Close" button from the dialog + bool EnableCloseButton(bool enable = TRUE); + // implementation only from now on // ------------------------------- diff --git a/src/generic/progdlgg.cpp b/src/generic/progdlgg.cpp index e9c031ab2a..2153f420dd 100644 --- a/src/generic/progdlgg.cpp +++ b/src/generic/progdlgg.cpp @@ -92,6 +92,18 @@ wxProgressDialog::wxProgressDialog(wxString const &title, m_windowStyle |= style; bool hasAbortButton = (style & wxPD_CAN_ABORT) != 0; + +#ifdef __WXMSW__ + // we have to remove the "Close" button from the title bar then as it is + // confusing to have it - it doesn't work anyhow + // + // FIXME: should probably have a (extended?) window style for this + if ( !hasAbortButton ) + { + EnableCloseButton(FALSE); + } +#endif // wxMSW + m_state = hasAbortButton ? Continue : Uncancelable; m_maximum = maximum; @@ -123,13 +135,13 @@ wxProgressDialog::wxProgressDialog(wxString const &title, if ( maximum > 0 ) { + // note that we can't use wxGA_SMOOTH because it happens to also mean + // wxDIALOG_MODAL and will cause the dialog to be modal. Have an extra + // style argument to wxProgressDialog, perhaps. m_gauge = new wxGauge(this, -1, maximum, - wxDefaultPosition, wxDefaultSize, - wxGA_HORIZONTAL | wxRAISED_BORDER); -// Sorry, but wxGA_SMOOTH happens to also mean wxDIALOG_MODAL and will -// cause the dialog to be modal. Have an extra style argument to wxProgressDialog, -// perhaps. -// wxGA_HORIZONTAL | wxRAISED_BORDER | (style & wxGA_SMOOTH)); + wxDefaultPosition, wxDefaultSize, + wxGA_HORIZONTAL); + c = new wxLayoutConstraints; c->left.SameAs(this, wxLeft, 2*LAYOUT_X_MARGIN); c->top.Below(m_msg, 2*LAYOUT_Y_MARGIN); @@ -309,6 +321,12 @@ wxProgressDialog::Update(int value, const wxString& newmsg) // tell the user what he should do... m_btnAbort->SetLabel(_("Close")); } +#ifdef __WXMSW__ + else // enable the close button to give the user a way to close the dlg + { + EnableCloseButton(TRUE); + } +#endif // __WXMSW__ if ( !newmsg ) { diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index 4b4259a099..78d54abe46 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -192,6 +192,36 @@ bool wxDialog::Create(wxWindow *parent, return TRUE; } +bool wxDialog::EnableCloseButton(bool enable) +{ + // 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("DeleteMenu(SC_CLOSE)")); + + return FALSE; + } + + // update appearance immediately + if ( !::DrawMenuBar(GetHwnd()) ) + { + wxLogLastError(_T("DrawMenuBar")); + } + + return TRUE; +} + void wxDialog::SetModal(bool flag) { if ( flag ) -- 2.47.2