]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/mfc/mfctest.cpp
implement wxTreeCtrl::GetFocusedItem() for wxMSW too (see #10859)
[wxWidgets.git] / samples / mfc / mfctest.cpp
index 552aa765006c2a96bf9481a44c38a33a5079bcd2..a4102648a94a6febd46df3f220b228f6d33fb0bc 100644 (file)
 //     normally this shouldn't be needed any longer, i.e. it works without
 //     it for me (VZ)
 //
 //     normally this shouldn't be needed any longer, i.e. it works without
 //     it for me (VZ)
 //
-// (2) You should link with MFC DLL, not static libraries
-
-// suppress warning about WINVER not being defined from MFC
-#ifndef WINVER
-#define WINVER 0x7000
-#endif
+// (2) You should link with MFC DLL, not static libraries: or, to use static
+//     run-time libraries, use this command for both building wxWidgets and
+//     the sample:
+//
+//     nmake -f makefile.vc BUILD=debug SHARED=0 DEBUG_RUNTIME_LIBS=0 RUNTIME_LIBS=static all
+//
+//     Unless the run-time library settings match for wxWidgets and MFC, you
+//     will get link errors for symbols such as __mbctype, __argc, and __argv 
+//
+// (3) If you see bogus memory leaks within the MSVC IDE on exit, in this
+//     sample or in your own project, you must be using __WXDEBUG__ +
+//     WXUSINGDLL + _AFXDLL
+//     Unfortunately this confuses the MSVC/MFC leak detector. To do away with
+//     these bogus memory leaks, add this to the list of link objects, make it
+//     first: mfc[version][u]d.lib
+//     -  [version] -> 42 or 70 or 80 etc
+//     -  u if using Unicode
+//
+// (4) Unicode builds may produce the linker error "unresolved external symbol _WinMain@16".
+//     MFC requires you to manually add the Unicode entry point to the linker settings,
+//     Entry point symbol -> wWinMainCRTStartup
 
 #include "stdafx.h"
 
 
 #include "stdafx.h"
 
@@ -73,6 +88,10 @@ class MyApp: public wxApp
 public:
     virtual bool OnInit();
 
 public:
     virtual bool OnInit();
 
+    // we need to override this as the default behaviour only works when we're
+    // running wxWidgets main loop, not MFC one
+    virtual void ExitMainLoop();
+
     wxFrame *CreateFrame();
 };
 
     wxFrame *CreateFrame();
 };
 
@@ -111,14 +130,14 @@ IMPLEMENT_APP_NO_MAIN(MyApp)
 
 CMainWindow::CMainWindow()
 {
 
 CMainWindow::CMainWindow()
 {
-    LoadAccelTable( "MainAccelTable" );
-    Create( NULL, "Hello Foundation Application",
-        WS_OVERLAPPEDWINDOW, rectDefault, NULL, "MainMenu" );
+    LoadAccelTable( _T("MainAccelTable") );
+    Create( NULL, _T("Hello Foundation Application"),
+        WS_OVERLAPPEDWINDOW, rectDefault, NULL, _T("MainMenu") );
 }
 
 void CMainWindow::OnPaint()
 {
 }
 
 void CMainWindow::OnPaint()
 {
-    CString s = "Hello, Windows!";
+    CString s = _T("Hello, Windows!");
     CPaintDC dc( this );
     CRect rect;
 
     CPaintDC dc( this );
     CRect rect;
 
@@ -132,13 +151,13 @@ void CMainWindow::OnPaint()
 
 void CMainWindow::OnAbout()
 {
 
 void CMainWindow::OnAbout()
 {
-    CDialog about( "AboutBox", this );
+    CDialog about( _T("AboutBox"), this );
     about.DoModal();
 }
 
 void CMainWindow::OnTest()
 {
     about.DoModal();
 }
 
 void CMainWindow::OnTest()
 {
-    wxMessageBox("This is a wxWidgets message box.\nWe're about to create a new wxWidgets frame.", "wxWidgets", wxOK);
+    wxMessageBox(_T("This is a wxWidgets message box.\nWe're about to create a new wxWidgets frame."), _T("wxWidgets"), wxOK);
     wxGetApp().CreateFrame();
 }
 
     wxGetApp().CreateFrame();
 }
 
@@ -169,7 +188,7 @@ BOOL CTheApp::InitInstance()
     wxSetInstance(m_hInstance);
     wxApp::m_nCmdShow = m_nCmdShow;
     int argc = 0;
     wxSetInstance(m_hInstance);
     wxApp::m_nCmdShow = m_nCmdShow;
     int argc = 0;
-    char **argv = NULL;
+    wxChar **argv = NULL;
     wxEntryStart(argc, argv);
     if ( !wxTheApp || !wxTheApp->CallOnInit() )
         return FALSE;
     wxEntryStart(argc, argv);
     if ( !wxTheApp || !wxTheApp->CallOnInit() )
         return FALSE;
@@ -194,6 +213,10 @@ BOOL CTheApp::InitInstance()
 
 int CTheApp::ExitInstance()
 {
 
 int CTheApp::ExitInstance()
 {
+#if !START_WITH_MFC_WINDOW
+    delete m_pMainWnd;
+#endif
+
     if ( wxTheApp )
         wxTheApp->OnExit();
     wxEntryCleanup();
     if ( wxTheApp )
         wxTheApp->OnExit();
     wxEntryCleanup();
@@ -204,7 +227,8 @@ int CTheApp::ExitInstance()
 // Override this to provide wxWidgets message loop compatibility
 BOOL CTheApp::PreTranslateMessage(MSG *msg)
 {
 // Override this to provide wxWidgets message loop compatibility
 BOOL CTheApp::PreTranslateMessage(MSG *msg)
 {
-    wxEventLoop *evtLoop = wxEventLoop::GetActive();
+    wxEventLoop * const
+        evtLoop = static_cast<wxEventLoop *>(wxEventLoop::GetActive());
     if ( evtLoop && evtLoop->PreProcessMessage(msg) )
         return TRUE;
 
     if ( evtLoop && evtLoop->PreProcessMessage(msg) )
         return TRUE;
 
@@ -222,23 +246,32 @@ BOOL CTheApp::OnIdle(LONG WXUNUSED(lCount))
 
 bool MyApp::OnInit()
 {
 
 bool MyApp::OnInit()
 {
-#if !START_WITH_MFC_WINDOW
+    if ( !wxApp::OnInit() )
+        return false;
 
 
-    // Exit app when the top level frame is deleted
-    SetExitOnFrameDelete(TRUE);
+#if !START_WITH_MFC_WINDOW
+    // as we're not inside wxWidgets main loop, the default logic doesn't work
+    // in our case and we need to do this explicitly
+    SetExitOnFrameDelete(true);
 
     (void) CreateFrame();
 #endif
 
 
     (void) CreateFrame();
 #endif
 
-    return TRUE;
+    return true;
+}
+
+void MyApp::ExitMainLoop()
+{
+    // instead of existing wxWidgets main loop, terminate the MFC one
+    ::PostQuitMessage(0);
 }
 
 wxFrame *MyApp::CreateFrame()
 {
 }
 
 wxFrame *MyApp::CreateFrame()
 {
-    MyChild *subframe = new MyChild(NULL, "Canvas Frame", wxPoint(10, 10), wxSize(300, 300),
+    MyChild *subframe = new MyChild(NULL, _T("Canvas Frame"), wxPoint(10, 10), wxSize(300, 300),
         wxDEFAULT_FRAME_STYLE);
 
         wxDEFAULT_FRAME_STYLE);
 
-    subframe->SetTitle("wxWidgets canvas frame");
+    subframe->SetTitle(_T("wxWidgets canvas frame"));
 
     // Give it a status line
     subframe->CreateStatusBar();
 
     // Give it a status line
     subframe->CreateStatusBar();
@@ -246,12 +279,12 @@ wxFrame *MyApp::CreateFrame()
     // Make a menubar
     wxMenu *file_menu = new wxMenu;
 
     // Make a menubar
     wxMenu *file_menu = new wxMenu;
 
-    file_menu->Append(HELLO_NEW, "&New MFC Window");
-    file_menu->Append(HELLO_QUIT, "&Close");
+    file_menu->Append(HELLO_NEW, _T("&New MFC Window"));
+    file_menu->Append(HELLO_QUIT, _T("&Close"));
 
     wxMenuBar *menu_bar = new wxMenuBar;
 
 
     wxMenuBar *menu_bar = new wxMenuBar;
 
-    menu_bar->Append(file_menu, "&File");
+    menu_bar->Append(file_menu, _T("&File"));
 
     // Associate the menu bar with the frame
     subframe->SetMenuBar(menu_bar);
 
     // Associate the menu bar with the frame
     subframe->SetMenuBar(menu_bar);
@@ -262,7 +295,7 @@ wxFrame *MyApp::CreateFrame()
     MyCanvas *canvas = new MyCanvas(subframe, wxPoint(0, 0), wxSize(width, height));
     canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));
     subframe->canvas = canvas;
     MyCanvas *canvas = new MyCanvas(subframe, wxPoint(0, 0), wxSize(width, height));
     canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));
     subframe->canvas = canvas;
-    subframe->Show(TRUE);
+    subframe->Show(true);
 
     // Return the main frame window
     return subframe;
 
     // Return the main frame window
     return subframe;
@@ -296,7 +329,7 @@ void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
 
     dc.DrawEllipse(250, 250, 100, 50);
     dc.DrawLine(50, 230, 200, 230);
 
     dc.DrawEllipse(250, 250, 100, 50);
     dc.DrawLine(50, 230, 200, 230);
-    dc.DrawText("This is a test string", 50, 230);
+    dc.DrawText(_T("This is a test string"), 50, 230);
 }
 
 // This implements a tiny doodling program! Drag the mouse using
 }
 
 // This implements a tiny doodling program! Drag the mouse using
@@ -332,11 +365,13 @@ MyChild::MyChild(wxFrame *frame, const wxString& title, const wxPoint& pos, cons
 
 MyChild::~MyChild()
 {
 
 MyChild::~MyChild()
 {
+    if ( IsLastBeforeExit() )
+        PostQuitMessage(0);
 }
 
 void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event))
 {
 }
 
 void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event))
 {
-    Close(TRUE);
+    Close(true);
 }
 
 void MyChild::OnNew(wxCommandEvent& WXUNUSED(event))
 }
 
 void MyChild::OnNew(wxCommandEvent& WXUNUSED(event))
@@ -354,7 +389,7 @@ void MyChild::OnActivate(wxActivateEvent& event)
 
 // Dummy MFC window for specifying a valid main window to MFC, using
 // a wxWidgets HWND.
 
 // Dummy MFC window for specifying a valid main window to MFC, using
 // a wxWidgets HWND.
-CDummyWindow::CDummyWindow(HWND hWnd):CWnd()
+CDummyWindow::CDummyWindow(HWND hWnd)
 {
     Attach(hWnd);
 }
 {
     Attach(hWnd);
 }