绘图相关
首先,BeginPaint和EndPaint必须成对使用。BeginPaint返回的DC句柄,是基于关联窗口句柄的窗口客户区坐标系绘图。MFC中把这两个函数封装为一个类,CPaintDC类。封装的目的就是防止BeginPaint和EndPaint不成对使用,它的基类CDC类维护了m_hDc这个成员变量。CDC的绘图功能基本都是来自于m_hDC句柄原有的功能。CPaint类:客户区标准绘图类,专门提供给WM_PAINT消息使用,绘图长期有效。CClientDC类:客户区临时绘图类,在任何其他消息都可以使用。临时绘图,一切换页面就绘的图就没了,CWnd类也有个重复函数GetDC,用完了必须主动调用CWnd类的ReleaseDC,忘记了容易造成GDI泄漏。封装的API是GetDC和ReleaseDC。CWindowDC类:非客户区标准绘图类,专门提供给WM_NCPAINT消息使用,坐标系为非客户区坐标系,坐标原点为标题栏左上角,尽量不要使用这个消息。
CDC成员函数
GetPixel函数,获取对应点的颜色。获取的不一定是本窗口的颜色,但坐标系和dc有关。FloodFill函数,喷枪函数。ExtFloodFill函数支持两种填充:表面填充和边界填充。FillRect函数就是无边框的Rectangle。FrameRect函数就是无填充色的Rectangle。InvertRect函数,取反色。
GetBitmapBits函数,获取图像数据。SetBitmapBits,把图像数据设置进入位图。GetOutputTextExtent函数
WM_ERASEBKGROUND消息,客户区绘制消息。CreateCompatibleDC函数,创建的内存DC没有高宽,需要配合位图使用。SetWindowRgn函数用了一次CRgn对象就不能再用第二个CRgn,如果想用,生成一个临时对象,拷贝CRgn,然后用这个临时对象。临时Rgn在拷贝之前,必须有HRgn句柄。
串行化和CArchive类
CArchive对象本质利用CFile成员函数实现文件I/O。把数据串行化到文件中,使用CFile:
int a=10,b=20;
CFile file;
file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeReadWrite);
file.Write(&a,sizeof(a));
file.Write(&b,sizeof(b));
使用CArchive类:
CArchive ar(&file,CArchive::store);//创建一个CArchive对象,并把它与该CFile对象关联起来
ar<<a<<b;
CArchive对象也可以用来读取数据。假定file再次打开一个文件。将CArchive对象挂接到file上,并从文件读取整数
int a,b;
CArchive ar(&file,CArchive::load);
ar>>a>>b;
MFC允许多种基本数据类型以这种方式串行化,包括BYTE、WORD、LONG、DWORD、float、double、int、unsigned int、short和char。MFC可以重载<<和>>运算符,以便串行化或并行化。可以用这种方式串行化的类包括:CString、CTime、CTimeSpan、COleVariant、COleCurrency、COleDateTime、COleDateTimeSpan、CSize、CPoint和CRect。类型为SIZE、POINT和RECT的结构也可以串行化。