app.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 789 行 · 第 1/2 页
CPP
789 行
}
// "no redraw" MDI child frame
wndclass.lpszClassName = wxMDIChildFrameClassNameNoRedraw;
wndclass.style = styleNoRedraw;
if ( !RegisterClass(&wndclass) )
{
wxLogLastError(wxT("RegisterClass(no redraw MDI child)"));
}
return true;
}
// ---------------------------------------------------------------------------
// UnregisterWindowClasses
// ---------------------------------------------------------------------------
bool wxApp::UnregisterWindowClasses()
{
bool retval = true;
#ifndef __WXMICROWIN__
// MDI frame window class.
if ( !::UnregisterClass(wxMDIFrameClassName, wxhInstance) )
{
wxLogLastError(wxT("UnregisterClass(MDI parent)"));
retval = false;
}
// "no redraw" MDI frame
if ( !::UnregisterClass(wxMDIFrameClassNameNoRedraw, wxhInstance) )
{
wxLogLastError(wxT("UnregisterClass(no redraw MDI parent frame)"));
retval = false;
}
// MDI child frame window class.
if ( !::UnregisterClass(wxMDIChildFrameClassName, wxhInstance) )
{
wxLogLastError(wxT("UnregisterClass(MDI child)"));
retval = false;
}
// "no redraw" MDI child frame
if ( !::UnregisterClass(wxMDIChildFrameClassNameNoRedraw, wxhInstance) )
{
wxLogLastError(wxT("UnregisterClass(no redraw MDI child)"));
retval = false;
}
// canvas class name
if ( !::UnregisterClass(wxCanvasClassName, wxhInstance) )
{
wxLogLastError(wxT("UnregisterClass(canvas)"));
retval = false;
}
if ( !::UnregisterClass(wxCanvasClassNameNR, wxhInstance) )
{
wxLogLastError(wxT("UnregisterClass(no redraw canvas)"));
retval = false;
}
#endif // __WXMICROWIN__
return retval;
}
void wxApp::CleanUp()
{
// all objects pending for deletion must be deleted first, otherwise we
// would crash when they use wxWinHandleHash (and UnregisterWindowClasses()
// call wouldn't succeed as long as any windows still exist), so call the
// base class method first and only then do our clean up
wxAppBase::CleanUp();
#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
wxSetKeyboardHook(false);
#endif
wxOleUninitialize();
// for an EXE the classes are unregistered when it terminates but DLL may
// be loaded several times (load/unload/load) into the same process in
// which case the registration will fail after the first time if we don't
// unregister the classes now
UnregisterWindowClasses();
delete wxWinHandleHash;
wxWinHandleHash = NULL;
#ifdef __WXWINCE__
free( wxCanvasClassName );
free( wxCanvasClassNameNR );
#endif
}
// ----------------------------------------------------------------------------
// wxApp ctor/dtor
// ----------------------------------------------------------------------------
wxApp::wxApp()
{
m_printMode = wxPRINT_WINDOWS;
}
wxApp::~wxApp()
{
// our cmd line arguments are allocated inside wxEntry(HINSTANCE), they
// don't come from main(), so we have to free them
while ( argc )
{
// m_argv elements were allocated by wxStrdup()
free(argv[--argc]);
}
// but m_argv itself -- using new[]
wxDELETEA(argv);
}
// ----------------------------------------------------------------------------
// wxApp idle handling
// ----------------------------------------------------------------------------
void wxApp::OnIdle(wxIdleEvent& event)
{
wxAppBase::OnIdle(event);
#if wxUSE_DC_CACHEING
// automated DC cache management: clear the cached DCs and bitmap
// if it's likely that the app has finished with them, that is, we
// get an idle event and we're not dragging anything.
if (!::GetKeyState(MK_LBUTTON) && !::GetKeyState(MK_MBUTTON) && !::GetKeyState(MK_RBUTTON))
wxDC::ClearCache();
#endif // wxUSE_DC_CACHEING
}
void wxApp::WakeUpIdle()
{
// Send the top window a dummy message so idle handler processing will
// start up again. Doing it this way ensures that the idle handler
// wakes up in the right thread (see also wxWakeUpMainThread() which does
// the same for the main app thread only)
wxWindow *topWindow = wxTheApp->GetTopWindow();
if ( topWindow )
{
if ( !::PostMessage(GetHwndOf(topWindow), WM_NULL, 0, 0) )
{
// should never happen
wxLogLastError(wxT("PostMessage(WM_NULL)"));
}
}
}
// ----------------------------------------------------------------------------
// other wxApp event hanlders
// ----------------------------------------------------------------------------
void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
{
if (GetTopWindow())
GetTopWindow()->Close(true);
}
// Default behaviour: close the application with prompts. The
// user can veto the close, and therefore the end session.
void wxApp::OnQueryEndSession(wxCloseEvent& event)
{
if (GetTopWindow())
{
if (!GetTopWindow()->Close(!event.CanVeto()))
event.Veto(true);
}
}
// ----------------------------------------------------------------------------
// miscellaneous
// ----------------------------------------------------------------------------
/* static */
int wxApp::GetComCtl32Version()
{
#if defined(__WXMICROWIN__) || defined(__WXWINCE__)
return 0;
#else
// cache the result
//
// NB: this is MT-ok as in the worst case we'd compute s_verComCtl32 twice,
// but as its value should be the same both times it doesn't matter
static int s_verComCtl32 = -1;
if ( s_verComCtl32 == -1 )
{
// initally assume no comctl32.dll at all
s_verComCtl32 = 0;
// we're prepared to handle the errors
wxLogNull noLog;
#if wxUSE_DYNLIB_CLASS
// do we have it?
wxDynamicLibrary dllComCtl32(_T("comctl32.dll"), wxDL_VERBATIM);
// if so, then we can check for the version
if ( dllComCtl32.IsLoaded() )
{
// now check if the function is available during run-time
wxDYNLIB_FUNCTION( DLLGETVERSIONPROC, DllGetVersion, dllComCtl32 );
if ( pfnDllGetVersion )
{
DLLVERSIONINFO dvi;
dvi.cbSize = sizeof(dvi);
HRESULT hr = (*pfnDllGetVersion)(&dvi);
if ( FAILED(hr) )
{
wxLogApiError(_T("DllGetVersion"), hr);
}
else
{
// this is incompatible with _WIN32_IE values, but
// compatible with the other values returned by
// GetComCtl32Version()
s_verComCtl32 = 100*dvi.dwMajorVersion +
dvi.dwMinorVersion;
}
}
// if DllGetVersion() is unavailable either during compile or
// run-time, try to guess the version otherwise
if ( !s_verComCtl32 )
{
// InitCommonControlsEx is unique to 4.70 and later
void *pfn = dllComCtl32.GetSymbol(_T("InitCommonControlsEx"));
if ( !pfn )
{
// not found, must be 4.00
s_verComCtl32 = 400;
}
else // 4.70+
{
// many symbols appeared in comctl32 4.71, could use any of
// them except may be DllInstall()
pfn = dllComCtl32.GetSymbol(_T("InitializeFlatSB"));
if ( !pfn )
{
// not found, must be 4.70
s_verComCtl32 = 470;
}
else
{
// found, must be 4.71 or later
s_verComCtl32 = 471;
}
}
}
}
#endif
}
return s_verComCtl32;
#endif // Microwin/!Microwin
}
// Yield to incoming messages
bool wxApp::Yield(bool onlyIfNeeded)
{
// MT-FIXME
static bool s_inYield = false;
#if wxUSE_LOG
// disable log flushing from here because a call to wxYield() shouldn't
// normally result in message boxes popping up &c
wxLog::Suspend();
#endif // wxUSE_LOG
if ( s_inYield )
{
if ( !onlyIfNeeded )
{
wxFAIL_MSG( wxT("wxYield called recursively" ) );
}
return false;
}
s_inYield = true;
// we don't want to process WM_QUIT from here - it should be processed in
// the main event loop in order to stop it
MSG msg;
while ( PeekMessage(&msg, (HWND)0, 0, 0, PM_NOREMOVE) &&
msg.message != WM_QUIT )
{
#if wxUSE_THREADS
wxMutexGuiLeaveOrEnter();
#endif // wxUSE_THREADS
if ( !wxTheApp->Dispatch() )
break;
}
// if there are pending events, we must process them.
ProcessPendingEvents();
#if wxUSE_LOG
// let the logs be flashed again
wxLog::Resume();
#endif // wxUSE_LOG
s_inYield = false;
return true;
}
#if wxUSE_EXCEPTIONS
// ----------------------------------------------------------------------------
// exception handling
// ----------------------------------------------------------------------------
bool wxApp::OnExceptionInMainLoop()
{
// ask the user about what to do: use the Win32 API function here as it
// could be dangerous to use any wxWidgets code in this state
switch (
::MessageBox
(
NULL,
_T("An unhandled exception occurred. Press \"Abort\" to \
terminate the program,\r\n\
\"Retry\" to exit the program normally and \"Ignore\" to try to continue."),
_T("Unhandled exception"),
MB_ABORTRETRYIGNORE |
MB_ICONERROR|
MB_TASKMODAL
)
)
{
case IDABORT:
throw;
default:
wxFAIL_MSG( _T("unexpected MessageBox() return code") );
// fall through
case IDRETRY:
return false;
case IDIGNORE:
return true;
}
}
#endif // wxUSE_EXCEPTIONS
// ----------------------------------------------------------------------------
// deprecated event loop functions
// ----------------------------------------------------------------------------
#if WXWIN_COMPATIBILITY_2_4
#include "wx/evtloop.h"
void wxApp::DoMessage(WXMSG *pMsg)
{
wxEventLoop *evtLoop = wxEventLoop::GetActive();
if ( evtLoop )
evtLoop->ProcessMessage(pMsg);
}
bool wxApp::DoMessage()
{
wxEventLoop *evtLoop = wxEventLoop::GetActive();
return evtLoop ? evtLoop->Dispatch() : false;
}
bool wxApp::ProcessMessage(WXMSG* pMsg)
{
wxEventLoop *evtLoop = wxEventLoop::GetActive();
return evtLoop && evtLoop->PreProcessMessage(pMsg);
}
#endif // WXWIN_COMPATIBILITY_2_4
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?