This allows to show message boxes in ports other than wxMSW too by doing it only when it is safe, i.e. when the GUI is initialized, while still keeping the old code directly using the native MessageBox() function for MSW for maximal robustness.
130 lines
4.1 KiB
C++
130 lines
4.1 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/msw/basemsw.cpp
|
|
// Purpose: misc stuff only used in console applications under MSW
|
|
// Author: Vadim Zeitlin
|
|
// Modified by:
|
|
// Created: 22.06.2003
|
|
// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// declarations
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// for compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/event.h"
|
|
#endif //WX_PRECOMP
|
|
|
|
#include "wx/apptrait.h"
|
|
#include "wx/evtloop.h"
|
|
#include "wx/msw/private/timer.h"
|
|
// MBN: this is a workaround for MSVC 5: if it is not #included in
|
|
// some wxBase file, wxRecursionGuard methods won't be exported from
|
|
// wxBase.dll, and MSVC 5 will give linker errors
|
|
#include "wx/recguard.h"
|
|
|
|
#include "wx/crt.h"
|
|
#include "wx/msw/private.h"
|
|
|
|
// ============================================================================
|
|
// wxAppTraits implementation
|
|
// ============================================================================
|
|
|
|
bool wxAppTraits::SafeMessageBox(const wxString& text,
|
|
const wxString& title)
|
|
{
|
|
const HWND hwndParent = GetMainHWND();
|
|
int flags = MB_OK | MB_ICONSTOP;
|
|
|
|
// Using MB_TASKMODAL with valid parent doesn't work well because it
|
|
// prevents the typical behaviour of modal message boxes, e.g. the message
|
|
// box doesn't come up to front when the parent is clicked. But if we don't
|
|
// have any parent anyhow, we can just as well use it, as we don't lose
|
|
// anything and it has a useful side effect of disabling any existing TLWs
|
|
// if there are any.
|
|
//
|
|
// Note that we also might have chosen to always use MB_TASKMODAL and NULL
|
|
// parent. This would have the advantage of always disabling all the window
|
|
// which, but at the cost of the behaviour mentioned above and other
|
|
// related problems, e.g. showing ugly default icon in Alt-Tab list and an
|
|
// extra taskbar button for the message box, so we don't do this, although
|
|
// perhaps we still should, at least in case when there is more than one
|
|
// TLW (but we can't check for this easily as this is non-GUI code and
|
|
// wxTopLevelWindows is not accessible from it).
|
|
if ( !hwndParent )
|
|
flags |= MB_TASKMODAL;
|
|
|
|
::MessageBox(hwndParent, text.t_str(), title.t_str(), flags);
|
|
|
|
return true;
|
|
}
|
|
|
|
#if wxUSE_THREADS
|
|
WXDWORD wxAppTraits::DoSimpleWaitForThread(WXHANDLE hThread)
|
|
{
|
|
return ::WaitForSingleObject((HANDLE)hThread, INFINITE);
|
|
}
|
|
#endif // wxUSE_THREADS
|
|
|
|
// ============================================================================
|
|
// wxConsoleAppTraits implementation
|
|
// ============================================================================
|
|
|
|
void *wxConsoleAppTraits::BeforeChildWaitLoop()
|
|
{
|
|
// nothing to do here
|
|
return NULL;
|
|
}
|
|
|
|
void wxConsoleAppTraits::AfterChildWaitLoop(void * WXUNUSED(data))
|
|
{
|
|
// nothing to do here
|
|
}
|
|
|
|
#if wxUSE_THREADS
|
|
bool wxConsoleAppTraits::DoMessageFromThreadWait()
|
|
{
|
|
// nothing to process here
|
|
return true;
|
|
}
|
|
|
|
WXDWORD wxConsoleAppTraits::WaitForThread(WXHANDLE hThread, int WXUNUSED(flags))
|
|
{
|
|
return DoSimpleWaitForThread(hThread);
|
|
}
|
|
#endif // wxUSE_THREADS
|
|
|
|
#if wxUSE_TIMER
|
|
|
|
wxTimerImpl *wxConsoleAppTraits::CreateTimerImpl(wxTimer *timer)
|
|
{
|
|
return new wxMSWTimerImpl(timer);
|
|
}
|
|
|
|
#endif // wxUSE_TIMER
|
|
|
|
// Why can't this be disabled for __WXQT__ ??? There is an implementation in src/qt/apptraits.cpp
|
|
wxEventLoopBase *wxConsoleAppTraits::CreateEventLoop()
|
|
{
|
|
#if wxUSE_CONSOLE_EVENTLOOP
|
|
return new wxEventLoop();
|
|
#else // !wxUSE_CONSOLE_EVENTLOOP
|
|
return NULL;
|
|
#endif // wxUSE_CONSOLE_EVENTLOOP/!wxUSE_CONSOLE_EVENTLOOP
|
|
}
|
|
|
|
|
|
bool wxConsoleAppTraits::WriteToStderr(const wxString& text)
|
|
{
|
|
return wxFprintf(stderr, "%s", text) != -1;
|
|
}
|