Building an MFC Application

Download Report

Transcript Building an MFC Application

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 File  new  Project 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 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; cs.cx = 700; cs.cy = 300; //X pos of window //window width //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, 0, 0, 0, FW_NORMAL, TRUE, FALSE, 0, // nHeight in points // nWidth // nEscapement // nOrientation // nWeight // bItalic // bUnderline // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, // nClipPrecision // 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

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

MainFrame.h

MyWinApp.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