MFC一些必要的名词(二)
- UI:Windows 程序分为「程序代码」和「UI(User Interface)资源」两大部份,两部份最后以RC
编译器整合为一个完整的EXE 文件( 图 1-1 )。所谓UI 资源是指功能菜单、对话框
外貌、程序图标、光标形状等等东西。这些UI 资源的实际内容(二进制代码)系借助各
种工具产生,并以各种扩展名存在,如.ico、.bmp、.cur 等等。程序员必须在一个所谓
的资源描述档(.rc)中描述它们。RC 编译器(RC.EXE)读取RC 档的描述后将所有UI
资源档集中制作出一个.RES 档,再与程序代码结合在一起,这才是一个完整的Windows
可执行档。
2.消息驱动:可以分为由硬件装置所产生的消息(如鼠标
移动或键盘被按下),放在系统队列(system queue)中,以及由Windows 系统或其它
Windows 程序传送过来的消息,放在程序队列(application queue)中。
3. UpdateWindow函数: 我们希望先传送个WM_PAINT 给窗口, 以驱动窗口的绘图动作, 所以调用
UpdateWindow。
4.消息处理函数:TranslateMessage 是为了将键盘消息转化, DispatchMessage 会将消息传给窗口函
数去处理;
因为消息发生之时,操作系统已根据当时状态,为它标明了所属窗口,而窗口所属之窗口类别又已经明白标示了窗口函数(也就是wc.lpfnWndProc 所指定的函数),所以DispatchMessage不需要再指定窗口函数(注意DispatchMessage是把消息送到对应的窗口函数中去)
5.将数据和带待处理该数据的函数封装在一起:对象导向观念中把「资料」和「处理资料的方法」封装起来的一种具体实现
6. 消息映射:有没有可能把窗口函数的内容设计得更模块化、更一般化:(具体见深入浅出MFC)
#define dim(x) (sizeof(x) / sizeof(x[0]))
struct MSGMAP_ENTRY {
UINT nMessage;
LONG(*pfn)(HWND, UINT, WPARAM, LPARAM);
};
struct MSGMAP_ENTRY _messageEntries[] =
{
WM_CREATE, OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_COMMAND, OnCommand,
WM_SETFOCUS, OnSetFocus,
WM_CLOSE, OnClose,
WM_DESTROY, OnDestroy,
};
struct MSGMAP_ENTRY _commandEntries =
{
IDM_ABOUT, OnAbout,
IDM_FILEOPEN, OnFileOpen,
IDM_SAVEAS, OnSaveAs,
};
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int i;
for (i = 0; i < dim(_messageEntries); i++) { //
if (message == _messageEntries[i].nMessage)
return((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));
}
LONG OnCommand(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int i;
for (i = 0; i < dim(_commandEntries); i++) { //
if (LOWORD(wParam) == _commandEntries[i].nMessage)
return((*_commandEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return(DefWindowProc(hWnd, message, wParam, lParam));
}
LONG OnCreate(HWND hWnd, UINT wMsg, UINT wParam, LONG lParam)
{
...
}
7. 对话框函数:其类型非常类似窗口函数,但是它通常只处
理WM_INITDIALOG 和WM_COMMAND 两个消息。对话框中的各个控制组件也都是小小窗口,各有自己的窗口函数,它们以消息与其管理者(父窗口,也就是对话框)沟通。而所有的控制组件传来的消息都是WM_COMMAND,再由其参数分辨哪一种控制组件以及哪一种通告(notification)
Modal 对话框的激活与结束,靠的是DialogBox 和EndDialog 两个API 函数
8. 资源描述档 ( .RC ):RC 文件是一个以文字描述资源的地方。常用的资源有九项之多,分别是ICON、CURSOR、
BITMAP、FONT、DIALOG、MENU、ACCELERATOR、STRING、VERSIONINFO。还可能有新的资源不断加入;这
些文字描述需经过RC 编译器,才产生可使用的二进制代码
- Windows程序的生与死:
***********************************
详细解释:
1. 程序初始化过程中调用CreateWindow,为程序建立了一个窗口,做为程序的萤
幕舞台。CreateWindow 产生窗口之后会送出WM_CREATE 直接给窗口函数,
后者于是可以在此时机做些初始化动作(例如配置内存、开文件、读初始资
料...)。
2. 程序活着的过程中,不断以GetMessage 从消息贮列中抓取消息。如果这个消
息是WM_QUIT,GetMessage 会传回0 而结束while 循环,进而结束整个程序。
3. DispatchMessage 透过Windows USER 模块的协助与监督,把消息分派至窗口
函数。消息将在该处被判别并处理。
4. 程序不断进行2. 和3. 的动作。
5. 当使用者按下系统菜单中的Close 命令项,系统送出WM_CLOSE。通常程序
的窗口函数不栏截此消息,于是DefWindowProc 处理它。
6. DefWindowProc 收到WM_CLOSE 后, 调用DestroyWindow 把窗口清除。
DestroyWindow 本身又会送出WM_DESTROY。
7. 程序对WM_DESTROY 的标准反应是调用PostQuitMessage。
8. PostQuitMessage 没什么其它动作,就只送出WM_QUIT 消息,准备让消息循
环中的GetMessage 取得,如步骤2,结束消息循环。
******************************************
10 .空闲时间的处理: OnIdle;所谓空闲时间(idle time),是指「系统中没有任何消息等待处理」的时间
**************************
背景工作最适宜在空闲时间完成。传统的SDK 程序如果要处理空闲时间,可以以下列
循环取代WinMain 中传统的消息循环:
while (TRUE) {
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) {
if (msg.message == WM_QUIT) //注意此处二者的不同
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
OnIdle();
}
}
原因是PeekMessage 和GetMessage 的性质不同。它们都是到消息队列中抓消息,如果
抓不到,程序的主执行线程(primary thread,是一个UI 执行线程)会被操作系统虚悬住。
当操作系统再次回来照顾此一执行线程,而发现消息队列中仍然是空的,这时候两个API
函数的行为就有不同了:
GetMessage 会过门不入,于是操作系统再去照顾其它人。
PeekMessage 会取回控制权,使程序得以执行一段时间。于是上述消息循环进
入OnIdle 函数中。
***************************
11 .MFC 有两个十分十分重要的虚
拟函数:与document 有关的Serialize 函数和与view 有关的OnDraw 函数。你应该在自己的CMyDoc 和CMyView 中改写这两个虚拟函数。
12.
MFC一些必要的名词(二)的更多相关文章
- MFC六大核心机制之二:运行时类型识别(RTTI)
上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...
- MFC 构建、消亡 顺序 (二)--多文档 (MDI)
MFC 构建.消亡 顺序 (二)--多文档 (MDI) by:http://www.cnblogs.com/vranger/ (一)MDI 生成顺序 (二)打开文档-“Open” (三)新建文档-“N ...
- 《MFC游戏开发》笔记二 建立工程、调整窗口
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...
- MFC的简单加法器(二)
创建对话框主要分两大步,第一,创建对话框资源,主要包括创建新的对话框模板.设置对话框属性和为对话框添加各种控件:第二,生成对话框类,主要包括新建对话框类.添加控件变量和控件的消息处理函数等.鸡啄米在本 ...
- VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)
上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Rib ...
- MFC编程入门之十二(对话框:非模态对话框的创建及显示)
上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 非模态对话框显示后,程序其他窗口仍然能正常运行,可以响应用户输入,还可以相互切换.上一讲中创建的Tip模态对话框 ...
- MFC使用SQLite 学习系列 二:无法容忍的数据插入效率
上一篇随笔中,介绍了,基本的使用没什么问题了,那么开始数据的插入. 一 问题--无法容忍的插入效率 代码写入基本完成,然后开始测试.起初,插入数据的时候基本上是插入每次插入9组数据,看不出来数据插入的 ...
- VS2010/MFC编程入门之四十二(MFC常用类:CString类)
上一节鸡啄米讲了分割窗口的有关知识,本节开始讲解MFC的一些常用类,先来说说CString类. CString类简介 CString类作为MFC的常用类,当之无愧.可以这样说,只要是从事MFC开发,基 ...
- VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)
上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...
- MFC/QT 学习笔记(二)——MFC入门
MFC以C++形式封装了Windows API //实践 编写MFC需要的头文件#include <afxwin.h> 程序执行流程: 实例化应用程序对象(有且只有一个) 执行程序入口函数 ...
随机推荐
- SciTech-点焊机-微波炉变压器制作一台1000W电流500A的加强版点焊机;
发挥主观能动性,有理论与科学,有思想有资源,实事求是,办法总比问题多. 用微波炉变压器制作一台加强版点焊机: 输出电流500A,功率1000瓦 微波炉有大功率全铜变压器. 初级或次级线圈由大功率可控硅 ...
- CentOS 7安装MariaDB 10详解以及相关配置-九五小庞
第一步:添加 MariaDB yum 仓库 首先在CentOS操作系统中/etc/yum.repos.d/目录下添加 MariaDB 的YUM配置文件MariaDB.repo文件. vi /etc/y ...
- 控制一行显示多少个Item
.project-list-ul { display: grid; margin-top: 5px; grid-template-columns: repeat(7, minmax(0,1fr)); ...
- 【攻防世界】a_good_idea
1. 首先下载附件,解压出来之后得到的是一个jpg图片,还是先放到StegSolve看看吧. 2. 没有什么有用信息,于是继续放到010 Editor中查看,滑到代码最下面发现了两个文件to.png和 ...
- 高德地图 js sdk 出现 INVALID_USER_SCODE
文档中给出的错误码对照表好像与 js sdk 无关. 添加密匙可以解决.注意绑定服务为 "Web 端",如果你现在的 key 没有密匙,也可以创建一个新的 key,你会得到一个配套 ...
- UTF-8编码的问题
在工作中,经常需要用到Restful的接口调用,由于往往是推送给对方数据,对方返回状态,所以,只需要给对方推送正确的UTF-8编码即可.这个在我之前的例子里已经有了. 但是最近调用一个接口的时候,发现 ...
- 基于 Sync your cookie + Cloudflare KV + MCP + Claude 实现 B站视频信息自动获取
前言 在现代 Web 开发中,我们经常需要从各种平台获取数据.本文将分享我如何构建一个 B站视频信息获取工具,这个项目不仅仅是一个简单的爬虫,而是一个集成了多项前沿技术的完整解决方案: Sync yo ...
- 关于超过js的number类型最大值(9007199254740992),的解决办法
bug经过:点击修改无法展示信息(修改时调用queryOne,以id(long)为值,页面传过去的id=1480042498255640-00 ,在数据库中该id=148004249825564012 ...
- k8s安装步骤
第一天:https://kubesphere.com.cn/docs/quick-start/all-in-one-on-linux/ 1.export KKZONE=cn2.curl -sfL ht ...
- redis外网访问和protected-mode配置
在虚拟机上安装了redis 3 ,启动后本机客户端可以连接访问,但是外部主机一直访问不了 到底怎么回事儿呢? 用telnet 测试下,结果如下 查看了虚拟机的端口等情况,一切正常,网上查了一下资料都没 ...