Building an MFC Application Using the Wizard Terms • Solution – – – – – – – – A container for related projects An executable or DLL May be constructed from multiple projects Each project or solution is a directory and its contents May have different versions May generate multiple applications Solutions & projects manageable in W. Explorer Logical relationship of solution:components does not necessarily mirror the way they are stored on disk. Solutions, Projects & directories • Solution1 (in VS explorer view) – App1 (Project 1) • X.cpp • X.h – App2 (Project 2) – App3 (Project 3) • Visual Studio Projects (WinExplorer view) – Solution 1 (folder) • • • • • App1 (folder) App2 (folder) App3 (folder) Solution1.sln Solution1.suo (shareable metadata) (user-specific metadata) • App1 might depend on App2 & App3 – Managed with project dependencies Project • A container for items e.g.; code, .rc files • May be used in other projects • Types specify language,etc. Using VS 2013 Premiere - 1 • • • • • Open VS Select FilenewProject Select Visual C++ In the center area, select MFC Application At the bottom of the screen, enter a name for your project (like "JSmith-MFC-app") – (use your own name!!) – At the bottom right corner • Check the box for "create directory" • Click OK Using VS 2013 Premiere - 2 • In the navigation panel, right-click your project name (NOT the solution name) • Click on Properties • Ensure these values are present: – Under General: • Configuration type: Application (.exe) • Use of MFC: Use MFC in a Shared DLL – Assumes user's PC has MFC installed – Faster than "Use MFC in a static library" • Common language runtime (CLR): no CLR – Under C/C++, Code Generation, Runtime Library "Multithreaded Debug" – Under Pre-compiled headers: "Not using pre-compiled headers" Using VS 2013 Premiere - 3 • You should now have – Two .h files • MainFrame.h – function prototypes & global variables • MyWinApp.h – name of your program & project #include <afxwin.h> class CMyWinApp : public CWinApp {public: virtual BOOL InitInstance(); }; – Three .cpp files • Main.cpp #include "MyWinApp.h" CMyWinApp MyApplication; • MyWinApp.cpp – #include MyWinApp.h, InitInstance code • MainFrame.cpp – #include both .h files, everything else Classes & Global variables • Declare global vars in MainFrm.h • Define, initialize in PreCreateWindow or in OnCreate ------------ following is in MainFrm.h ---------------------class CMainFrame : public CFrameWnd { // no initializations here!!! private: // declare global variables here public: // declare constructors and prototypes for // other functions in MainFrame.cpp void OnPaint(); // for example } Flow of execution • (hidden) WinMain runs • InitInstance begins – CMainFrame runs (does nothing in our case) – Main window object (CREATESTRUCT) created – PreCreateWindow • Allows "filling-in" of struct values • Window exists but is not displayed yet • Sends WM_CREATE on ending – OnCreate • Creates a view to occupy the window • Creates a status bar (if requested) • Initialize your own variables here • InitInstance ends – sends WM_PAINT • OnPaint writes/draws text & graphics, shows screen PreCreateWindow • Optional settings • "cs" is the name of the CREATESTRUCT passed to the PreCreateWindow member cs.lpszName = title; (a CString init'd here) cs.x = 0; //Y pos of window cs.y = 0; //X pos of window cs.cx = 700; //window width cs.cy = 300; //window height OnCreate • Most actions inserted by the Wizard • Can now SetFont, use it's size • Compute row positions for TextOut/DrawText OnPaint • Must do: – CPaintDC dc(this); • // Invalidate window so entire client area • // is redrawn when UpdateWindow is called. – Invalidate(); • // Update Window to cause View to redraw. – UpdateWindow(); • MAY do this: – SetFont(&myfont, true); – dc.TextOut(formatted string); Setting Font VERIFY(myfont.CreateFont( 24, // nHeight in points 0, // nWidth 0, // nEscapement 0, // nOrientation FW_NORMAL, // nWeight TRUE, // bItalic FALSE, // bUnderline 0, // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily _T("Arial"))); // lpszFacename SetFont(&myfont, true); Debugging tips • AfxMessageBox (_T("your message")); • Be CAREFUL where you put AfxMessageBox. – If it's in an OnMove, it will pop up for EVERY pixel of the movement!! – Same for OnPaint (pops up for each redraw) – May need to test for !m_wndView in OnSetFocus • Use a test to prevent multiple popups • Win32API attribute "afx_msg" is empty: – – – – E.g.; afx_msg int OnCreate(…) "afx_msg" does not apply to MFC programs Can be safely omitted when coding Wizard keeps it for commonality Window Creation • Create new frame window object CMainFrame* pFrame = new CMainFrame; CMainFrame is the frame object pFrame points to the object • Set it as main window object m_pMainWnd = pFrame; • Load frame's resources pFrame->LoadFrame(……parameters….) Now show & update the window • Notes: – – – – "stdafx.h" includes "afxwin.h" m_pMainWnd is defined in afxwin.h Starting with version 3.0, all MFC classes are "thread safe" and require the multi-threaded run-time libraries to link successfully. Do NOT add: #include <windows.h> to your code MFC-Hello sample • MainFrm.cpp – 1 message map (for CMainFrame class) – handlers - on_wm_create() , on_wm_setfocus() • MFC-hello.cpp – 2 message maps (for CMFChelloApp class, for CAboutDlg class) – there are two message maps, because there are 2 classes, though the message map for the CAboutDlg class does not have any handlers. – rule is 1 map per class • Childview.cpp - 1 message map for the cChildview class. Basic Structure of an MFC program afxwin.h MyWinApp.h MainFrame.h MainFrame.cpp Main.cpp MyWinApp.cpp Using fonts • CreateFont – allows specifying EVERYTHING • CreatePointFont – specify only size & typeface Cfont myfont; myfont.CreateFont (…); or myfont.CreatePointFont (…); • Activate it: – Method 1 (using a pointer to the context object) CDC* dc; dc = GetDC(); CFont * fontptr = dc->SelectObject(&myfont); – Method 2 (using the context object directly) CPaintDC dc(this);// "this" is handle for current window CFont * fontptr = dc.SelectObject(&myfont); Resource (.rc) files • Collection of UI elements http://msdn.microsoft.com/en-us/library/y3sk7e6b.aspx – Provide info to user • • • • • • Icons Bitmaps Toolbars Cursors Dialogs Accelerators Resource files & their content • Projname.rc – toolbars, dialog boxes, etc. – Accelerator and string tables. – Default "About" dialog box. • Resource.h – definitions for the resources • Projname.ico – The icon file for the project or a control