消息 循环Word下载.docx
- 文档编号:15845759
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:20
- 大小:194.42KB
消息 循环Word下载.docx
《消息 循环Word下载.docx》由会员分享,可在线阅读,更多相关《消息 循环Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
BOOLCWinThread:
:
PumpMessage()
{在此设置一个断点
ASSERT_VALID(this);
GetMessage(&
m_msgCur,NULL,NULL,NULL))
。
if(m_msgCur.message!
=WM_KICKIDLE&
&
!
PreTranslateMessage(&
m_msgCur))
{
:
TranslateMessage(&
m_msgCur);
DispatchMessage(&
}
返回CWinThread∷Run(),在此处if(!
PumpMessage())returnExitInstance();
设置一个断点
在if(!
PumpMessage())if(!
∷GetMessage(&
m_msgCur,NULL,NULL,NULL))前加上断点,调式运行,始终在消息循环内部运行。
那么消息循环路由的消息是不是还有窗口过程呢?
下面我们再看看
在WINCORE.CPP中,查找afxend,进入函数
BOOLAFXAPIAfxEndDeferRegisterClass(LONGfToRegister)
//maskoffallclassesthatarealreadyregistered
AFX_MODULE_STATE*pModuleState=AfxGetModuleState();
fToRegister&
=~pModuleState->
m_fRegisteredClasses;
if(fToRegister==0)
returnTRUE;
LONGfRegisteredClasses=0;
//commoninitialization
WNDCLASSwndcls;
memset(&
wndcls,0,sizeof(WNDCLASS));
//startwithNULLdefaults
wndcls.lpfnWndProc=DefWindowProc;
wndcls.hInstance=AfxGetInstanceHandle();
wndcls.hCursor=afxData.hcurArrow;
其中红色的那句我们可以看到,窗口类过程指针指向的是缺省窗口,实际上很多时候消息循序路由给操作系统的细小并不是都交给缺省窗口来处理,在这里做了个转换,采用了消息映射这种技术,由消息映射函数来处理。
到此,整个MFC框架应用程序的内部执行过程和我们在前面讲的在WINDOWS环境下的程序一样,都需要哦一个窗口类,在MFC中所需要的窗口类已经预先设计好,已有了一些默认类名,我们只需利用这些类名注册,注册完再显示,更新窗口,然后是消息循环。
我们再演示一遍。
、
1CTestApptheapp;
l利用全局对象启动程序,有了全局对象,所有基类中的this指针指向该对象。
2CTestApp:
CTestApp()全局对象对象调用构造函数产生这个对象,当我们调用子类的构造函数时,首先构造父类,所以cwinapp的构造函数首先被调用,完成了应用程序初始化的工作,同时将子类的指针保存起来,进入到winmain函数
3winmain函数tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,intnCmdShow)
在该函数中我们可以获取子类的指针CWinThread*pThread=AfxGetThread();
CWinApp*pApp=AfxGetApp();
利用子类指针我们可以虚拟的函数,根据多态性的原理,响应就能调用到子类的函数,也就是if(!
pThread->
InitInstance())
在InitInstance()中完成初始化的工作,包括窗口类的注册,创建,显示,更新。
4进入消息循环。
二.CViewCMainFrame类都是由CWnd类派生出来,CMainFrame类所表示的窗口是CView的表示窗口的父窗口。
CTestDoc类由CDocument类派生出来,从MSDN看CDocument类,是文档类,文档类的作用
我们要把数据本身和显示分离开,由文档、视图来完成,数据的存储加载由文档完成,数据的显示修改由视类完成。
以后有介绍,在这不详细讲解。
这些类是如何组织联系到一起,看CTestApp类的InitInstance()
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame),//mainSDIframewindow
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
classCAboutDlg:
publicCDialog,可有可无,主要是帮助等作用,是个对话框。
窗口类,窗口对象与窗口的关系:
打开程序WinMain.dsw,讲述如何利用类封装窗口,
CWndwnd;
wnd.CreateEx(...);
wnd.ShowWindow(SW_SHOWNORMAL);
wnd.UpdateWindow();
HWNDhwnd;
hwnd=CreateWindowEx();
:
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
上面语句的区别是相差了句柄hwnd,上面那种少了个句柄,是因为在CWnd类中,定义了成员变量m_hWnd,它就是句柄类型,它保存了句柄,在CreateEx函数调用时,它返回的就是句柄,将它保存到成员变量中,当再次调用ShowWindow时,不用传递句柄,当更新窗口时,也不用传递句柄,因为句柄保存在类的成员中,这就是类的封装。
在开发过程中很多人容易混淆的一点是:
CWndwnd,C++的对象wnd代表的就是窗口。
其实不是窗口,当我们关闭窗口,销毁窗口,那么这个C++的对象wnd销毁没有?
当然没有。
当窗口销毁时,仅仅是将句柄设为空。
C++的对象wnd的声明周期和窗口的生命周期不是一致的,当一个窗口销毁时跟C++对象没有任何关系,它们之间的纽带是仅仅是在C++内部有一个变量是句柄成员变量,保存了跟窗口相关的句柄。
当然在设计类时,当C++对象销毁时,窗口也要销毁,因为联系的纽带断了,窗口占有的资源要回收,所以在析构函数中,一般要释放资源内存,销毁了窗口,正因为如此,让人感觉C++对象就是窗口,刚巧窗口没了,C++对象也没有,C++对象没了窗口也没了。
窗口销毁了,对象销毁不销毁要看是不是到了声明周期。
当窗口销毁时,类的对象仍可以使用
一定要区别开窗口和窗口类,所以说我们的CMainFrame和CTestView或它们的对象就是窗口,当一个窗口销毁时,CTestView内部的成员函数我们仍可以使用。
在CWnd类中,查MSDN,查看内部成员,有一个数据成员DataMembers
m_hWnd
IndicatestheHWNDattachedtothisCWnd
为了更好的理解窗口类和窗口,我们现在要在CMainFrame窗口中添加一个按钮,先查MSDN,CButton类,CButton:
CButton
CButton();
Remarks
ConstructsaCButtonobject.
Example
//Declareabuttonobject.
CButtonmyButton;
通过构造函数,我们能够看清楚,直接构造函数使用对象,还是使用构造函数之后,还得经过初始化,才能使用对象,CButton的对象myButton已经可以使用了,但是对于一个窗口来说,还需要调用初始化的函数
Initialization
Create
CButton:
Create
BOOLCreate(LPCTSTRlpszCaption,DWORDdwStyle,constRECT&
rect,CWnd*pParentWnd,UINTnID);
在框架窗口上再产生一个CButton控件窗口,要在框架窗口产生后去产生控件。
否则该按钮控件没有地方放。
Oncreate函数中创建。
看程序例子。
MFC消息映射机制的剖析,讲述如何运用ClassWizard,,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。
掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程序进行分析。
如何设置封闭图形的填充刷子(位图画刷与透明画刷的使用)。
新建以单文档应用程序Draw.这节课我们会介绍一些画图方面的知识,先从画线开始。
在程序中画线和在纸上画线不太一样,在纸上只要拖动笔就可以。
在程序中,则需要知道两个点,在这两个点间画线,那这两个点如何捕获,想想在第一节课中我们讲到,在windows中编程是基于消息,那么要捕获原点,当鼠标左键按下的时候就是原点,也就是说我们可以捕获鼠标左键按下的消息,在这个消息中就可以得到原点,然后我们按住鼠标左键拖动,当左键松开,另一点有了,就是终点。
所以我们需要捕获两个消息,一个是鼠标左键按下的消息WM_LBUTTONDOWN和另一个鼠标左键弹起的消息WM_LBUTTONUP.在这两个消息响应中获取两个点,这两个点就决定一条线。
我们在CMaimFrame类中添加鼠标左键按下和弹起的消息响应,可以在CDrawView或CMainFrame类中做消息的捕获。
要对消息进行捕获,在框架类名上单击鼠标右键,单击增加消息处理器addwindowsmessagehandler,左列都是消息处理,找到要添加的消息WM_LBUTTONDOWN,右边选择addhandler,增加一个消息响应,然后editexisting.
在消息响应函数中假设我们添加一个消息框,表明我们按下了鼠标左键,代码是
MessageBox("
MaimFrameclicked"
);
注意:
在该函数中没有句柄这个参数,原因是MessageBox是CWnd类的成员函数,不需要句柄,有一个成员保存了消息的句柄,所以不需要,剩下两个参数都有缺省值,所以只需要一个参数即可。
我们编译运行,发现点击后没有消息框弹出来。
原因?
我们在CView类中增加鼠标左键按下的消息响应,添加方法可以和刚才的一样,还有另一种方法,在标题栏view视图下classwizard,也可以增加消息和消息响应函数,重载虚函数等。
voidCDra
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 消息 循环