05-Microsoft Foundation Classes

Download Report

Transcript 05-Microsoft Foundation Classes

Microsoft Foundation Classes

What is MFC?

• • • Set of C++ classes written by MS Simplifies writing complex programs Covers many areas: – GUI – I/O – O/S interfaces – ActiveX • Framework for IE extensions • Component of Windows

Why Use MFC?

• • • • • Faster development More code is reusable Many common tasks are "built-in" – Winmain, WndProc Smaller executable Uses all the C++ paradigms – Inheritance, polymorphism, etc.

MFC class categories • • • • • • • • • • CObject – the root class Application architecture classes

Window, dialog, control Drawing, printing Datatypes

Array, list, map File & DB Internet & networking OLE Debugging Used in this course

Cobject • • • • • Think of it as the "master" class Serialization – Stream data to/from devices (disks) Runtime class info Debugging Some derived classes – Cmenu (menus & menu mgmt.) – CDC (device context & drawing) – CGdiObject (drawing devices – brushes, etc)

Related info • • • • MFC class hierarchy chart Macros & global variables WndProc (Win32API) buried in MFC library Message Maps – Names of events – Handler functions for those events – E.g.; ON_WM_MOVE for CMainFrame::OnMove – ON_WM_MOVE pre-defined constant – OnMove pre-defined fn in the CMainFrame class

Window gets moved WndProc() case WM_MOVE: movefn(); Win32API WIn32API vs MFC Message handling Window gets moved CMainFrame::OnMove MFC

Parts of a basic MFC Program - 1 MyWinApp.h

#include { class CMyWinApp : public CWinApp public: virtual BOOL InitInstance(); };

Parts of a basic MFC Program – 2 MainFrame.h

#include class CMainFrame : public CFrameWnd { private: // variables known to all CMainFrame members public: // define the

prototypes

for functions to handle window events CMainFrame(); // class constructor //

prototypes

for members named in the MESSAGE MAP // The MESSAGE MAP is implemented in MainFrame.cpp

// afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); afx_msg void OnMove(int x, int y); afx_msg void OnPaint(); // msg hndlr for WM_PAINT event void

common

(CWnd* wptr); DECLARE_MESSAGE_MAP(); }; // note: the " afx_msg " prefix is pre-VS 2005 and is #defined as empty

Parts of a basic MFC Program – 3 // Main.cpp

#include "MyWinApp.h" CMyWinApp MyApplication;

Parts of a basic MFC Program – 4 // MyWinApp.cpp

// create the window frame & display it #include "MyWinApp.h" #include "MainFrame.h" BOOL CMyWinApp::InitInstance() { CMainFrame *

pFrame

;

pFrame

= new CMainFrame; m_pMainWnd =

pFrame

;

pFrame-

>ShowWindow(SW_SHOW);

pFrame-

>UpdateWindow(); } return TRUE;

Parts of a basic MFC Program – 5a MainFrame.cpp

• This is where all the real work gets done #include "MainFrame.h" // Define the messages we will respond to and create the window BEGIN_MESSAGE_MAP (

CMainFrame

, CFrameWnd) // classname, base class //ON_WM_CREATE() //ON_WM_SHOWWINDOW() //ON_WM_ACTIVATE() ON_WM_MOVE() ON_WM_PAINT() END_MESSAGE_MAP()

} { Parts of a basic MFC Program – 5b MainFrame.cpp – part 2

CMainFrame

::

CMainFrame

()// Explicit constructor CString title = "DJ's WIndow"; Create (NULL /* classname*/, title, WS_OVERLAPPEDWINDOW, CRect (0, 0, 670, 300), NULL, /* parent window ptr*/ 0, /* ID */ NULL /* create context ptr - only if overriding the context */ );

Parts of a basic MFC Program – 5c void

CMainFrame

::OnPaint() {CPaintDC dc(this);// "this" is a handle for current window // dc is the "device context" for the window dc.TextOut(x, y, "hello"); // works for printers or displays common (this); // call common code and pass the context } void

CMainFrame

::OnMove() { } void

CMainFrame

:: common (CWnd * wptr) } { // have the window ptr (wptr), but not always using it

Window, Dialog & Control classes • • • • • Frame Window – CFrameWnd, CMenu View – – Represent client area of a frame – Show data, accept input • Cview, CScrollView, form & record, control Dialog box (modal, modeless) – Cdialog, CDataExchange Control – – Attached to CFrameWnd or CMiniFrameWnd – Static, text, number, button, list, toolbar, misc Control bar

CFrameWnd • • Framework for a single-document interface Usage – Derive a class using CFrameWnd::Create – Add member variables for your data – Implement message handlers – Define a message map • Specifies actions when the window gets a msg

Dialog boxes • • Modal – – Requires user interaction Blocks program operation until action completed – Mode errors can be caused by: • • Caps-lock or Insert key Focus stealing (user types but nothing happens) Modeless – No interaction required (e.g.; toolbar) • Note: this happens a lot in Unix/Linux editor, "vi", because mode indicator can be "off".

Views • • • • Represent the client area of a frame window Associated with document class & CFrameWnd 2 types of document views – Cview - base class for app-specific views – CScrollView - base class for scrollable data • CFormView, CRecordView, CHtmlEditView Control views – CCrtlView, CEditView, CCListView, CTreeView

GetWindowRect • Win32API version BOOL WINAPI GetWindowRect ( HWND hWnd, LPRECT lpRect ); note: TWO parameters, lpRect is a

struct

• MFC version: void GetWindowRect ( LPRECT lpRect ) const; note: one parameter, lpRect is a

class

(a Crect object)

Document/View Architecture • • • • • Display of data should be independent of the data May need to have different ways to look at the data CDocument class holds the data CView manages display and UI 2 kinds of apps: – Single Document Interface – Multiple Document Interface

View • • • • Display of the data & a way to display it Frame window: contains a view of the data Multiple views possible But only ONE doc per View

tips • • SDI application – One frame window derived from class CFrameWnd . • This window is both: – –

main frame window

and

document frame window.

MDI application, the main frame window is derived from class CMDIFrameWnd , and the document frame windows, which are MDI child windows, are derived from class CMDIChildWnd .