X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/17b74d79adcc7bbd5cff4ed500e267289c0083a7..fca36d9a0301c9bff307361f1f94048897ce2ae5:/samples/mfc/mfctest.cpp diff --git a/samples/mfc/mfctest.cpp b/samples/mfc/mfctest.cpp index 26e03e26fb..fcbaa4b0f1 100644 --- a/samples/mfc/mfctest.cpp +++ b/samples/mfc/mfctest.cpp @@ -1,21 +1,12 @@ -// hello.cpp : Defines the class behaviors for the application. -// Hello is a simple program which consists of a main window -// and an "About" dialog which can be invoked by a menu choice. -// It is intended to serve as a starting-point for new -// applications. -// -// This is a part of the Microsoft Foundation Classes C++ library. -// Copyright (C) 1992 Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Microsoft Foundation Classes Reference and Microsoft -// WinHelp documentation provided with the library. -// See these sources for detailed information regarding the -// Microsoft Foundation Classes product. +///////////////////////////////////////////////////////////////////////////// +// Name: mfctest.cpp +// Purpose: Sample to demonstrate mixing MFC and wxWindows code +// Author: Julian Smart +// Id: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// -// *** MODIFIED BY JULIAN SMART TO DEMONSTRATE CO-EXISTANCE WITH wxWINDOWS *** -// // This sample pops up an initial wxWindows frame, with a menu item // that allows a new MFC window to be created. Note that CDummyWindow // is a class that allows a wxWindows window to be seen as a CWnd @@ -24,16 +15,32 @@ // // You can easily modify this code so that an MFC window pops up // initially as the main frame, and allows wxWindows frames to be -// created subsequently: +// created subsequently. // -// (1) Make MyApp::OnInit return NULL, not create a window. -// (2) Restore the MFC code to create a window in InitInstance, and remove +// (1) Make MyApp::OnInit not create a main window. +// (2) Make MFC's InitInstance create a main window, and remove // creation of CDummyWindow. // -// IMPORTANT NOTE: to compile this sample, you must first edit -// wx/src/msw/wx_main.cc, set NOWINMAIN to 1, and remake wxWindows -// (it only needs to recompile wx_main.cc). -// This eliminates the duplicate WinMain function which MFC implements. +// This can be accomplished by setting START_WITH_MFC_WINDOW to 1 below. + +#define START_WITH_MFC_WINDOW 0 + +// +// IMPORTANT NOTES: +// +// (1) You need to set wxUSE_MFC to 1 in include/wx/msw/setup.h, which switches +// off some debugging features and also removes the windows.h inclusion +// in wxprec.h (MFC headers don't like this to have been included previously). +// Set to 'Use MFC in a shared DLL' or add _AFXDLL to preprocessor settings. +// Then recompile wxWindows and this sample. +// +// (2) I can't get the sample to link and run using a static MFC library, only the DLL +// version. Perhaps someone else is a wizard at working out the required settings +// in the wxWin library and the sample; then debugging the assert problem may be +// easier. +// +// (3) Compiling wxWindows in DLL mode currently includes windows.h, so you must only +// try linking wxWindows statically. // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -44,6 +51,10 @@ #include "wx/wx.h" +#if defined(_WINDOWS_) || !wxUSE_MFC +#error Sorry, you need to edit include/wx/msw/setup.h, set wxUSE_MFC to 1, and recompile. +#endif + #ifdef new #undef new #endif @@ -70,44 +81,37 @@ CTheApp theApp; // Define a new application type class MyApp: public wxApp { public: - bool OnInit(void); - wxFrame *CreateFrame(void); - }; - -DECLARE_APP(MyApp) +bool OnInit(void); +wxFrame *CreateFrame(void); +}; class MyCanvas: public wxScrolledWindow { - public: +public: MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size); void OnPaint(wxPaintEvent& event); void OnMouseEvent(wxMouseEvent& event); -DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; class MyChild: public wxFrame { - public: +public: MyCanvas *canvas; MyChild(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size, const long style); ~MyChild(void); - bool OnClose(void); - + void OnQuit(wxCommandEvent& event); void OnNew(wxCommandEvent& event); void OnActivate(wxActivateEvent& event); - -DECLARE_EVENT_TABLE() + + DECLARE_EVENT_TABLE() }; // For drawing lines in a canvas long xpos = -1; long ypos = -1; -// Initialise this in OnInit, not statically -wxPen *red_pen; -wxFont *small_font; - // ID for the menu quit command #define HELLO_QUIT 1 #define HELLO_NEW 2 @@ -122,9 +126,9 @@ IMPLEMENT_APP(MyApp) // CMainWindow::CMainWindow() { - LoadAccelTable( "MainAccelTable" ); - Create( NULL, "Hello Foundation Application", - WS_OVERLAPPEDWINDOW, rectDefault, NULL, "MainMenu" ); + LoadAccelTable( "MainAccelTable" ); + Create( NULL, "Hello Foundation Application", + WS_OVERLAPPEDWINDOW, rectDefault, NULL, "MainMenu" ); } // OnPaint: @@ -136,16 +140,16 @@ CMainWindow::CMainWindow() // void CMainWindow::OnPaint() { - CString s = "Hello, Windows!"; - CPaintDC dc( this ); - CRect rect; - - GetClientRect( rect ); - dc.SetTextAlign( TA_BASELINE | TA_CENTER ); - dc.SetTextColor( ::GetSysColor( COLOR_WINDOWTEXT ) ); - dc.SetBkMode(TRANSPARENT); - dc.TextOut( ( rect.right / 2 ), ( rect.bottom / 2 ), - s, s.GetLength() ); + CString s = "Hello, Windows!"; + CPaintDC dc( this ); + CRect rect; + + GetClientRect( rect ); + dc.SetTextAlign( TA_BASELINE | TA_CENTER ); + dc.SetTextColor( ::GetSysColor( COLOR_WINDOWTEXT ) ); + dc.SetBkMode(TRANSPARENT); + dc.TextOut( ( rect.right / 2 ), ( rect.bottom / 2 ), + s, s.GetLength() ); } // OnAbout: @@ -158,14 +162,14 @@ void CMainWindow::OnPaint() // void CMainWindow::OnAbout() { - CDialog about( "AboutBox", this ); - about.DoModal(); + CDialog about( "AboutBox", this ); + about.DoModal(); } void CMainWindow::OnTest() { - wxMessageBox("This is a wxWindows message box.\nWe're about to create a new wxWindows frame.", "wxWindows", wxOK); - wxGetApp().CreateFrame(); + wxMessageBox("This is a wxWindows message box.\nWe're about to create a new wxWindows frame.", "wxWindows", wxOK); + wxGetApp().CreateFrame(); } // CMainWindow message map: @@ -178,11 +182,11 @@ void CMainWindow::OnTest() // receive no arguments and are void of return type, e.g., "void OnAbout()". // BEGIN_MESSAGE_MAP( CMainWindow, CFrameWnd ) - //{{AFX_MSG_MAP( CMainWindow ) - ON_WM_PAINT() - ON_COMMAND( IDM_ABOUT, OnAbout ) - ON_COMMAND( IDM_TEST, OnTest ) - //}}AFX_MSG_MAP +//{{AFX_MSG_MAP( CMainWindow ) +ON_WM_PAINT() +ON_COMMAND( IDM_ABOUT, OnAbout ) +ON_COMMAND( IDM_TEST, OnTest ) +//}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// @@ -197,31 +201,35 @@ END_MESSAGE_MAP() // BOOL CTheApp::InitInstance() { - TRACE( "HELLO WORLD\n" ); - - SetDialogBkColor(); // hook gray dialogs (was default in MFC V1) - + SetDialogBkColor(); // hook gray dialogs (was default in MFC V1) + wxEntry((WXHINSTANCE) m_hInstance, (WXHINSTANCE) m_hPrevInstance, m_lpCmdLine, m_nCmdShow, FALSE); - -/* - m_pMainWnd = new CMainWindow(); - m_pMainWnd->ShowWindow( m_nCmdShow ); - m_pMainWnd->UpdateWindow(); -*/ - + +#if START_WITH_MFC_WINDOW + // Demonstrate creation of an initial MFC main window. + m_pMainWnd = new CMainWindow(); + m_pMainWnd->ShowWindow( m_nCmdShow ); + m_pMainWnd->UpdateWindow(); +#else + // Demonstrate creation of an initial wxWindows main window. + // Wrap wxWindows window in a dummy MFC window and + // make the main window. if (wxTheApp && wxTheApp->GetTopWindow()) { m_pMainWnd = new CDummyWindow((HWND) wxTheApp->GetTopWindow()->GetHWND()); } - - return TRUE; +#endif + + return TRUE; } int CTheApp::ExitInstance() { - wxApp::CleanUp(); - - return CWinApp::ExitInstance(); + // OnExit isn't called by CleanUp so must be called explicitly. + wxTheApp->OnExit(); + wxApp::CleanUp(); + + return CWinApp::ExitInstance(); } // Override this to provide wxWindows message loop @@ -229,10 +237,10 @@ int CTheApp::ExitInstance() BOOL CTheApp::PreTranslateMessage(MSG *msg) { - if (wxTheApp && wxTheApp->ProcessMessage((WXMSG*) msg)) - return TRUE; - else - return CWinApp::PreTranslateMessage(msg); + if (wxTheApp && wxTheApp->ProcessMessage((WXMSG*) msg)) + return TRUE; + else + return CWinApp::PreTranslateMessage(msg); } BOOL CTheApp::OnIdle(LONG lCount) @@ -244,61 +252,55 @@ BOOL CTheApp::OnIdle(LONG lCount) } /********************************************************************* - * wxWindows elements - ********************************************************************/ - +* wxWindows elements +********************************************************************/ + bool MyApp::OnInit(void) { - // Don't exit app when the top level frame is deleted -// SetExitOnFrameDelete(FALSE); - - // Create a red pen - red_pen = new wxPen("RED", 3, wxSOLID); +#if !START_WITH_MFC_WINDOW - // Create a small font - small_font = new wxFont(10, wxSWISS, wxNORMAL, wxNORMAL); + // Exit app when the top level frame is deleted + SetExitOnFrameDelete(TRUE); + + (void) CreateFrame(); +#endif - wxFrame* frame = CreateFrame(); - return TRUE; + return TRUE; } wxFrame *MyApp::CreateFrame(void) { - MyChild *subframe = new MyChild(NULL, "Canvas Frame", wxPoint(10, 10), wxSize(300, 300), - wxDEFAULT_FRAME_STYLE); - - subframe->SetTitle("wxWindows canvas frame"); - - // Give it a status line - subframe->CreateStatusBar(); - - // Make a menubar - wxMenu *file_menu = new wxMenu; - - file_menu->Append(HELLO_NEW, "&New MFC Window"); - file_menu->Append(HELLO_QUIT, "&Close"); - - wxMenuBar *menu_bar = new wxMenuBar; - - menu_bar->Append(file_menu, "&File"); - - // Associate the menu bar with the frame - subframe->SetMenuBar(menu_bar); - - int width, height; - subframe->GetClientSize(&width, &height); - - MyCanvas *canvas = new MyCanvas(subframe, wxPoint(0, 0), wxSize(width, height)); - wxCursor *cursor = new wxCursor(wxCURSOR_PENCIL); - canvas->SetCursor(*cursor); - subframe->canvas = canvas; - - // Give it scrollbars -// canvas->SetScrollbars(20, 20, 50, 50, 4, 4); - - subframe->Show(TRUE); - // Return the main frame window - return subframe; + MyChild *subframe = new MyChild(NULL, "Canvas Frame", wxPoint(10, 10), wxSize(300, 300), + wxDEFAULT_FRAME_STYLE); + + subframe->SetTitle("wxWindows canvas frame"); + + // Give it a status line + subframe->CreateStatusBar(); + + // Make a menubar + wxMenu *file_menu = new wxMenu; + + file_menu->Append(HELLO_NEW, "&New MFC Window"); + file_menu->Append(HELLO_QUIT, "&Close"); + + wxMenuBar *menu_bar = new wxMenuBar; + + menu_bar->Append(file_menu, "&File"); + + // Associate the menu bar with the frame + subframe->SetMenuBar(menu_bar); + + int width, height; + subframe->GetClientSize(&width, &height); + + MyCanvas *canvas = new MyCanvas(subframe, wxPoint(0, 0), wxSize(width, height)); + canvas->SetCursor(wxCursor(wxCURSOR_PENCIL)); + subframe->canvas = canvas; + subframe->Show(TRUE); + + // Return the main frame window + return subframe; } BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) @@ -308,7 +310,7 @@ END_EVENT_TABLE() // Define a constructor for my canvas MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size): - wxScrolledWindow(parent, -1, pos, size) +wxScrolledWindow(parent, -1, pos, size) { } @@ -316,17 +318,17 @@ MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size): void MyCanvas::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); - - dc.SetFont(* small_font); + + dc.SetFont(* wxSWISS_FONT); dc.SetPen(* wxGREEN_PEN); dc.DrawLine(0, 0, 200, 200); dc.DrawLine(200, 0, 0, 200); - + dc.SetBrush(* wxCYAN_BRUSH); dc.SetPen(* wxRED_PEN); dc.DrawRectangle(100, 100, 100, 50); dc.DrawRoundedRectangle(150, 150, 100, 50, 20); - + dc.DrawEllipse(250, 250, 100, 50); dc.DrawSpline(50, 200, 50, 100, 200, 10); dc.DrawLine(50, 230, 200, 230); @@ -339,14 +341,13 @@ void MyCanvas::OnMouseEvent(wxMouseEvent& event) { wxClientDC dc(this); dc.SetPen(* wxBLACK_PEN); - long x, y; - event.Position(&x, &y); + wxPoint pos = event.GetPosition(); if (xpos > -1 && ypos > -1 && event.Dragging()) { - dc.DrawLine(xpos, ypos, x, y); + dc.DrawLine(xpos, ypos, pos.x, pos.y); } - xpos = x; - ypos = y; + xpos = pos.x; + ypos = pos.y; } BEGIN_EVENT_TABLE(MyChild, wxFrame) @@ -356,9 +357,9 @@ BEGIN_EVENT_TABLE(MyChild, wxFrame) END_EVENT_TABLE() MyChild::MyChild(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size, const long style): - wxFrame(frame, -1, title, pos, size, style) +wxFrame(frame, -1, title, pos, size, style) { - canvas = NULL; + canvas = NULL; } MyChild::~MyChild(void) @@ -376,29 +377,23 @@ void MyChild::OnNew(wxCommandEvent& event) mainWin->ShowWindow( TRUE ); mainWin->UpdateWindow(); } - -void MyChild::OnActivate(wxActivateEvent& event) -{ - if (event.GetActive() && canvas) - canvas->SetFocus(); -} -bool MyChild::OnClose(void) +void MyChild::OnActivate(wxActivateEvent& event) { - return TRUE; + if (event.GetActive() && canvas) + canvas->SetFocus(); } - // Dummy MFC window for specifying a valid main window to MFC, using // a wxWindows HWND. CDummyWindow::CDummyWindow(HWND hWnd):CWnd() { - Attach(hWnd); + Attach(hWnd); } // Don't let the CWnd destructor delete the HWND CDummyWindow::~CDummyWindow(void) { - Detach(); + Detach(); }