#include <commctrl.h>
#endif
+// use debug CRT functions for memory leak detections in VC++
+/* Doesn't work when using the makefiles, for some reason.
+#if defined(__WXDEBUG__) && defined(_MSC_VER)
+ #include <crtdbg.h>
+#endif
+*/
+
extern char *wxBuffer;
extern char *wxOsVersion;
extern wxList *wxWinHandleList;
extern void wxSetKeyboardHook(bool doIt);
extern wxCursor *g_globalCursor;
-HANDLE wxhInstance = 0;
+HINSTANCE wxhInstance = 0;
static MSG s_currentMsg;
wxApp *wxTheApp = NULL;
static HINSTANCE gs_hRichEdit = NULL;
#endif
-bool wxApp::Initialize(WXHANDLE instance)
+bool wxApp::Initialize(WXHINSTANCE instance)
{
- HANDLE hInstance = (HANDLE)instance;
+ HINSTANCE hInstance = (HINSTANCE) instance;
CommonInit();
return TRUE;
}
-bool wxApp::RegisterWindowClasses(void)
+bool wxApp::RegisterWindowClasses()
{
///////////////////////////////////////////////////////////////////////
// Register the frame window class.
wndclass2.hIcon = NULL;
wndclass2.hCursor = NULL;
// wndclass2.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1) ;
- wndclass2.hbrBackground = GetStockObject( LTGRAY_BRUSH );
+ wndclass2.hbrBackground = (HBRUSH) GetStockObject( LTGRAY_BRUSH );
wndclass2.lpszMenuName = NULL;
wndclass2.lpszClassName = wxPanelClassName;
if (!RegisterClass( &wndclass2 ))
memset(&wndclass3, 0, sizeof(WNDCLASS)); // start with NULL defaults
// Use CS_OWNDC to avoid messing about restoring the context
// for every graphic operation.
-// wndclass3.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS ;
+// wndclass3.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS ;
// wxWin 2.0
- wndclass3.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;
+ wndclass3.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;
wndclass3.lpfnWndProc = (WNDPROC)wxWndProc;
wndclass3.cbClsExtra = 0;
wndclass3.cbWndExtra = sizeof( DWORD ); // was 4
}
// Cleans up any wxWindows internal structures left lying around
-void wxApp::CleanUp(void)
+void wxApp::CleanUp()
{
wxModule::CleanUpModules();
if (wxWinHandleList)
delete wxWinHandleList ;
-
+
// do it as the very last thing because everything else can log messages
+ wxLog::DontCreateOnDemand();
delete wxLog::SetActiveTarget(NULL);
}
-void wxApp::CommonInit(void)
+void wxApp::CommonInit()
{
-#ifdef __WINDOWS__
+#ifdef __WXMSW__
wxBuffer = new char[1500];
#else
wxBuffer = new char[BUFSIZ + 512];
wxClassInfo::InitializeClasses();
-#ifdef __X__
- wxTheFontNameDirectory.Initialize();
-#endif
-
-#if defined(__X__) && USE_RESOURCES
- // Read standard font names from .Xdefaults
-
- extern char *wxDecorativeFontName;
- extern char *wxRomanFontName;
- extern char *wxModernFontName;
- extern char *wxSwissFontName;
- extern char *wxScriptFontName;
- extern char *wxTeletypeFontName;
- extern char *wxDefaultFontName;
-
- (void) wxGetResource("wxWindows", "defaultFamily", &wxDefaultFontName);
- (void) wxGetResource("wxWindows", "decorativeFamily", &wxDecorativeFontName);
- (void) wxGetResource("wxWindows", "romanFamily", &wxRomanFontName);
- (void) wxGetResource("wxWindows", "modernFamily", &wxModernFontName);
- (void) wxGetResource("wxWindows", "swissFamily", &wxSwissFontName);
- (void) wxGetResource("wxWindows", "scriptFamily", &wxScriptFontName);
- (void) wxGetResource("wxWindows", "teletypeFamily", &wxTeletypeFontName);
-#endif
-
#if USE_RESOURCES
- (void) wxGetResource("wxWindows", "OsVersion", &wxOsVersion);
+ wxGetResource("wxWindows", "OsVersion", &wxOsVersion);
#endif
wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
wxTheColourDatabase->Initialize();
+
+ wxInitializeStockLists();
wxInitializeStockObjects();
#if USE_WX_RESOURCES
g_globalCursor = new wxCursor;
}
-void wxApp::CommonCleanUp(void)
+void wxApp::CommonCleanUp()
{
#if USE_WX_RESOURCES
wxCleanUpResourceSystem();
// wxDefaultResourceTable->ClearTable();
#endif
+
// Indicate that the cursor can be freed,
// so that cursor won't be deleted by deleting
// the bitmap list before g_globalCursor goes out
wxDeleteStockObjects() ;
// Destroy all GDI lists, etc.
- delete wxTheBrushList;
- wxTheBrushList = NULL;
-
- delete wxThePenList;
- wxThePenList = NULL;
-
- delete wxTheFontList;
- wxTheFontList = NULL;
-
- delete wxTheBitmapList;
- wxTheBitmapList = NULL;
+ wxDeleteStockLists();
delete wxTheColourDatabase;
wxTheColourDatabase = NULL;
{
wxhInstance = (HINSTANCE) hInstance;
-#if (DEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT
+/* Doesn't work when using the makefiles, for some reason.
+ #if defined(__WXDEBUG__) && defined(_MSC_VER)
+ // do check for memory leaks on program exit
+ // (another useful flag is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free
+ // deallocated memory which may be used to simulate low-memory condition)
+ _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
+ #endif // debug build under MS VC++
+*/
+
+#if (WXDEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT
#if !defined(_WINDLL)
streambuf* sBuf = new wxDebugStreamBuf;
ostream* oStr = new ostream(sBuf) ;
wxDebugContext::SetStream(oStr, sBuf);
-#endif
+#endif // USE_MEMORY_TRACING
if (!wxApp::Initialize((WXHINSTANCE) wxhInstance))
return 0;
// Split command line into tokens, as in usual main(argc, argv)
char **command = new char*[50];
-
+
int count = 0;
char *buf = new char[strlen(m_lpCmdLine) + 1];
-
+
// Hangs around until end of app. in case
// user carries pointers to the tokens
wxTheApp->SetTopWindow(NULL);
}
}
-
+
wxTheApp->OnExit();
wxApp::CleanUp();
delete [] command[0] ;
delete [] command ;
-#if (DEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT
+#if (WXDEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT
// At this point we want to check if there are any memory
// blocks that aren't part of the wxDebugContext itself,
// as a special case. Then when dumping we need to ignore
// Static member initialization
wxAppInitializerFunction wxApp::m_appInitFn = (wxAppInitializerFunction) NULL;
-wxApp::wxApp(void)
+wxApp::wxApp()
{
m_topWindow = NULL;
wxTheApp = this;
m_appName = "";
argc = 0;
argv = NULL;
-#ifdef __WINDOWS__
+#ifdef __WXMSW__
m_printMode = wxPRINT_WINDOWS;
#else
m_printMode = wxPRINT_POSTSCRIPT;
#endif
-// work_proc = NULL;
m_exitOnFrameDelete = TRUE;
-// m_showOnInit = TRUE;
m_auto3D = TRUE;
}
-bool wxApp::Initialized(void)
+bool wxApp::Initialized()
{
#ifndef _WINDLL
if (GetTopWindow())
* received.
*
*/
-bool wxApp::DoMessage(void)
+bool wxApp::DoMessage()
{
if (!::GetMessage(&s_currentMsg, (HWND) NULL, 0, 0))
{
return FALSE;
}
-
+
// Process the message
if (!ProcessMessage((WXMSG *)&s_currentMsg))
{
* are processed (it'll sit in DoMessage).
*/
-int wxApp::MainLoop(void)
+int wxApp::MainLoop()
{
m_keepGoing = TRUE;
while (m_keepGoing)
}
// Returns TRUE if more time is needed.
-bool wxApp::ProcessIdle(void)
+bool wxApp::ProcessIdle()
{
wxIdleEvent event;
event.SetEventObject(this);
return event.MoreRequested();
}
-void wxApp::ExitMainLoop(void)
+void wxApp::ExitMainLoop()
{
m_keepGoing = FALSE;
}
-bool wxApp::Pending(void)
+bool wxApp::Pending()
{
return (::PeekMessage(&s_currentMsg, 0, 0, 0, PM_NOREMOVE) != 0) ;
}
-void wxApp::Dispatch(void)
+void wxApp::Dispatch()
{
if (!DoMessage())
m_keepGoing = FALSE;
HWND hWnd;
- // Anyone for a message? Try youngest descendants first.
+ // Try translations first; find the youngest window with
+ // a translation table.
for (hWnd = msg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd))
{
wxWindow *wnd = wxFindWinFromHandle((WXHWND) hWnd);
if (wnd)
{
- if (wnd->MSWProcessMessage(Msg))
+ if (wnd->MSWTranslateMessage(Msg))
return TRUE;
-
- // STOP if we've reached the top of the hierarchy!
-// if (m_topWindow && (wnd == m_topWindow))
-// return FALSE;
}
}
- // TODO: Is this now obsolete, given that m_topWindow may not be defined?
- // Does it do anything useful anyway?
-// if (m_topWindow && m_topWindow->MSWProcessMessage(Msg))
-// return TRUE;
- return FALSE;
+ // Anyone for a non-translation message? Try youngest descendants first.
+ for (hWnd = msg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd))
+ {
+ wxWindow *wnd = wxFindWinFromHandle((WXHWND) hWnd);
+ if (wnd)
+ {
+ if (wnd->MSWProcessMessage(Msg))
+ return TRUE;
+ }
+ }
+ return FALSE;
}
void wxApp::OnIdle(wxIdleEvent& event)
}
// Send idle event to all top-level windows
-bool wxApp::SendIdleEvents(void)
+bool wxApp::SendIdleEvents()
{
bool needMore = FALSE;
wxNode* node = wxTopLevelWindows.First();
return needMore ;
}
-// Windows specific. Intercept keyboard input: by default,
-// route it to the active frame or dialog box.
-#if WXWIN_COMPATIBILITY == 2
-bool wxApp::OldOnCharHook(wxKeyEvent& event)
-{
- wxWindow *win = wxGetActiveWindow();
- if (win)
- return win->GetEventHandler()->OldOnCharHook(event);
- else
- return FALSE;
-}
-#endif
-
-void wxApp::DeletePendingObjects(void)
+void wxApp::DeletePendingObjects()
{
wxNode *node = wxPendingDelete.First();
while (node)
{
wxObject *obj = (wxObject *)node->Data();
-
+
delete obj;
if (wxPendingDelete.Member(obj))
/*
// Free up font objects that are not being used at present.
-bool wxApp::DoResourceCleanup(void)
+bool wxApp::DoResourceCleanup()
{
// wxDebugMsg("ResourceCleanup\n");
}
*/
-wxLog* wxApp::CreateLogTarget(void)
+wxLog* wxApp::CreateLogTarget()
{
return new wxLogGui;
}
-wxWindow* wxApp::GetTopWindow(void) const
+wxWindow* wxApp::GetTopWindow() const
{
if (m_topWindow)
return m_topWindow;
return NULL;
}
-void wxExit(void)
+int wxApp::GetComCtl32Version() const
+{
+ // have we loaded COMCTL32 yet?
+ HMODULE theModule = ::GetModuleHandle("COMCTL32");
+ int version = 0;
+
+ // if so, then we can check for the version
+ if (theModule)
+ {
+ // InitCommonControlsEx is unique to 4.7 and later
+ FARPROC theProc = ::GetProcAddress(theModule, "InitCommonControlsEx");
+
+ if (! theProc)
+ { // not found, must be 4.00
+ version = 400;
+ }
+ else
+ {
+ // The following symbol are unique to 4.71
+ // DllInstall
+ // FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos
+ // FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo
+ // FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange
+ // FlatSB_ShowScrollBar
+ // _DrawIndirectImageList _DuplicateImageList
+ // InitializeFlatSB
+ // UninitializeFlatSB
+ // we could check for any of these - I chose DllInstall
+ FARPROC theProc = ::GetProcAddress(theModule, "DllInstall");
+ if (! theProc)
+ {
+ // not found, must be 4.70
+ version = 470;
+ }
+ else
+ { // found, must be 4.71
+ version = 471;
+ }
+ }
+ }
+ return version;
+}
+
+void wxExit()
{
wxApp::CleanUp();
FatalAppExit(0, "Fatal error: exiting");
}
// Yield to incoming messages
-bool wxYield(void)
+bool wxYield()
{
MSG msg;
// We want to go back to the main message loop