C++程序设计教程
MFC简介 2
1.RuntimeClass 执行期类型识别
1) CRuntimeClass
struct CRuntimeClass {
LPCSTR m_lpszClassName;
CRuntimeClass* m_pBaseClass;
static CRuntimeClass* pFirstClass;
CRuntimeClass* m_pNextClass;
};
?
CObject
m_pBaseClass
m_pNextClass
CCmdTarget
m_pBaseClass
m_pNextClass
CWnd
m_pBaseClass
m_pNextClass
NULL
2.Serialize 串行化
?CArchive
void CMyDoc::Serialize(CArchive& ar)
{
if ( ar.IsStoring() )
ar << (WORD)m_sizeDoc;
else // loading
ar >> (WORD&)m_sizeDoc;
}
3.Message Mapping 消息映射
1) DECLARE_MESSAGE_MAP()
2) BEGIN_MESSAGE_MAP()
ON_COMMAND(……)
END_MESSAGE_MAP()
3) CWinApp
InitInstance()
Run()
ExitInstance()
4,MFC类的层次结构
class CObject
class CCmdTarget, public CObject
class CWinThread, public CCmdTarget
class CWinApp, public CWinThread
class CMyWinApp, public CWinApp
class CWnd, public CCmdTarget
class CView, public CWnd
class CMyView, public CView
class CFrameWnd, public CWnd
class CMainFrame, public CFrameWnd
class CDocument, public CCmdTarget
class CMyDoc, public CDocument
1,CObject
1) 一般诊断 AssertValid
2) 运行期识别 RuntimeClass
3) 串行化 Serialize
4) 动态创建 DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC
2,CCmdTarget, public CObject
1) 消息发送
BEGIN_MESSAGE_MAP(CMyView,Cview)
ON_COMMAND(ID_FILE_OPEN,OnFileOpen)
END_MESSAGE_MAP()
2) 等待光标
3) 支持自动化 Idispatch COM
3,CWinApp, public CWinThread
1) 获取应用程序的信息。
2) 支持注册表 RegistryKey
3) 支持文档 Document Template
4,CWnd, public CCmdTarget
1) 注册新窗口类。
2) 创建和使用窗口 Create,CreateEx;
5,CFrameWnd, public CWnd
标题栏、系统菜单、边框、最小 /最大化
6,CView, public CWnd
1) 显示 /打印的处理 OnDraw()
2) 与用户进行交互操作 (鼠标 /键盘 )
OnLButtonDown/OnLButtonUp
OnKeyDown … …
3) 系统重画 Invalidate(); UpdateWindow()
7,CDocument, public CCmdTarget
1) 文档的输入 /输出。
OpenDocument/SaveDocument
2) 数据的保存和更新;
3) View的维护。
GDI基础知识
? GDI(图形设备接口)
? GDI是一个可执行程序
? GDI是一个抽象的绘图程序接口,程序通过它
访问图形设备驱动
? DC( device context )(设备上下文)是绘图
图形函数的集合。
? CDC类包含了绘图所需要的所有成员函数。
CDC类的派生类
派生类名称 说明
CClientDC 提供对窗口客户区域的图形访问
CMetaFileDC 创建独立于设备的图元文件
CPaintDC 在 CMainFrame中的 OnPaint()内使
用的 DC
CWindowDC 在整个窗口画图的 DC
§ 与设备环境 DC有关的常用函数
? 1) GetDC() ? CDC* CWnd::GetDC()
? 在 CWnd的派生类中获取 DC指针
? 2) ReleaseDC() ? int ReleaseDC(CDC*
pDC)
? 释放 GetDC得到的 CDC对象
? 3) BeginPaint() ?
? 为指定窗口的画图作准备
? 4) EndPaint()
? 结束绘图
? 5) SelectObject() 将一个图形对象选入设备
环境 DC,
§ GDI对象
图形类
CGdiObject
CBrush
CPen
CFont
CBitmap
CPalette
CRgn
§ GDI对象的用法
void CTestView::OnDraw(CDC* pDC)
{
… …
CPen pen(PS_SOLID,1,RGB(0,0,0));
// 构造画笔对象
// 选择新设备环境的同时,保存旧的绘图对象到设备环境
CPen* pOldPen = pDC->SelectObject(&pen);
… …
pDC->SelectObject(pOldPen);// 恢复
}
§ 4 GDI对象类
? CPen 类构造函数
CPen( );
CPen( int nPenStyle,int nWidth,
COLORREF crColor );
throw( CResourceException );
CPen( int nPenStyle,int nWidth,const
LOGBRUSH* pLogBrush,int nStyleCount
= 0,const DWORD* lpStyle = NULL );
throw( CResourceException );
? PS_SOLID Creates a solid pen,
? PS_DASH Creates a dashed pen,Valid only when
the pen width is 1 or less,in device units,
? PS_DOT Creates a dotted pen,Valid only when the
pen width is 1 or less,in device units,
? PS_DASHDOT Creates a pen with alternating
dashes and dots,Valid only when the pen width is 1
or less,in device units,
? PS_DASHDOTDOT Creates a pen with alternating
dashes and double dots,Valid only when the pen
width is 1 or less,in device units,
? PS_NULL Creates a null pen,
§ CBrush 类
? CBrush的构造函数
CBrush( );
CBrush( COLORREF crColor );
throw( CResourceException );
CBrush( int nIndex,COLORREF
crColor );
throw( CResourceException );
CBrush( CBitmap* pBitmap );
throw( CResourceException );
? HS_BDIAGONAL Downward hatch (left to
right) at 45 degrees
? HS_CROSS Horizontal and vertical
crosshatch
? HS_DIAGCROSS Crosshatch at 45 degrees
? HS_FDIAGONAL Upward hatch (left to right)
at 45 degrees
? HS_HORIZONTAL Horizontal hatch
? HS_VERTICAL Vertical hatch
填充效果
HS_VERTICAL HS_CROSS
§ CFont 类
BOOL CreateFont( int nHeight,int nWidth,
int nEscapement,int nOrientation,
int nWeight,BYTE bItalic,
BYTE bUnderline,// 下划线
BYTE cStrikeOut,// 删除线
BYTE nCharSet,
BYTE nOutPrecision,
BYTE nClipPrecision,
BYTE nQuality,
BYTE nPitchAndFamily,
LPCTSTR lpszFacename );
Application
Escapement
nHeight
Orientation
§ CFont 类
BOOL CreateFontIndirect(const LOGFONT*
lpLogFont );
typedef struct tagLOGFONT { // lf
LONG lfHeight; LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight; BYTE lfItalic; BYTE lfUnderline;
BYTE lfStrikeOut; BYTE lfCharSet;
BYTE lfOutPrecision; BYTE lfClipPrecision;
BYTE lfQuality; BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
?