1. 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 编译器,才产生可使用的二进制代码

  1. 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一些必要的名词(二)的更多相关文章

  1. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

  2. MFC 构建、消亡 顺序 (二)--多文档 (MDI)

    MFC 构建.消亡 顺序 (二)--多文档 (MDI) by:http://www.cnblogs.com/vranger/ (一)MDI 生成顺序 (二)打开文档-“Open” (三)新建文档-“N ...

  3. 《MFC游戏开发》笔记二 建立工程、调整窗口

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...

  4. MFC的简单加法器(二)

    创建对话框主要分两大步,第一,创建对话框资源,主要包括创建新的对话框模板.设置对话框属性和为对话框添加各种控件:第二,生成对话框类,主要包括新建对话框类.添加控件变量和控件的消息处理函数等.鸡啄米在本 ...

  5. VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)

    上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Rib ...

  6. MFC编程入门之十二(对话框:非模态对话框的创建及显示)

    上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 非模态对话框显示后,程序其他窗口仍然能正常运行,可以响应用户输入,还可以相互切换.上一讲中创建的Tip模态对话框 ...

  7. MFC使用SQLite 学习系列 二:无法容忍的数据插入效率

    上一篇随笔中,介绍了,基本的使用没什么问题了,那么开始数据的插入. 一 问题--无法容忍的插入效率 代码写入基本完成,然后开始测试.起初,插入数据的时候基本上是插入每次插入9组数据,看不出来数据插入的 ...

  8. VS2010/MFC编程入门之四十二(MFC常用类:CString类)

    上一节鸡啄米讲了分割窗口的有关知识,本节开始讲解MFC的一些常用类,先来说说CString类. CString类简介 CString类作为MFC的常用类,当之无愧.可以这样说,只要是从事MFC开发,基 ...

  9. VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)

    上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...

  10. MFC/QT 学习笔记(二)——MFC入门

    MFC以C++形式封装了Windows API //实践 编写MFC需要的头文件#include <afxwin.h> 程序执行流程: 实例化应用程序对象(有且只有一个) 执行程序入口函数 ...

随机推荐

  1. SciTech-点焊机-微波炉变压器制作一台1000W电流500A的加强版点焊机;

    发挥主观能动性,有理论与科学,有思想有资源,实事求是,办法总比问题多. 用微波炉变压器制作一台加强版点焊机: 输出电流500A,功率1000瓦 微波炉有大功率全铜变压器. 初级或次级线圈由大功率可控硅 ...

  2. CentOS 7安装MariaDB 10详解以及相关配置-九五小庞

    第一步:添加 MariaDB yum 仓库 首先在CentOS操作系统中/etc/yum.repos.d/目录下添加 MariaDB 的YUM配置文件MariaDB.repo文件. vi /etc/y ...

  3. 控制一行显示多少个Item

    .project-list-ul { display: grid; margin-top: 5px; grid-template-columns: repeat(7, minmax(0,1fr)); ...

  4. 【攻防世界】a_good_idea

    1. 首先下载附件,解压出来之后得到的是一个jpg图片,还是先放到StegSolve看看吧. 2. 没有什么有用信息,于是继续放到010 Editor中查看,滑到代码最下面发现了两个文件to.png和 ...

  5. 高德地图 js sdk 出现 INVALID_USER_SCODE

    文档中给出的错误码对照表好像与 js sdk 无关. 添加密匙可以解决.注意绑定服务为 "Web 端",如果你现在的 key 没有密匙,也可以创建一个新的 key,你会得到一个配套 ...

  6. UTF-8编码的问题

    在工作中,经常需要用到Restful的接口调用,由于往往是推送给对方数据,对方返回状态,所以,只需要给对方推送正确的UTF-8编码即可.这个在我之前的例子里已经有了. 但是最近调用一个接口的时候,发现 ...

  7. 基于 Sync your cookie + Cloudflare KV + MCP + Claude 实现 B站视频信息自动获取

    前言 在现代 Web 开发中,我们经常需要从各种平台获取数据.本文将分享我如何构建一个 B站视频信息获取工具,这个项目不仅仅是一个简单的爬虫,而是一个集成了多项前沿技术的完整解决方案: Sync yo ...

  8. 关于超过js的number类型最大值(9007199254740992),的解决办法

    bug经过:点击修改无法展示信息(修改时调用queryOne,以id(long)为值,页面传过去的id=1480042498255640-00 ,在数据库中该id=148004249825564012 ...

  9. k8s安装步骤

    第一天:https://kubesphere.com.cn/docs/quick-start/all-in-one-on-linux/ 1.export KKZONE=cn2.curl -sfL ht ...

  10. redis外网访问和protected-mode配置

    在虚拟机上安装了redis 3 ,启动后本机客户端可以连接访问,但是外部主机一直访问不了 到底怎么回事儿呢? 用telnet 测试下,结果如下 查看了虚拟机的端口等情况,一切正常,网上查了一下资料都没 ...