c++ 程序设计教程 mfc 简介 2. 1.runtimeclass 执行期类型识别 1) cruntimeclass struct...
TRANSCRIPT
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 串行化 CArchivevoid 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_DYNAM
IC 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* pD
C) 释放 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 );
ApplicationEscapement
nHeightOrientation
§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;