MFC基本知识点

  1. 2个类
  • 新建的MFC项目有两个类,一个APP类,一个对话框类
  • main函数通过getapp得到app类的全局对象地址,调用app类的虚函数Initinstance
  • InitInstance里create/Domodal通过对话框类创建对话框
  1. 消息响应
  • 控件添加消息的时候,对应的对话框类添加了3个成员:
  • 该消息的处理函数声明
  • 该消息的处理函数实现
  • 把消息和函数建立联系:消息映射表添加成员
  • 什么消息 什么控件触发的响应消息 触发了该消息怎么办,把消息和函数关联起来
    2.1 怎么自己添加一个消息响应
  • 添加消息处理的函数声明和实现
  • 在消息映射表里添加对应项
  1. 添加变量
    3.1 值类型变量
  • 更新控件内容/变量内容:
  • UpdateData(TRUE):->GetXXX->从控件获取内容更新到变量
  • UpdateData(FALSE):->SetXXX->把变量内容显示到控件上
    3.2 控件类型的变量
  • 直接操作该控件对应的类的成员函数来控制控件
    3.3 变量怎么和控件建立联系
  • 对于对话框资源,自定义对话框类的时候,就会指定ID
  • 对于子控件,通过DDX_XXX,把变量和资源绑定,建立联系
  • 没经过DDX_XXX的,变量只是变量,和资源没关系,没绑定,调用类的成员函数就会失败,程序崩溃

1、MFC 编程中已经看不到WinMain函数,那么我们编程的起始位置在哪里?
答:CWinApp的派生类对象。

2、对于消息映射来说有几个宏特别重要,分别是哪些,应该写在何处?
答:在类的定义头文件中,声明消息映射的宏DECLARE_MESSAGE_MAP(),在类的实现源文件里,通过BEGIN_MESSAGE_MAP和END_MESSAGE_MAP实现消息映射。

3、假如我们在对话框类中调用SendMessase函数,请观察它与学SDK时的不同,请问这是为什么?
答:系统消息:::SendMessage(this->m_hWnd,WM_CLOSE,0,0);
控件通告消息:::SendMessage(AfxGetMainWnd()->m_hWnd,WM_COMMAND,ID_GET,NULL);
自定义消息:::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0);
给应用程序发送:如:CWnd pWnd=CWnd::FindWindow(NULL,str);//获取目的窗口对象句柄 str为窗口名称 ::SendMessage(pWnd,WM_CLOSE,0,0);

在MFC中封装类使用全局作用符::函数SendMessge,而在sdk中不用。

4、如何给将对话框与一个类绑定? 请写出步骤
答:一、先写一个对话框类;二、对应的对话框类添加了3个成员:该消息的处理函数声明,该消息的处理函数实现,把消息和函数建立联系:消息映射表添加成员。

5、如何给对话框上的控件绑定一个变量? 请写出步骤
答:一、添加控件类型变量或者值变量;二、值变量使用UpdateData(TRUE):->GetXXX->从控件获取内容更新到变量,UpdateData(FALSE):->SetXXX->把变量内容显示到控件上。
直接操作该控件对应的类的成员函数来控制控件。三、对于对话框资源,自定义对话框类的时候,就会指定ID,对于子控件,通过DDX_XXX,把变量和资源绑定,建立联系。

6、类向导可以做什么?
答:类向导可以帮助我们开发对话框或控件更快地实现类,变量,消息,函数的声明实现和绑定。

7、模态对话框与非模态对话框有什么区别? 在MFC 中分别如何创建?
答:模态对话框有自带的消息循环,而非模态对话框则需要自己实现自己的消息循环。在MFC中创建模态对话框的父窗口产生子窗口后,不能操作父窗口,而非模态的可以。
创建模态对话框使用对应的对话框类对象调用DoModal函数后直接调用ShowWindow显示,非模态的对话框则使用对话框类指针指向该类对象,然后用指针调用Create函数。最后指针调用ShowWindow函数。

=================
1、Button有几种?
答:Button控件有按钮PushButton,单选框RadioBox,复选框CheckBox。

2、Radio 怎么绑定,怎么分组?
答:先分组后绑定,分组时需将第一个radio控件的属性group设置为true,其后所有group属性为false的均与其为一组,然后可以在radio上绑定变量,推荐绑定int型变量配合updatedata使用。

3、在MFC 中贴图方式有几种?都是怎么操作的。
答:一、静态方式,在图片控件的Image属性中,添加图片资源ID;二、动态方式,建立一个Cbitmap的图像,加载图片资源,绑定Cstatic类型的变量,调用SetBitMap函数。

4、资源脚本的定义格式是什么?
答:[资源ID] [资源类型] [资源说明]

5、我们制作一个选项卡,仅需要一个TabCtrl 的控件就可以了吗? 还需要什么资源?
答:选项卡的制作,除了需要TabCtrl 的控件,还要TabCtrl 的控件变量,子窗口控件资源等。

6、制作选项卡时,子窗口的属性分别要设置哪两个内容?
答:子窗口的属性Style设置为child,Border属性设为None。

================
1.内核对象可以理解为一一个由操作系统内核管理的与Windows 系统相关的对象,有内核空间中以结构体的方式存在,存储着此对象的相关属性。请何内核对象都有哪些? 写
出你所知道的全部。
答:内核对象有:进程,线程,访问令牌,文件,文件映射,I/O完成端口,邮槽,管道,互斥体,信号量,事件,计时器,线程池。

2.创建一个内核对象一般都使用CreatexXX 函数,返回值一般是一个内核对象句柄。请回答以下三个问题:
a) 这些函数都有一个参数可以作为区分创建内核对象与其他对象的标志,这参数是什么?有什么含义?
答:
In DWORD dwCreationFlags ,创建标志;指定了内核对象创建的方式。

进程的安全属性

b)什么是句柄? 谈谈你的理解。
答:对象的索引。

c) 句柄都有哪些种类?
答:句柄的种类有

HBRUSH:标示画刷句柄
HCOURSOR:标示鼠标光标句柄
HDC:标示设备环境句柄
HFONT:标示字体句柄
HICON:标示图标句柄
HINSTANCE:标示当前实例句柄
HMENU:标示菜单句柄
HPALETTE:颜色调色板句柄
HPEN:标示画笔句柄
HWND:标示窗口句柄
HBITMP:标示位图句柄
HFILE:标示文件句柄
HKEY:注册表项句柄
HANDLE

3.对于内核对象句柄来说,进程中有一个句柄表。不同进程中的句柄表存储的相同的柄值代表的是同一个内核对象吗?
答:句柄表用于记录本进程所打开的所有的内核对象,当中的每一项,描述了使用此句柄访问内核对象的权限,以及此句柄是否可以被子进程继承。每个进程中的句柄表的柄值仅仅对于本进程有效,所以相同的柄值可能代表的是同一个内核对象,也可能不是。

4.内核对象由windows 操作系统管理,故而内核对象对于整个操作系统来说是全局的,请回答以下两个问题:
a)如何在不同的进程中访问同一个内核对象,请说出至少三种方法。
答:
① 使用对象句柄继承;
② 为对象命名;
③ 复制对象句柄。

b)当一个进程销毁时,内核对象句柄表中的句柄全部都会销毁吗? 结合引用计数,谈谈你对这个问题的理解。
答:
每一个内核对象都有一个引用计数,存在使用到的该内核对象的进程,则引用计数加一,进程终止或者关闭了句柄,引用计数自减一,当引用计数为零的时候,那么内核对象就会销毁。所以当一个进程销毁的时候,内核对象句柄表中的句柄不一定会都会销毁,因为可能别的进程还在使用某内核对象。

5.什么是进程,什么是线程,谈谈你对这个问题的理解。
答:进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元,同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。

6.什么是模块? 模块句柄的本质是什么?
答:一个模块代表的是一个运行中的exe文件或dll文件,用来代表这个文件中所有的代码和资源, 磁盘上的文件不是模块,装入内存后运行时就叫做模块。一个应用程序调用其他DLL中的API时,这些DLL文件被装入内存,就产生了不同的模块,为了区分 地址空间中的不同模块,每个模块都有一个惟一的模块句柄来标识。在WINDOWS下,模块指的是EXE和DLL等数据加载到内存中的影像,模块句柄又是比较特殊的,它跟一般的句柄不一样,模块句柄指向的就是EXE和DLL等的在内存的位置(就是指向它们的数据起始位置)。

7.请写出你知道的进程间通讯的方式,越详细越好。
答:
文件映射
  文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。
共享内存
  Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
匿名管道
  管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。
  匿名管道(Anonymous Pipe)是 在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写 端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。
命名管道
  命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
邮件槽
  邮件槽(Mailslots)提供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消 息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信。
剪贴板
  剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
动态数据交换
  动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。
对象连接与嵌入
  应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。
动态连接库
  Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。
NetBios函数
  Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios函数来进行进程间通信。
Sockets
  Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机制进行编程。
WM_COPYDATA消息
  WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 一、C语言基础 1、struct 的内存对齐和填充问题其实只要记住一个概念和三个原则就可以了: 一个概念:自然对齐...
    XDgbh阅读 2,163评论 1 38
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,472评论 2 59
  • 十年相约未曾牵,瘦朱颜,念成山。几度花开,时已不回还。曾是呢喃同一赋,心渐远,夜风寒。句中词梦意阑珊,百年间,独千...
    曲星梦阅读 422评论 3 14
  • public static void main(String[]args){ Mapmap=newHashMap(...
    欣子沫沫阅读 304评论 0 0