1. wxWindowDisabler modified to bring parent window back to top under MSW

2. modal dialogs without parent now use the app top window as parent or use
   wxWindowDisabler if none
3. modal dialogs bring parent windows to top when activated
4. wxBase dsp will now compile it with MT CRT


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6451 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2000-03-05 02:12:04 +00:00
parent 41fd4136fc
commit 5e1febface
5 changed files with 111 additions and 32 deletions

View File

@ -73,7 +73,7 @@ RSC=rc.exe
# PROP Output_Dir "BaseRelease" # PROP Output_Dir "BaseRelease"
# PROP Intermediate_Dir "BaseRelease" # PROP Intermediate_Dir "BaseRelease"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D _MT /YX /FD /c # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D _MT /YX /FD /c
# ADD CPP /nologo /W3 /Zi /O2 /I "$(wx)\include" /I "$(wx)\src\zlib" /D "NDEBUG" /D wxUSE_GUI=0 /D WIN95=1 /D "__WIN95__" /D "WIN32" /D "_WIN32" /D WINVER=0x400 /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN32__" /D _MT /Yu"wx/wxprec.h" /FD /c # ADD CPP /nologo /W3 /Zi /O2 /I "$(wx)\include" /I "$(wx)\src\zlib" /D "NDEBUG" /D wxUSE_GUI=0 /D WIN95=1 /D "__WIN95__" /D "WIN32" /D "_WIN32" /D WINVER=0x400 /D "__WINDOWS__" /D "__WXMSW__" /D "__WIN32__" /D _MT /Yu"wx/wxprec.h" /FD /c
# ADD BASE RSC /l 0x409 # ADD BASE RSC /l 0x409
# ADD RSC /l 0x409 # ADD RSC /l 0x409
@ -96,7 +96,7 @@ LIB32=link.exe -lib
# PROP Output_Dir "BaseDebug" # PROP Output_Dir "BaseDebug"
# PROP Intermediate_Dir "BaseDebug" # PROP Intermediate_Dir "BaseDebug"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D _MT /YX /FD /c # ADD BASE CPP /nologo /MTd /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D _MT /YX /FD /c
# ADD CPP /nologo /W4 /Zi /Od /I "$(wx)\include" /I "$(wx)\src\zlib" /D "_DEBUG" /D DEBUG=1 /D WXDEBUG=1 /D "__WXDEBUG__" /D wxUSE_GUI=0 /D "__WIN95__" /D "WIN32" /D "_WIN32" /D WINVER=0x400 /D "__WINDOWS__" /D "__WIN32__" /D "__WXMSW__" /D _MT /Fr /Yu"wx/wxprec.h" /FD /c # ADD CPP /nologo /W4 /Zi /Od /I "$(wx)\include" /I "$(wx)\src\zlib" /D "_DEBUG" /D DEBUG=1 /D WXDEBUG=1 /D "__WXDEBUG__" /D wxUSE_GUI=0 /D "__WIN95__" /D "WIN32" /D "_WIN32" /D WINVER=0x400 /D "__WINDOWS__" /D "__WIN32__" /D "__WXMSW__" /D _MT /Fr /Yu"wx/wxprec.h" /FD /c
# ADD BASE RSC /l 0x409 # ADD BASE RSC /l 0x409
# ADD RSC /l 0x409 # ADD RSC /l 0x409

View File

@ -290,6 +290,10 @@ public:
private: private:
wxWindowList *m_winDisabled; wxWindowList *m_winDisabled;
#ifdef __WXMSW__
wxWindow *m_winTop;
#endif // MSW
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@ -78,7 +78,7 @@
#endif #endif
#ifdef __WXMSW__ #ifdef __WXMSW__
#include "windows.h" #include "wx/msw/private.h"
#endif #endif
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -983,6 +983,12 @@ wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip)
// remember all windows we're going to (temporarily) disable // remember all windows we're going to (temporarily) disable
m_winDisabled = new wxWindowList; m_winDisabled = new wxWindowList;
#ifdef __WXMSW__
// and the top level window too
HWND hwndFG = ::GetForegroundWindow();
m_winTop = hwndFG ? wxFindWinFromHandle((WXHWND)hwndFG) : (wxWindow *)NULL;
#endif // MSW
wxWindowList::Node *node; wxWindowList::Node *node;
for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() )
{ {
@ -1013,6 +1019,16 @@ wxWindowDisabler::~wxWindowDisabler()
} }
delete m_winDisabled; delete m_winDisabled;
#ifdef __WXMSW__
if ( m_winTop )
{
if ( !::SetForegroundWindow(GetHwndOf(m_winTop)) )
{
wxLogLastError("SetForegroundWindow");
}
}
#endif // MSW
} }
// Yield to other apps/messages and disable user input to all windows except // Yield to other apps/messages and disable user input to all windows except
@ -1188,7 +1204,7 @@ long wxExecute(const wxString& command, wxArrayString& output)
{ {
wxInputStream& is = *process->GetInputStream(); wxInputStream& is = *process->GetInputStream();
wxTextInputStream tis(is); wxTextInputStream tis(is);
while ( !is.Eof() ) while ( !is.Eof() && is.IsOk() )
{ {
wxString line = tis.ReadLine(); wxString line = tis.ReadLine();
if ( is.LastError() ) if ( is.LastError() )

View File

@ -419,8 +419,29 @@ bool wxDialog::Show(bool show)
// Replacement for Show(TRUE) for modal dialogs - returns return code // Replacement for Show(TRUE) for modal dialogs - returns return code
int wxDialog::ShowModal() int wxDialog::ShowModal()
{ {
// modal dialog needs a parent window, so try to find one
if ( !GetParent() )
{
wxWindow *parent = wxTheApp->GetTopWindow();
if ( parent && parent != this )
{
// use it
m_parent = parent;
}
}
wxWindowDisabler *wd = (wxWindowDisabler *)NULL;
if ( !GetParent() )
{
// still no parent? make the dialog app modal by disabling all windows
wd = new wxWindowDisabler(this);
}
m_windowStyle |= wxDIALOG_MODAL; m_windowStyle |= wxDIALOG_MODAL;
Show(TRUE); Show(TRUE);
delete wd;
return GetReturnCode(); return GetReturnCode();
} }
@ -521,6 +542,33 @@ long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
switch ( message ) switch ( message )
{ {
case WM_ACTIVATE:
switch ( LOWORD(wParam) )
{
case WA_ACTIVE:
case WA_CLICKACTIVE:
if ( IsModalShowing() && GetParent() )
{
// bring the owner window to top as the standard dialog
// boxes do
if ( !::SetWindowPos
(
GetHwndOf(GetParent()),
GetHwnd(),
0, 0,
0, 0,
SWP_NOACTIVATE |
SWP_NOMOVE |
SWP_NOSIZE
) )
{
wxLogLastError("SetWindowPos(SWP_NOACTIVATE)");
}
}
// fall through to process it normally as well
}
break;
case WM_CLOSE: case WM_CLOSE:
// if we can't close, tell the system that we processed the // if we can't close, tell the system that we processed the
// message - otherwise it would close us // message - otherwise it would close us

View File

@ -402,14 +402,16 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
return result; return result;
#else // 1 #else // 1
HANDLE h_readPipe[2]; HANDLE hpipeRead[2];
HANDLE h_writePipe[2]; HANDLE hpipeWrite[2];
HANDLE h_oldreadPipe; HANDLE hStdIn = INVALID_HANDLE_VALUE;
HANDLE h_oldwritePipe; HANDLE hStdOut = INVALID_HANDLE_VALUE;
BOOL inheritHandles;
// we need to inherit handles in the child process if we want to redirect
// its IO
BOOL inheritHandles = FALSE;
// open the pipes to which child process IO will be redirected if needed // open the pipes to which child process IO will be redirected if needed
inheritHandles = FALSE;
if ( handler && handler->IsRedirected() ) if ( handler && handler->IsRedirected() )
{ {
SECURITY_ATTRIBUTES security; SECURITY_ATTRIBUTES security;
@ -418,17 +420,17 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
security.lpSecurityDescriptor = NULL; security.lpSecurityDescriptor = NULL;
security.bInheritHandle = TRUE; security.bInheritHandle = TRUE;
if (! ::CreatePipe(&h_readPipe[0], &h_readPipe[1], &security, 0) ) if ( !::CreatePipe(&hpipeRead[0], &hpipeRead[1], &security, 0) )
{ {
wxLogSysError(_("Can't create the inter-process read pipe")); wxLogSysError(_("Can't create the inter-process read pipe"));
return 0; return 0;
} }
if (! ::CreatePipe(&h_writePipe[0], &h_writePipe[1], &security, 0) ) if ( !::CreatePipe(&hpipeWrite[0], &hpipeWrite[1], &security, 0) )
{ {
::CloseHandle(h_readPipe[0]); ::CloseHandle(hpipeRead[0]);
::CloseHandle(h_readPipe[1]); ::CloseHandle(hpipeRead[1]);
wxLogSysError(_("Can't create the inter-process write pipe")); wxLogSysError(_("Can't create the inter-process write pipe"));
@ -437,11 +439,14 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
// We need to save the old stdio handles to restore them after the call // We need to save the old stdio handles to restore them after the call
// to CreateProcess // to CreateProcess
h_oldreadPipe = GetStdHandle(STD_INPUT_HANDLE); hStdIn = ::GetStdHandle(STD_INPUT_HANDLE);
h_oldwritePipe = GetStdHandle(STD_OUTPUT_HANDLE); hStdOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
SetStdHandle(STD_INPUT_HANDLE, h_readPipe[0]); if ( !::SetStdHandle(STD_INPUT_HANDLE, hpipeRead[0]) ||
SetStdHandle(STD_OUTPUT_HANDLE, h_writePipe[1]); !::SetStdHandle(STD_OUTPUT_HANDLE, hpipeWrite[1]) )
{
wxLogDebug(_T("Failed to change stdin/out handles"));
}
inheritHandles = TRUE; inheritHandles = TRUE;
} }
@ -470,10 +475,10 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
{ {
if ( inheritHandles ) if ( inheritHandles )
{ {
::CloseHandle(h_writePipe[0]); ::CloseHandle(hpipeWrite[0]);
::CloseHandle(h_writePipe[1]); ::CloseHandle(hpipeWrite[1]);
::CloseHandle(h_readPipe[0]); ::CloseHandle(hpipeRead[0]);
::CloseHandle(h_readPipe[1]); ::CloseHandle(hpipeRead[1]);
} }
wxLogSysError(_("Execution of command '%s' failed"), command.c_str()); wxLogSysError(_("Execution of command '%s' failed"), command.c_str());
@ -482,17 +487,23 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
} }
// Restore the old stdio handles // Restore the old stdio handles
if (inheritHandles) { if ( inheritHandles )
SetStdHandle(STD_INPUT_HANDLE, h_oldreadPipe); {
SetStdHandle(STD_OUTPUT_HANDLE, h_oldwritePipe); if ( !::SetStdHandle(STD_INPUT_HANDLE, hStdIn) ||
!::SetStdHandle(STD_OUTPUT_HANDLE, hStdOut) )
{
wxLogDebug(_T("Failed to restore old stdin/out handles"));
}
// they're still opened in child process
::CloseHandle(hpipeWrite[1]);
::CloseHandle(hpipeRead[0]);
::CloseHandle(h_writePipe[1]);
::CloseHandle(h_readPipe[0]);
// We can now initialize the wxStreams // We can now initialize the wxStreams
wxInputStream *processOutput = new wxPipeInputStream(h_writePipe[0]); wxInputStream *inStream = new wxPipeInputStream(hpipeWrite[0]);
wxOutputStream *processInput = new wxPipeOutputStream(h_readPipe[1]); wxOutputStream *outStream = new wxPipeOutputStream(hpipeRead[1]);
handler->SetPipeStreams(processOutput, processInput); handler->SetPipeStreams(inStream, outStream);
} }
// register the class for the hidden window used for the notifications // register the class for the hidden window used for the notifications
@ -528,8 +539,8 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
data->state = sync; data->state = sync;
if ( sync ) if ( sync )
{ {
wxASSERT_MSG( !handler, wxT("wxProcess param ignored for sync execution") ); // handler may be !NULL for capturing program output, but we don't use
// it wxExecuteData struct in this case
data->handler = NULL; data->handler = NULL;
} }
else else