X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bbf1f0e5cffb8c01696eb26e254857a61f017d70..6c7afb7435d11d7b67d16c51e1302cad5572491e:/samples/mfc/mfctest.cpp diff --git a/samples/mfc/mfctest.cpp b/samples/mfc/mfctest.cpp index cbbcd343c2..21cf44f819 100644 --- a/samples/mfc/mfctest.cpp +++ b/samples/mfc/mfctest.cpp @@ -1,39 +1,46 @@ -// 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 wxWidgets 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 +// This sample pops up an initial wxWidgets 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 +// is a class that allows a wxWidgets window to be seen as a CWnd // for the purposes of specifying a valid main window to the // MFC initialisation. // // 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: +// initially as the main frame, and allows wxWidgets frames to be +// 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 wxWidgets 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 wxWidgets in DLL mode currently includes windows.h, so you must only +// try linking wxWidgets statically. // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -42,8 +49,10 @@ #pragma hdrstop #endif -#ifndef WX_PRECOMP #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 the library." #endif #ifdef new @@ -60,8 +69,6 @@ #include "mfctest.h" -#include "wx/wx.h" - ///////////////////////////////////////////////////////////////////////////// // theApp: @@ -69,49 +76,42 @@ // CTheApp theApp; -// wxWindows elements +// wxWidgets elements // 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 @@ -126,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: @@ -140,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: @@ -162,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 wxWidgets message box.\nWe're about to create a new wxWidgets frame.", "wxWidgets", wxOK); + wxGetApp().CreateFrame(); } // CMainWindow message map: @@ -182,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() ///////////////////////////////////////////////////////////////////////////// @@ -201,42 +201,46 @@ 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 wxWidgets main window. + // Wrap wxWidgets 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 +// Override this to provide wxWidgets message loop // compatibility 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) @@ -248,61 +252,55 @@ BOOL CTheApp::OnIdle(LONG lCount) } /********************************************************************* - * wxWindows elements - ********************************************************************/ - +* wxWidgets 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); - - 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("wxWidgets 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) @@ -312,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) { } @@ -320,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.SetPen(wxGREEN_PEN); + + 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.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); @@ -342,15 +340,14 @@ void MyCanvas::OnPaint(wxPaintEvent& event) void MyCanvas::OnMouseEvent(wxMouseEvent& event) { wxClientDC dc(this); - dc.SetPen(wxBLACK_PEN); - long x, y; - event.Position(&x, &y); + dc.SetPen(* wxBLACK_PEN); + 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) @@ -360,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) @@ -380,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. +// a wxWidgets HWND. CDummyWindow::CDummyWindow(HWND hWnd):CWnd() { - Attach(hWnd); + Attach(hWnd); } // Don't let the CWnd destructor delete the HWND CDummyWindow::~CDummyWindow(void) { - Detach(); + Detach(); }