windows程序设计相关思想
2011年05月24日
就我个人观点,C++/MFC 程序设计必须跨越四大技术障碍:
1. 对象导向观念与C++ 语言。
2. Windows 程序基本观念(程序进入点、消息流动、窗口函数、callback...)。
3. Microsoft Foundation Classes(MFC)本身。
4. Visual C++ 整合环境与各种开发工具(难度不高,但需熟练)
SDK - Software Development Kit,原指软件开发工具。每一套环境都可能有自己的SDK。
凡以Windows raw API 撰写的程序我们通常也称为SDK 程序。
MFC - Microsoft Foundation Classes 的缩写,这是一个架构在Windows API 之上的C++ 类别库(C++ Class Library),意图使Windows 程序设计过程更有效率,更符合物件导向的精神。
Windows 程序分为「程序代码」和「UI(User Interface)资源」两大部份,两部份最后以RC编译器整合为一个完整的EXE 文件。
并不是延伸档名为.dll 者才是动态联结函数库(DLL,Dynamic Link Library),事实.exe、.dll、.fon、.mod、.drv、.ocx 都是所谓的动态联结函数库。
Windows 程序调用的函数可分为C Runtimes 以及Windows API 两大部份。
另一组函数,Windows API,由操作系统本身(主要是Windows 三大模块GDI32.DLL 和USER32.DLL 和KERNEL32.DLL)提供。
所有Windows 程序都必须包含WINDOWS.H。
噢,USER 模块掌管各个外围的驱动程序,它们各有侦测回路。
如果把应用程序获得的各种「输入」分类,可以分为由硬件装置所产生的消息(如鼠标移动或键盘被按下),放在系统队列(system queue)中,以及由Windows 系统或其它Windows 程序传送过来的消息,放在程序队列(application queue)中。
接受并处理消息的主角就是窗口。每一个窗口都应该有一个函数负责处理消息,程序员必须负责设计这个所谓的「窗口函数」(window procedure,或称为window function)。
如果窗口获得一个消息,这个窗口函数必须判断消息的类别,决定处理的方式。
所谓makefile,就是让你能够设定某个文件和某个文件相比-- 比较其产生日期。由其比
较结果来决定要不要做某些你所指定的动作。
makefile 必须以NMAKE.EXE(Microsoft 工具)处理。
WinMain 则是Windows 程序的进入点:
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
...
}
// 在Win32 中CALLBACK 被定义为__stdcall,是一种函数调用习惯,关系到
// 参数挤压到堆栈的次序,以及处理堆栈的责任归属。其它的函数调用习惯还有
// _pascal 和_cdecl
因为API 函数CreateWindow 完全包办了整个巨大的工程。但是窗口产生之前,其属性必须先设定好。所谓属性包括窗口的「外貌」和「行为」,一个窗口的边框、颜色、标题、位置等等就是其外貌,而窗口接收消息后的反应就是其行为(具体地说就是指窗口函数本身)。
初始化工作完成后,WinMain 进入所谓的消息循环:
while (GetMessage(&msg,...)) {
TranslateMessage(&msg); // 转换键盘消息
DispatchMessage(&msg); // 分派消息
}
其中的TranslateMessage 是为了将键盘消息转化,DispatchMessage 会将消息传给窗口函数去处理。
程序进行过程中,消息由输入装置,经由消息循环的抓取,源源传送给窗口并进而送到窗口函数去。窗口函数的体积可能很庞大,也可能很精简,依该窗口感兴趣的消息数量多寡而定。
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
注意,不论什么消息,都必须被处理,所以switch/case 指令中的default: 处必须调用defWindowProc,这是Windows 内部预设的消息处理函数。
Windows 的对话框依其与父窗口的关系,分为两类: 1. 「令其父窗口除能,直到对话框结束」,这种称为modal 对话框。
2. 「父窗口与对话框共同运行」,这种称为modeless 对话框。
为了做出一个对话框,程序员必须准备两样东西:
1. 对话框模板(dialog template)。这是在RC 文件中定义的一个对话框外貌,以各种方式决定对话框的大小、字形、内部有哪些控制组件、各在什么位置...等等。
2. 对话框函数(dialog procedure)。其类型非常类似窗口函数,但是它通常只处理WM_INITDIALOG 和WM_COMMAND 两个消息。
Modal 对话框的激活与结束,靠的是DialogBox 和EndDialog 两个API 函数。
对话框处理过消息之后,应该传回TRUE;如果未处理消息,则应该传回FALSE。这是因为你的对话框函数之上层还有一个系统提供的预设对话框函数。如果你传回FALSE,该预设对话框函数就会接手处理。
RC 文件是一个以文字描述资源的地方。
所谓空闲时间(idle time),是指「系统中没有任何消息等待处理」的时间。
Console 程序与DOS程序的差别:
都是所谓Win32 程序。如果程序是以main 为进入点,调用C runtime 函数和「不牵扯GUI」的Win32 API 函数,那么就是一个console 程序,console窗口将成为其标准输入和输出装置(cin 和cout)。
Win32 Console 程序设计、MFC Console 程序设计。
过去在DOS 环境下开发的程序,称为DOS 程序,它也是以main 为程序进入点,可以调用C runtime 函数。但,当然,不可能调用Win32 API 函数。
这么简单的例子中,我们看到MFC Console 程序的几个重点:
1. 程序进入点仍为main
2. 需包含所使用之类别的头文件(本例为AFX.H)
3. 可直接使用与GUI 无关的MFC 类别(本例为CStdioFile 和CString)
4. 编辑时需指定/MT,表示使用多执行线程版本的C runtime 函数库。
指定/MT的编译选项的方法:project->project settings->C/C++->code generation 运行库选项。
MFC console程序中不需要指定头文件windows.h,用_T()宏转化字符串为宽字符串。
什么是C Runtime 函数库的多线程版本?、
当C runtime 函数库于1970s 年代产生出来时,PC 的内存容量还很小,多任务是个新奇观念,更别提什么多执行线程了。因此以当时产品为基础所演化的C runtime 函数库在多线程(multithreaded)的表现上有严重问题,无法被多线程程序使用。利用各种同步机制(synchronous mechanism)如critical section、mutex、semaphore、event,可以重新开发一套支持多执行线程的runtime 函数库。问题是,加上这样的能力,可能导至程序代码大小和执行效率都遭受不良波及-- 即使你只激活了一个执行线程。
我们习惯以进程(process)表示一个执行中的程序,并且以为它是CPU 排程单位。事实上执行线程才是排程单位。
你可以说核心对象是系统的一种资源(噢,这说法对GDI 对象也适用),系统对象一旦产生,任何应用程序都可以开启并使用该对象。系统给予核心对象一个计数值(usage count)做为管理之用。
核心对象包括下列数种:
核心对象 产生方法
event CreateEvent
mutex CreateMutex
semaphore CreateSemaphore
file CreateFile
file-mapping CreateFileMapping
process CreateProcess
thread CreateThread
前三者用于执行线程的同步化:file-mapping 对象用于内存映射文件(memory mappingfile)。
CreateThread(),第五个参数如果是0,表示让执行线程立刻开始执行,如果是CREATE_SUSPENDED , 则是要求执行线程暂停执行( 那么我们必须调用ResumeThread 才能令其重新开始).
发表评论
-
Programming Applications for Microsoft Windows - 第七部分 附录
2012-01-20 10:14 605Programming Applications for Mi ... -
多线程编程(一)――CreateThread
2012-01-20 10:14 779多线程编程(一)――Creat ... -
Windows系统程序员的“内功”修炼
2012-01-20 10:14 587Windows系统程序员的“内 ... -
多线程加速图像模板匹配
2012-01-20 10:14 608多线程加速图像模板匹 ... -
Grub4dos命令索引
2012-01-19 15:15 657Grub4dos命令索引 2010年07月22日 Gru ... -
TOAD快速入门(中文经典)
2012-01-19 15:15 1079TOAD快速入门(中文经典) ... -
linux笔记3
2012-01-19 15:15 523linux笔记3 2011年06月13日 ... -
电脑高手应用技巧荟萃(电脑知识二十六)
2012-01-19 15:15 393电脑高手应用技巧荟萃(电脑知识二十六) 2010年12月07 ... -
vc6.0遇见的几个问题以及解决办法
2012-01-17 05:02 832vc6.0遇见的几个问题以及解决办法 2011年03月17日 ... -
C++/CLI
2012-01-17 05:02 590C++/CLI 2010年08月12日 从2001年.n ... -
VC add files to folder失效问题
2012-01-17 05:02 847VC add files to folder失效问 ... -
VC中的0XCCCCCCCC
2012-01-17 05:02 608VC中的0XCCCCCCCC 2011年10月23日 在 ... -
C/C++ > UNIX系统程序设计
2012-01-17 05:02 588C/C++ > UNIX系统程序设 ... -
用MyEclipse建立Web Service工程(下)
2012-01-16 03:53 785用MyEclipse建立Web Service工程(下) 2 ... -
如何向MyEclipse导入已有项目
2012-01-16 03:53 822如何向MyEclipse导入已有项目 2011年06月18日 ... -
Balsamiq Mockups 使用
2012-01-16 03:52 852Balsamiq Mockups 使用 2010 ... -
《程序天下事》6月要闻回顾
2012-01-16 03:52 359《程序天下事》6月要闻回顾 2009年07月05日 Or ... -
什么是WAP?
2012-01-16 03:52 444什么是WAP? 2009年08月30 ...
相关推荐
学习C++必备资料续。。。C++编程思想 WINDOWS 核心编程 WINDOWS程序设计第5版 深入浅出MFC简体中文版 C++ Primer 3rd Edition 中文完美版,陆续奉上
该课 程的主要任务是讲授利用MFC进行Windows应用程序设计的基本原理和方法,并向学生灌 输框架编程的核心思想,从而为今后开发实用性较强的软件系统打下坚实基础。 二、教学目的与基本要求 本课程的目的是使学生深刻...
课件和学习笔记。课件非常的仔细。还有在学习过程遇到的问题与解决!
本课程介绍使用VB.NET开发Windows应用程序所需的知识和技能 预备知识 掌握基本的VB.NET语法 掌握数据库的基本知识 掌握面向对象的编程思想 能够使用Visual Studio.NET图形化界面开发环境 课时:108 课时 分为两部分 ...
windows程序设计英文版,STL源码剖析,设计模式,c++primer 习题答案, java编程思想
详细介绍了windows程序设计的基本方法和思想,以及在设计中应注意的问题和重点,注重讲授控件操作(经典)
本书以Delphi语言为载体,通过讨论程序设计的一般过程和方法,重点讲述程序设计基础、算法与结构化程序设计、面向对象程序设计、Windows程序设计和数据库程序设计的知识,并涉及计算机科学基础、数据和控制、程序...
了解windows的基本编程思想,是你做windows编程必不可少的开发工具
本书共分为12章,在讲解Visual C# .NET语法的基础上,以面向对象的程序设计方法和基于事件的程序设计方法为核心,重点阐述Windows程序设计、Web应用程序设计、数据库编程、文件操作与编程等实用技术。本书内容丰富,...
windows程序设计 课程设计----用JSP+Servlet实现多人网络聊天室 内含: 1.源文件 2.软件工程企业项目文档 3.部署说明 文档目录: 目 录 § 1 引言 3 §1.1 编写目的 3 §1.2 术语定义 4 §1.3 参考资料 4 § 2 ...
本书以面向对象的软件工程思想为主线,细致深入地讲解了C#语言面向对象程序设计的方法和技巧,内容涵盖面向对象的基本概念、基于接口的设计、泛型程序设计方法、Windows和Web应用开发,以及数据库访问技术。...
随着国家大数据战略的深入实施,各行业智慧化建设急需数据分析人才和智能应用人才。智慧化简单来说是一个以机器替换人力的过程,而机器的“灵魂”是程序。...学习本章,重在理解面向对象程序设计思想、类和对象的概念
理解Windows程序设计的基本思想,理解基于消息的程序设计方法,设计出简单的基于事件的windows程序,完成基本控件的使用 结合操作系统中信号量与互斥体的概念,在MFC中找到对应的相关类 设计一个多线程同步的程序,
随着国家大数据战略的深入实施,各行业智慧化建设急需数据分析人才和智能应用人才。智慧化简单来说是一个以机器替换人力的过程,而机器的“灵魂”是程序。...学习本章,重在理解面向对象程序设计思想、类和对象的概念
对于计算机相关专业而言,程序设计是专业基础知识,是进一步学习其他专业知识的第一步阶梯;对于非计算机专业而言,程序设计的学习有助于理解计算机的能力所在,理解哪些是计算机擅长解决的问题,怎样的方式方法是...
掌握结构化程序设计和面向对象程序设计基本思想,掌握类概念,以及对象的建立与编辑、对象的属性、事件和方法;掌握建立简单应用的方法,掌握窗口和基本控件的基本属性和用法,以及VB的管理和环境的设置。 (二) 重点...
并通过大量的程序实例和相关练习逐步掌握高级程序设计语言的基本知识和基本技术,在理论和实践上使学生掌握面向对象的思想方法并初步具备软件开发的能力。全书共17章,内容包括流程控制语句、类与对象 、继承与多态...
这是CHM格式的文档,对于想要了解明白windows系统的设计思想与原理是一本不错的书。
《中国高等院校计算机基础教育课程体系规划教材:C++程序设计题解与上机指导(第2版)》是和作者编著的《C++程序设计(第2版》(清华大学出版社出版)一书配套使用的参考用书。《中国高等院校计算机基础教育课程体系...
本书以Visual C# 2012语言为工具,介绍面向对象程序设计中的基本概念和方法,并通过大量的程序实例和相关练习逐步掌握高级程序设计语言的基本知识和基本技术,在理论和实践上使学生掌握面向对象的思想方法并初步具备...