已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/Programming/vc/201104/26439.htm第一章 不能免俗的“Hello, World!”在这一章里,就像所有的入门级教程一样,我也将不能免俗地以一个“Hello, World!”程序开始我的教程。然后,我将逐步深入,向你介绍这个ATL版本程序中所有必要的信息。此外,我还将介绍一些Win32中你可能不知道的东西,包括WinMain的_t兼容以及如何在MessageBox中加入自己的图标等等。接近,接近,再接近可以说,所有“Hello, World!”程序的内容不外乎都是以十分有限的几行代码向当前的目标屏幕环境上输出一个字符串“Hello, World!”。这个程序通常具有以下几个特点:排除印刷错误的可能性,几乎所有的初学者都可以照葫芦画瓢地独立书写、编译并运行这个程序。这个程序可以体现出当前语言环境的典型配置方式。这个程序中具有当前语言特定的程序入口点。这个程序中含有一条当前环境典型的输出语句(通常也是最简单、最常用的),由这条语句来输出“Hello, World!”字符串。从这个程序可以很清楚的了解当前语言环境下程序运行的典型流程。这个程序可能还会表现当前语言的一些其它特点。那么,首先让我以最简单的C语言版“Hello, World!”开始吧:#include int main()printf( Hello, World!n );return 0;虽然是不到10行的代码,但它仍然五脏俱全。现在,就由我将它和上述的特点对号入座吧。也就是说,这个程序能体现出C程序设计的以下特点:C语言的程序以main函数作为程序入口点。printf是C中用来输出字符串的代码。函数是C语言程序的基本单位,它通常由返回值、函数名、参数列表、函数体、return组成。调用函数的时候要include相应的头文件。n是C语言中的转义字符,代表换行符。接下来,我们来看一看Win32版的“Hello, World!”:#include int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )MessageBox( NULL, TEXT(Hello, World!), TEXT(Hello), 0 );return 0;这个程序告诉你了以下几件事:所有Win32下的C程序都需要包含windows.h头文件。Win32下的程序是以WinMain作为程序入口点的,而不是main。Win32下最常用输出信息的方法是MessageBox。WINAPI是Win32 API函数的调用约定,也就是_stdcall。HINSTANCE、LPSTR都是Win32自定义的数据类型,分别表示应用程序实例句柄和以空字符结尾的ANSI字符串指针。TEXT宏用于在源代码一级保证ANSI/Unicode字符串的兼容。如果你对以上的几个知识点仍然有些许迷茫,请参考Charles Petzold的Programming Windows(中译Windows程序设计)的第一章。这段代码就是几乎原封不动地搬过来的。不过,我在编写这段代码的时候,通常会这么写:#include #include int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )MessageBox( NULL, _T(Hello, World!), _T(Hello), 0 );return 0;是的,有几个地方有些不一样,我对它们的解释是:tchar.h中包含了对C runtime library中ANSI/Unicode字符串的源代码级兼容。_tWinMain提供了对命令行参数lpCmdLine的ANSI/Unicode源码级兼容。_T宏亦包含在tchar.h之中,它的作用和TEXT宏一样,但它比TEXT宏更加短小,因此可以节省编码的时间。现在我可以告诉你,随着我们的步步接近,接下来ATL版的“Hello, World!”程序就要出现在我们的眼前了。那么,就让我们来看看这个犹抱琵琶半遮面的家伙吧。(请注意,虽然这是一个ATL版本的程序,但是你仍然需要建立一个Win32 Application的工程,而不是用ATL/COM Wizard。)/ ATL的GUI程序设计配套源代码/ 第一章 不能免俗的“Hello, World!”/ 工程名称:HelloWorld/ 作者:李马/ /#include CComModule _Module;int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )_Module.Init( NULL, hInstance );MessageBox( NULL, _T(Hello, World!), _T(Hello), 0 );_Module.Term();return 0;也许有些陌生了,不过所幸它并无太多的变化毕竟整个代码段就没有多长。好了,这一节的内容就到这里,希望李马的这种渐近的方法没让大家觉得一切来得太突然。大家可以喝口水先,然后做个深呼吸再,因为接下来我们就要开始接触真正的ATL程序了。“不过如此”说句题外话先。许是我太狂妄,又许是我太幼稚,总之我在上大学以来,越来越喜欢说“不过如此”这句话。譬如上了大学以后,没过俩月我就觉得大学“不过如此”;学会喝酒之后,就又会觉得喝酒“不过如此”;到了北京以后,又觉得北京“不过如此”;参观了某著名软件公司之后,又觉得它“不过如此”书归正传话归正题,不知道你第一眼看过ATL版本的“Hello, World!”之后会不会同样有这样一种感觉?自然,我希望是这样的。那么,在了解ATL之前,就让我们先来目测一下这个“Hello, World!”吧。也许,你会从上面的代码猜到以下内容:atlbase.h大概其应该是ATL程序需要包含的头文件。CComModule,从类名称看应该是一个模块类。_Module是这个模块类的实例。WinMain没变。CComModule:Init应该是对模块进行初始化,这个方法应该是在程序初始化的时候调用。CComModule:Term应该是对模块进行结束处理,这个方法应该是在程序结束之前调用。WinMain的最后仍然是以return结尾。好,是不是“不过如此”呢?没错!大抵如此到此为止,希望你的猜想能够让你对ATL的恐惧感(如果有的话)一扫而光。那么,现在李马来为你补充上几点:atlbase.h在用ATL进行GUI程序设计的时候,就如同SDK中的windows.h一样重要。对于GUI程序设计的部分,这个文件中主要有这么几个值得关注的地方:Win32程序设计必备的头文件,诸如windows.h、tchar.h等。CComModule的定义。对于GUI程序设计,我们可以将它简单地看作对HINSTANCE的一个封装。一些简单的工具类。(请原谅我不能在这里提供给你它们具体的名字,因为ATL 3.0和ATL 7.0是不一样的。VC 6.0附带的是ATL 3.0,它的atlbase.h中主要提供了一些COM的智能指针和字符串,如CComPtr、CComBSTR等;而VS2003中的ATL 7.0中则附带了一些更有趣的类,比如CRegKey、CHandle等。)下面接着说CComModule。相信你可以从它的类名称中看出来,这个类主要用来管理COM的各种信息。如果你深入到ATL的源代码之中,你可能会为它的众多成员与方法感觉到迷惑。其实在进行GUI程序设计的时候,你只需要关心以下这些内容:HRESULT CComModule:Init( _ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = NULL );进行模块的初始化,第一个参数取NULL,第二个参数取应用程序的实例句柄,也就是WinMain中传入的hInstance。void CComModule:Term();进行模块的卸载,在程序结束时调用。HINSTANCE CComModule:GetModuleInstance();获取应用程序实例句柄CComModule:m_hInst。HINSTANCE CComModule:GetResourceInstance();获取资源模块句柄CComModule:m_hInstResource,这个值在默认情况下是和CComModule:m_hInst一致的。如果你程序的所有资源位于一个DLL之中,那么你可以在初始化应用程序中将CComModule:m_hInstResource成员赋值为这个DLL的模块句柄。接着说CComModule的实例_Module。可以说,这个全局变量贯穿于ATL整个框架的始终,无论你是使用它编写COM组件还是GUI程序。譬如,你可能不止一次地需要使用模块的实例句柄(LoadIcon、LoadCursor),那么你只需要这样调用:extern CComModule _Module;HICON hIcon = :LoadIcon( _Module.GetResourceInstance(), MAKEINTRESOURCE( IDI_YOURICON ) );好了,那么现在我们可以充分展示一下这个模块类的具体使用了。在此,我仅仅将我先前的“Hello, World!”作了一番扩展,如下:/ ATL的GUI程序设计配套源代码/ 第一章 不能免俗的“Hello, World!”/ 工程名称:HelloWorldEx/ 作者:李马/ /#include CComModule _Module;int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )_Module.Init( NULL, hInstance );_Module.m_hInstResource = LoadLibrary( _T(shell32.dll) );MSGBOXPARAMS mbp;ZeroMemory( &mbp, sizeof( mbp ) );mbp.cbSize = sizeof( mbp );mbp.dwLanguageId = GetSystemDefaultLangID();mbp.dwStyle= MB_USERICON;mbp.hInstance= _Module.GetResourceInstance();mbp.lpszCaption= _T(Hello);mbp.lpszIcon = MAKEINTRESOURCE( 44 );mbp.lpszText = _T(Hello, World!);MessageBoxIndirect( &mbp );FreeLibrary( _Module.m_hInstResource );_Module.m_hInstResource = NULL;_Module.Term();return 0;这个程序运行起来是这个样子:如你所见,在这里我使用了来自应用程序之外的资源,也就是对CComModule:GetModuleInstance进行了特殊处理。WTL就是对CComModule这个类进行了继承处理而派生出了CAppModule类,使之成为了更适合应用程序使用的模块类。有兴趣的朋友可以参看WTL附带的atlapp.h文件,我这里就不多说了。“貌合神离”字典上对这个词的解释是:“表面上很亲密而实际上怀有二心”。在此,我将它用在ATL 3.0与7.0上,用来表示它们俩“用法兼容而实现迥异”的既有事实。不过,对于GUI程序设计而言,你并不需要深入了解这方面的内容。因此我这里列举的,也只是与GUI有关的部分。ATL 3.0之中,CComM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育机构培训师培训技能与应聘策略详解
- 地质勘查高级工程师技能考核试题及答案
- 2025年住院医师规范化培训督导骨干专家模拟评估培训班测试题及答案
- 2025年期货从业资格考试题库及答案
- 高危孕产妇识别与救治试题附有答案
- 团的基础业务知识
- 2025乡村医生培训考试试题库(含答案)
- 2025年职业能力测试试卷及答案
- 消防员业务培训试题及答案
- 创业实训成功案例
- 二类精神病药品培训课件
- 创意摄影教学课件
- 2025-2030中国H发泡剂行业销售策略与需求规模预测报告
- 圆织机卫生管理制度
- 家具厂溯源管理制度
- 大模型备案-落实算法安全主体责任基本情况
- 2025年时事政治考试100题(含参考答案)
- 国家开放大学《管理英语4》期末机考题库
- 消防安全责任人的职责试题及答案
- 2025北京九年级(上)期末语文汇编:作文
- 签约中心管理制度
评论
0/150
提交评论