一个最简单的MFC必须有 两个类 一个CMyApp的全局对象
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance ();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow ();
protected:
afx_msg void OnPaint ();
DECLARE_MESSAGE_MAP ()
};
以上位于头文件中
CMyApp myApp;
以上位于cpp中
完成一个消息响应有四步
1、定义消息值,系统的已经定好了
2、CFrameWnd继承类中声明
3、cpp中消息映射
4、cpp中定义消息函数
拆解消息响应
单文档示图
Frame中接收数据,取得一个doc类的指针,把数据赋值给这个指针的参数。View类中的OnDraw函数中也绑个doc类的指针,通过这个指针把数据在View中显示出来
多线程
线程属于进程 线程和别的进程平均分配cpu时间。进程有资源什么的
MFC把线程分为UI线程和工作者线程。从分时间片上来讲是一样的。UI线程能成为一个窗口,工作者线程不能。UI线程接收数据到一个缓冲环。由worker线程从环中读。因为是通过消息接收来实现接收数据。而消息是发线窗口的。worker没窗口。
worker线程能自己挂起,但不能自己唤醒
怎么看一个大型程序源码
一、看看这软件怎么玩的,就是看看需求
二、三个架构
1、类架构 看类的继承关系 画个图
2、对象的创建图
3、程序架构,流程图。以对象为单位 一个对象调用另一个对象
哪是第一个对象?
根据消息来找
对一个函数设断点,再go,再在call stack,调用的栈结构。看看谁调的他
怎么封一个类
数据private或protected 成员函数 public
例
View类中有OnLButtonDown消息响应函数,在这个函数中 CSquaresDoc *pDoc = GetDocumet ();调用View类中的GetDocume函数得到Doc类的一个指针
CSquareDoc * CSquaresView::GetDocument()
{
ASSERT(m_pDcoumetn->IsKindOf(RUNTIMe_CLASS)CSquaresDoc)));
return (CSquaresDoc*)m_pDocumetn;
}
下面注意
COLORREF clrCurrentColor = pDoc->GetCurrentColor();
他是调用Doc类中的函数GetCurrentColor,不是直给Doc类的变量赋值,如果直接赋值Doc类的哪个变量就得public。通过GetCurrentColor函数返回m_clrCurrentColor的值
再调用pDoc->SetQquar(i, j, clrCurrentColor);函数。始终在View操作Doc