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
This commit is contained in:
Vadim Zeitlin
2007-10-07 22:11:55 +00:00
parent f73eddd2a5
commit 8e5dbcdd50
3 changed files with 16 additions and 18 deletions

View File

@@ -168,6 +168,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(DIALOGS_CENTRE_SCREEN, MyFrame::DlgCenteredScreen) EVT_MENU(DIALOGS_CENTRE_SCREEN, MyFrame::DlgCenteredScreen)
EVT_MENU(DIALOGS_CENTRE_PARENT, MyFrame::DlgCenteredParent) EVT_MENU(DIALOGS_CENTRE_PARENT, MyFrame::DlgCenteredParent)
EVT_MENU(DIALOGS_MINIFRAME, MyFrame::MiniFrame) EVT_MENU(DIALOGS_MINIFRAME, MyFrame::MiniFrame)
EVT_MENU(DIALOGS_ONTOP, MyFrame::DlgOnTop)
#if wxUSE_STARTUP_TIPS #if wxUSE_STARTUP_TIPS
EVT_MENU(DIALOGS_TIP, MyFrame::ShowTip) 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_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_CENTRE_PARENT, _T("Centered on &parent\tShift-Ctrl-2"));
dialogs_menu->Append(DIALOGS_MINIFRAME, _T("&Mini frame")); 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); menuDlg->Append(wxID_ANY, _T("&Generic dialogs"), dialogs_menu);
#if USE_SETTINGS_DIALOG #if USE_SETTINGS_DIALOG
@@ -1057,6 +1059,15 @@ void MyFrame::MiniFrame(wxCommandEvent& WXUNUSED(event))
frame->Show(); 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 #if wxUSE_STARTUP_TIPS
void MyFrame::ShowTip(wxCommandEvent& WXUNUSED(event)) void MyFrame::ShowTip(wxCommandEvent& WXUNUSED(event))
{ {

View File

@@ -268,6 +268,7 @@ public:
void DlgCenteredScreen(wxCommandEvent& event); void DlgCenteredScreen(wxCommandEvent& event);
void DlgCenteredParent(wxCommandEvent& event); void DlgCenteredParent(wxCommandEvent& event);
void MiniFrame(wxCommandEvent& event); void MiniFrame(wxCommandEvent& event);
void DlgOnTop(wxCommandEvent& event);
#if wxUSE_PROGRESSDLG #if wxUSE_PROGRESSDLG
void ShowProgress(wxCommandEvent& event); void ShowProgress(wxCommandEvent& event);
@@ -366,6 +367,7 @@ enum
DIALOGS_CENTRE_SCREEN, DIALOGS_CENTRE_SCREEN,
DIALOGS_CENTRE_PARENT, DIALOGS_CENTRE_PARENT,
DIALOGS_MINIFRAME, DIALOGS_MINIFRAME,
DIALOGS_ONTOP,
DIALOGS_MODELESS_BTN, DIALOGS_MODELESS_BTN,
DIALOGS_PROGRESS, DIALOGS_PROGRESS,
DIALOGS_ABOUTDLG_SIMPLE, DIALOGS_ABOUTDLG_SIMPLE,

View File

@@ -423,25 +423,10 @@ bool wxTopLevelWindowMSW::CreateDialog(const void *dlgTemplate,
return false; 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__) #if !defined(__WXWINCE__)
// For some reason, the system menu is activated when we use the // For some reason, the system menu is activated when we use the
// WS_EX_CONTEXTHELP style, so let's set a reasonable icon // 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); wxFrame *winTop = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame);
if ( winTop ) 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 // move the dialog to its initial position without forcing repainting
int x, y, w, h; 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 // reuse the code in MSWGetStyle() but correct the results slightly for
// the dialog // the dialog
dlgTemplate->style = MSWGetStyle(style, NULL); dlgTemplate->style = MSWGetStyle(style, &dlgTemplate->dwExtendedStyle);
// all dialogs are popups // all dialogs are popups
dlgTemplate->style |= WS_POPUP; dlgTemplate->style |= WS_POPUP;