深入浅出MFC 2nd-WIN32程序设计的基本知识

 From now on ,I will start posting the daily blog for my understanding and practicing about the book named as "MFC with easy to understand" .I will take this thing as a habit whenever is allowed。    

从现在开始,我会开始我的每天对于深入浅出MFC 2nd的理解和实践的博客编写。无论时间是否允许我会把这件事作为一种习

   Just like each day you get up with your tired body early but do something with strong will .The habit 

惯。就像每天能用强大的意志控制困乏的身体早早地起来做事情,习惯的力量是十分强大的,不论你是否无意或有意地重复地做

is extraordinary power when it made once.It will be a habit no matter whether you persist doing one thing for 

着这件事,那么就会形成一种习惯。但是习惯也能因为你的懒惰而消失,就像你每天不管什么情况都能在凌晨5点在球场上训练

intentionally or accidentally or not .but a habit will also go because of your lazy.For instance,you practice shooting in the court at 5 o'clock on time no matter what situation you meet ,that's what a habit is .

投篮,但是如果你因为懒惰或者其他的因素而放弃所形成的这个习惯,那么以后的某一天你都会找借口不去做这件事情,当找借


口的次数越来越多,那么就没有了这种习惯了。所以在这里我必须重申一下我应形成这种习惯,不以自身状况或外部环境所做成的借口作为无法形成习惯的绊脚石,每天都在时间轴上面行走,无法走回,但能前进,


Windows程序分为程序代码和UI资源,最终两大部分以RC编译器整合为一个完整的EXE文件。UI指的是功能菜单,对话框,外貌,程序图标,光标形状等。RC编译器读取RC档的描述后将所有UI资源档集中制作出一个.RES档,再与程序代码结合在一起,从而形成一个完整的window可执行文件,Windows支持动态联结,就是说应用程序所调用的API是在执行时才联结上的。除了dll的动态链接库外还有.exe ,.dll,.fon,.mod,.drv,.ocx都是所谓的动态联结函数库,Windows程序调用的函数可分为C Runtimes以及WindowsAPI两大部分,

LIBC.LIB 是C Runtime函数库的静态联结版本
MSVCRT.LIB 是CRuntime函数库动态联结版本(必须联结MSVCRT40.DLL)的import函数库,关于Windows API,有操作系统本身(主要是Windows三大模块GDI32.DLL USER32.DLL和KERNEL32.DLL)提供,但是在动态联结的时候需要为函数提供什么函数库才能进行,这些信息主要放在import函数库中
window程序的处理是消息为基础,事件驱动的

程序不断等待(利用一个死循环),等待任何可能的输入,然后做判断,再做适当的处理,操作系统经过USER模块掌握的各个外围的驱动程序进而取得用户输入再以消息形式(一种数据结构)进入程序之中。消息放在系统队列中,有系统或者其他Windows程序传送过来的消息,放在程序队列中。

    MSG msg;

    while(GetMessage(&msg,NULL,NULL,NULL))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

消息的数据结构

typedef struct tagMSG

{

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

}MSG;

接受并处理消息的主角就是窗口,每个窗口都应该有一个函数负责处理消息Window procedure或者window function 

如果窗口获得一个消息,这个窗口函数必须判断消息的类别,决定处理的方式。以上就是windows程序设计最重要的概念


程序的编译联结和生成都可以用makefile文件进行生成windows平台下的可执行文件。关于makefile的语法作者就在说明了,而且比较易懂 

generic.res:generic.rc generic.h

rc generic.rc

用冒号左边的generic .res和冒号右边的generic.rc和generic.h的文件日期相比,只要右边任何文件比左边的文件更新了,就回执行下一行所正定的动作,在这里作者说明了要使用makefile文件进行多文件编译联结动作就必须以NMAKE.EXE(Microsoft工具)或者MAKE.EXE处理。

程序进入点WinMain 在C程序中的进入点是main 而windows程序设计中的进入点就是WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

当windows的外壳(shell)侦测到使用者想执行一个windows程序,就会调用加载器把该程序加载,然后调用c startup code 后者再调用winmain,开始执行程序

窗口类别的注册和窗口的诞生

为了显示Windows程序必须调用CreateWindow它完全包办的整个巨大的工程,但是窗口产生之前,其属性必须先设定好,包括窗口的外貌和行为,一个窗口的边框 颜色 标题 位置等就是外貌,而窗口接受消息后的反应就是其行为,程序必须使用RegisterClass设定属性,我们常说的注册窗口类),以大型的数据结构WNDCLASS做为参数,而CreateWindow则另外需要11个参数


CreateWindow函数知识创建出窗口,但是显示窗口需要后续用到ShowWindow和UpdateWindow函数

在消息处理方面,DispatchMessage是要经过USER32模块才能分发消息的

窗口的生命中枢:窗口函数

窗口函数的wParam和lParam的意义,因消息的不同而不同在16坏境下是16位,在32位环境下是32位

消息映射Message map 的原型,作者提示我们能在接受消息处理之前建立一个消息映射表

但是在这个并没有深入,只是一个简单的但是能让初学者明白的数据结构,作者在里声明了他所用的数据结构和MFC中的是一样那么在深入学习MFC所呈现的技术的时候这些都不会是初学者的绊脚石了。

struct MSGMAP_ENTRY

{

UINT nMessage;

LONG (*pfn)(HWND,UINT,WPARAM,LPARAM);

};

#define dim(x) sizeof(x)/sizeof(x[0]);

MSGMAP_ENTRY 的第二元素是一个函数指针可以传递一个处理对于特定消息类型的函数的地址

消息和处理函数的对照表格

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

}

Comman-ID 于处理程序的对照表格

struct MSGMAP_ENTRY _commandEntries=

{

IDM_ABOUT,OnAbout,

IDM_FILEOPEN,OnFileOpen,

IDM_SAVES,OnSaveAs,

};

那么窗口函数可以这样设置:

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,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));

这样一来,WndProc和OnCommand函数永远不需要改变,当有要处理的消息,只要在消息映射表中加上新的元素,并针对新消息编写新的处理函数即可,这种观念和手法就是MFC的message Map 的原型

对话框的运作与父窗口的关系

模式对话框和非模式对话框,模式对话框是直到对话框接受到关闭的消息才能在父窗口中进行消息处理,而非模式对话框就是一个窗口,他们可以相互并存,但是显示中我们较为常用的是模式对话框,为了做出对话框必须准备对话框模板就是外貌和对话框函数(类似于窗口函数,但是它通常只处理WM_INITDIALOG和WM_COMMAND两个消息)对话框中的各个控制组件也是小小的窗口,各个控件都有自己的窗口函数,它们以消息与其管理者就是对话框进行沟通,但是所有控件传来的消息都是WM_COMMAND,再由参数分辨哪一种控件以及哪一种通知

Modal对话框的激活与结束靠的是DialogBox和EndDialog两个API函数,当对话框函数处理过消息,那么应该回传TRUE,否则就回传FALSE,这是因为在对话框函数之上层还有一个系统提供的预设对话框函数,FALSE,系统就会调用预设对话框函数


模块定义文件(.DEF)

Windows程序需要一个模板定义文件,将模板名称,程序节区和资料节区的内存特性,模块堆积(heap)大小,堆栈(stack)大小,所有callback函数名称等记录下载,而在VS2017整合环境中,已经不再需要准备.DEF文件,因为模块定义文件中的设定都有默认值。

资源描述档(.RC)

RC文件是一个以文字描述资源的地方,常用的资源有九项之多,分别是ICON,CURSOR,BITMAP,FONT,DIALOG,MENU,ACCELERATOR,STRING,VERSIONINFO.TOOLBAR,这些文字描述需要经过RC编译器,才产生可使用的二进制代码。

最后就是程序的生与死


从图中可以看出窗口的出生是在CrearteWindow函数内部的,这个操作系统调度的,我们无法干预,然后在循环的回路中通过GetMessage取的放在系统消息队列的消息,然后消息经过从翻译,然后分发进入到窗口函数中。当消息队列中有WM_DESTROY的消息的时候应用程序此时就会自动把消息排队进入消息队列中,当循环回路分发了这个消息,那么就可以告诉程序生命周期已经终止了,那么此时GetMessage函数就回返回0,结束循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入浅出MFC是一本介绍 MFC(Microsoft Foundation Classes)程式设计技术的书籍。对於 Windows 应用软体的开发感到兴趣,并欲使用 Visual C++ 整合环境的视觉开发工具,以 MFC 为程式基础的人,都可以从此书获得最根本最重要的知识与实例。 如果你是一位对 Application Framework 和物件导向(Object Oriented)观念感兴趣的技术狂热份子,想知道神秘的 Runtime Type Information、Dynamic Creation、Persistence、Message Mapping 以及 Command Routing 如何实作,本书能够充分满足你。事实上,依我之见,这些核心技术与彻底学会操控 MFC 乃同一件事情。 全书分为四篇: 第一篇【勿在浮砂筑高台】提供进入MFC核心技术以及应用技术之前的所有技术基础,包括: Win32程式观念:message based, event driven, multitasking, multithreading, console programming。 C++ 重要技术:类别与物件、this 指标与继承、静态成员、虚拟函式与多型、模板(template)类别、异常处理(exception handling)。 MFC 六大技术之简化模拟(Console 程式) 第二篇【欲善工事先利其器】提供给对 Visual C++ 整合环境全然陌生的朋友一个导引。这一篇当然不能取代 Visual C++ User's Guide 的地位,但对整个软体开发环境有全盘以及概观性的介绍,可以让初学者迅速了解手上掌握的工具,以及它们的主要功能。 第三篇【浅出 MFC 程式设计】介绍一个 MFC 程式的生死因果。已经有 MFC 程式经验的朋友,不见得不会对本篇感到惊艳。根据我的了解,太多人使用 MFC 是「只知道这麽做,不知道为什麽」;本篇详细解释 MFC 程式之来龙去脉,为初入 MFC 领域的读者奠定扎实的基础。说不定本篇会让你有醍醐灌顶之感。 第四篇【深入 MFC 程式设计】介绍各式各样 MFC 技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值