一、 MFC中的Callback函数
1 如果类的成员函数是个Callback函数,必须将其置成static型以去掉隐藏的this指针。凡是由程序员设计而由Windows系统呼叫的函数,统称为Callback函数。某些Windows系统函数需要一个Callback函数作为它的一个参数,如SetTimer,LineDDA,EnumObjects。通常API在做完某种活动后或满足一定状态时调用Callback函数。
2 EnumObjects发现某个Device Context的GDI object符合指定的Type时,调用Callback函数。Callback函数必须是全局的函数或是类的一个static函数。
二、 对Idle的处理
鉴于CThread::Run()中已经把MessageGet、Dispatch和Idle都包容了,要使程序在Idle时做些事情,简单的做法就是重新实现virture函数OnIdle():
BOOL CMyWinApp::OnIdle(LONG lCount)
{
CMyFrameWnd* pWnd = (CMyFrameWnd*)m_pMainWnd;
pWnd->IdleTimeHandler(lCount);
return TRUE;
}
三、 Document Template的意义
Document一般是放置程序的Data Structure,View是显示Document的内容,Data有体有面,View就是Document的面。在Document中数值的处理用各种设计结构,链表,树,图等等,而数值在表现时就必须使用绘图工具:坐标,画刷颜色,画弧线,字体等,这些都在View中完成。其次View还负责对UI Message的收集处理。
view的表现舞台时Frame,这样的切割是为了让View独立于各种视窗,比如对MDI,SDI和OLE Document Frame,view都不需要变化,只要有Frame的变化就可以了,提高了View的独立性。使Document/View结构更稳定得处理数据。
pDocTemplate = new CMultiDocTemplate( //w6 CMultiDocTemplate规划Doc,
//View,DocFrame三者的关系
IDR_SCRIBTYPE,
RUNTIME_CLASS(CScribbleDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CScribbleView));
AddDocTemplate(pDocTemplate);
如果需要支持多种文件格式,如text和bitmap,就需要多个CMultiDocTemplate对象和多个这样的链接操作。
View就是观看Document的镜头。