From 8e5dbcdd50eeb0ebdd8ad29180b9d3da6dc3d1d0 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 7 Oct 2007 22:11:55 +0000 Subject: [PATCH] simplify the code for extended flags handling fixing a rare bug with wxSTAY_ON_TOP being ignored in some situations git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49086 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/dialogs/dialogs.cpp | 11 +++++++++++ samples/dialogs/dialogs.h | 2 ++ src/msw/toplevel.cpp | 21 +++------------------ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp index 7c7c6282c7..18b12f67b8 100644 --- a/samples/dialogs/dialogs.cpp +++ b/samples/dialogs/dialogs.cpp @@ -168,6 +168,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(DIALOGS_CENTRE_SCREEN, MyFrame::DlgCenteredScreen) EVT_MENU(DIALOGS_CENTRE_PARENT, MyFrame::DlgCenteredParent) EVT_MENU(DIALOGS_MINIFRAME, MyFrame::MiniFrame) + EVT_MENU(DIALOGS_ONTOP, MyFrame::DlgOnTop) #if wxUSE_STARTUP_TIPS EVT_MENU(DIALOGS_TIP, MyFrame::ShowTip) @@ -390,6 +391,7 @@ bool MyApp::OnInit() dialogs_menu->Append(DIALOGS_CENTRE_SCREEN, _T("Centered on &screen\tShift-Ctrl-1")); dialogs_menu->Append(DIALOGS_CENTRE_PARENT, _T("Centered on &parent\tShift-Ctrl-2")); dialogs_menu->Append(DIALOGS_MINIFRAME, _T("&Mini frame")); + dialogs_menu->Append(DIALOGS_ONTOP, _T("Dialog staying on &top")); menuDlg->Append(wxID_ANY, _T("&Generic dialogs"), dialogs_menu); #if USE_SETTINGS_DIALOG @@ -1057,6 +1059,15 @@ void MyFrame::MiniFrame(wxCommandEvent& WXUNUSED(event)) frame->Show(); } +void MyFrame::DlgOnTop(wxCommandEvent& WXUNUSED(event)) +{ + wxDialog dlg(this, wxID_ANY, _T("Dialog staying on top of other windows"), + wxDefaultPosition, wxSize(300, 100), + wxDEFAULT_DIALOG_STYLE | wxSTAY_ON_TOP); + (new wxButton(&dlg, wxID_OK, _T("Close")))->Centre(); + dlg.ShowModal(); +} + #if wxUSE_STARTUP_TIPS void MyFrame::ShowTip(wxCommandEvent& WXUNUSED(event)) { diff --git a/samples/dialogs/dialogs.h b/samples/dialogs/dialogs.h index f24154b8e9..62ff683de9 100644 --- a/samples/dialogs/dialogs.h +++ b/samples/dialogs/dialogs.h @@ -268,6 +268,7 @@ public: void DlgCenteredScreen(wxCommandEvent& event); void DlgCenteredParent(wxCommandEvent& event); void MiniFrame(wxCommandEvent& event); + void DlgOnTop(wxCommandEvent& event); #if wxUSE_PROGRESSDLG void ShowProgress(wxCommandEvent& event); @@ -366,6 +367,7 @@ enum DIALOGS_CENTRE_SCREEN, DIALOGS_CENTRE_PARENT, DIALOGS_MINIFRAME, + DIALOGS_ONTOP, DIALOGS_MODELESS_BTN, DIALOGS_PROGRESS, DIALOGS_ABOUTDLG_SIMPLE, diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index bfd3f56b4d..86ac85d33e 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -423,25 +423,10 @@ bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate, return false; } - WXDWORD exflags; - (void)MSWGetCreateWindowFlags(&exflags); - - if ( exflags ) - { - ::SetWindowLong(GetHwnd(), GWL_EXSTYLE, exflags); - ::SetWindowPos(GetHwnd(), - exflags & WS_EX_TOPMOST ? HWND_TOPMOST : 0, - 0, 0, 0, 0, - SWP_NOSIZE | - SWP_NOMOVE | - (exflags & WS_EX_TOPMOST ? 0 : SWP_NOZORDER) | - SWP_NOACTIVATE); - } - #if !defined(__WXWINCE__) // For some reason, the system menu is activated when we use the // WS_EX_CONTEXTHELP style, so let's set a reasonable icon - if ( exflags & WS_EX_CONTEXTHELP ) + if ( HasExtraStyle(wxWS_EX_CONTEXTHELP) ) { wxFrame *winTop = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame); if ( winTop ) @@ -455,7 +440,7 @@ bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate, } } } -#endif +#endif // !__WXWINCE__ // move the dialog to its initial position without forcing repainting int x, y, w, h; @@ -561,7 +546,7 @@ bool wxTopLevelWindowMSW::Create(wxWindow *parent, // reuse the code in MSWGetStyle() but correct the results slightly for // the dialog - dlgTemplate->style = MSWGetStyle(style, NULL); + dlgTemplate->style = MSWGetStyle(style, &dlgTemplate->dwExtendedStyle); // all dialogs are popups dlgTemplate->style |= WS_POPUP; -- 2.45.2