- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Window内部原理
API函数是操作系统提供给应用程序的,用来控制操作系统完成某些功能。
对事件作出反应叫做消息响应,操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。
句柄(HANDLE),资源的标识。
创建窗口:
设计一个窗口类WNDCLASS
注册一个窗口类RegisterClass
创建窗口CreateWindow
更新窗口UpdataWindow
窗口回调函数:
类WNDCLASS第二个成员变量lpfnWndProc指定了这一类型窗口的过程函数,也称回调函数。回调函数的原理是这样的,当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。
消息循环:
当应用程序建立时,操作系统会为这个应用程序分配一个消息队列,凡是和这个程序相关的消息,操作系统都会把它放在消息队列中,然后我们的应用程序会利用GetMessage从消息队列中取出一条具体的消息,然后利用TranslateMessage将WM_KeyDown和WM_KEYUp这样的消息,转化为WM-CHAR消息,然后利用DispatchMessage将消息分发出去(给操作系统);然后操作系统利用我们在设计窗口类时指定的窗口回调函数(WindowProc)对不同的函数进行不同的消息响应。
消息映射:
因为消息和一个具体窗口相关,当消息产生之后,MFC中就维护了一个句柄和C++指针的映射。然后通过指针传递给基类,基类会调用WindowProc,在WindowProc内部调用OnWinMsg,该函数在此函数内部完成了主要消息映射的处理,此时,OnwndMsg会到C++头文件查看在DECLARE_MESSAGE_MAP()之上有无消息响应函数原型申明,然后在原文件中查看在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间有没有消息映射的宏,如果成功就会调用消息响应函数进行处理。
Doc类是文档类。数据加载存储有Doc类完成,数据显示修改由View完成。
消息映射:
1.afx_msg void OnMessageBox() 消息响应函数原型申明
2.On_COMMAND(IDM_MESSAGE_BOX,OnMessageBox)定义消息映射宏
3.void CMainFrame::OnMessageBox()
{MessageBox(OK);}
4.菜单变灰:
m_bAutoMenuEnable = false;// CMainFrame 的构造函数添加GetMenu()- EnableMenuItem(IDM_MESSAGE_BOX, MF_GRAYED);
View用于将Document类别中的数据显示在视窗中,Document类别用于存储视窗程序中的数据,继承于CDocument。
自定义的MyView类别继承与CView类别,必须注意要过载OnDraw虚拟函数。OnDraw函数在重绘视窗以及打印2时,都会被呼叫。
利用CFrameWnd::Create直接载入菜单资源。
在在程序里,修改菜单时使用CMenu。
建立工具栏,必须载入afxext.h标头文件
CButton::CreateBOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT rect, CWnd* pParentWnd, UINT nID );
动态创建一个按纽
LPCTSTR lpszCaption 按纽文字
DWORD dwStyle 按纽样式,常选用BS_DEFPUSHBUTTON表示下压式按纽,
控件本身也是窗口,因此还具有窗口类型,如让控件创建后即可见,可给控件WS_VISIBLE,
通常还具有WS_CHILD属性
const RECT rect??? 矩形区域,可以是CRect类型,也可是Rect结构体。可直接由CRect构造,如CRect (0,0,10,10).。
CWnd* pParentWnd 为父窗口指针,若消息响应在父类中,可直接用this指针。UINT nID 可随便给(只能为数字?)。
注意用此函数时需判断该控件是否已与该控件窗口已关联,因为若关联两次会出现错误,动态创建控件好象只能创建一个控件。
CWnd::GetDlgItem CWnd* GetDlgItem( int nI
文档评论(0)