科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道ATL的GUI程序设计(一)

ATL的GUI程序设计(一)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在这一章里,就像所有的入门级教程一样,我也将不能免俗地以一个“Hello, World!”程序开始我的教程。

作者:李马 来源:CSDN 2007年9月24日

关键字: ghost ATL GUI 程序设计

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

第一章 不能免俗的“Hello, World!”

在这一章里,就像所有的入门级教程一样,我也将不能免俗地以一个“Hello, World!”程序开始我的教程。然后,我将逐步深入,向你介绍这个ATL版本程序中所有必要的信息。此外,我还将介绍一些Win32中你可能不知道的东西,包括WinMain的_t兼容以及如何在MessageBox中加入自己的图标等等。

接近,接近,再接近……

可以说,所有“Hello, World!”程序的内容不外乎都是以十分有限的几行代码向当前的目标屏幕环境上输出一个字符串“Hello, World!”。这个程序通常具有以下几个特点:

  1. 排除印刷错误的可能性,几乎所有的初学者都可以照葫芦画瓢地独立书写、编译并运行这个程序。
  2. 这个程序可以体现出当前语言环境的典型配置方式。
  3. 这个程序中具有当前语言特定的程序入口点。
  4. 这个程序中含有一条当前环境典型的输出语句(通常也是最简单、最常用的),由这条语句来输出“Hello, World!”字符串。
  5. 从这个程序可以很清楚的了解当前语言环境下程序运行的典型流程。
  6. 这个程序可能还会表现当前语言的一些其它特点。

那么,首先让我以最简单的C语言版“Hello, World!”开始吧:

#include <stdio.h>

int main()
{
    printf( "Hello, World!\n" );
    return 0;
}

虽然是不到10行的代码,但它仍然五脏俱全。现在,就由我将它和上述的特点对号入座吧。也就是说,这个程序能体现出C程序设计的以下特点:

  1. C语言的程序以main函数作为程序入口点。
  2. printf是C中用来输出字符串的代码。
  3. 函数是C语言程序的基本单位,它通常由返回值、函数名、参数列表、函数体、return组成。
  4. 调用函数的时候要include相应的头文件。
  5. \n是C语言中的转义字符,代表换行符。

接下来,我们来看一看Win32版的“Hello, World!”:

#include <windows.h>

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
    MessageBox( NULL, TEXT("Hello, World!"), TEXT("Hello"), 0 );
    return 0;
}

这个程序告诉你了以下几件事:

  1. 所有Win32下的C程序都需要包含windows.h头文件。
  2. Win32下的程序是以WinMain作为程序入口点的,而不是main。
  3. Win32下最常用输出信息的方法是MessageBox。
  4. WINAPI是Win32 API函数的调用约定,也就是__stdcall。
  5. HINSTANCE、LPSTR都是Win32自定义的数据类型,分别表示应用程序实例句柄和以空字符结尾的ANSI字符串指针。
  6. TEXT宏用于在源代码一级保证ANSI/Unicode字符串的兼容。

如果你对以上的几个知识点仍然有些许迷茫,请参考Charles Petzold的《Programming Windows》(中译《Windows程序设计》)的第一章。这段代码就是几乎原封不动地搬过来的。不过,我在编写这段代码的时候,通常会这么写:

#include <windows.h>
#include <tchar.h>

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
    MessageBox( NULL, _T("Hello, World!"), _T("Hello"), 0 );
    return 0;
}

是的,有几个地方有些不一样,我对它们的解释是:

  1. tchar.h中包含了对C runtime library中ANSI/Unicode字符串的源代码级兼容。
  2. _tWinMain提供了对命令行参数lpCmdLine的ANSI/Unicode源码级兼容。
  3. _T宏亦包含在tchar.h之中,它的作用和TEXT宏一样,但它比TEXT宏更加短小,因此可以节省编码的时间。

现在我可以告诉你,随着我们的步步接近,接下来ATL版的“Hello, World!”程序就要出现在我们的眼前了。那么,就让我们来看看这个犹抱琵琶半遮面的家伙吧。(请注意,虽然这是一个ATL版本的程序,但是你仍然需要建立一个Win32 Application的工程,而不是用ATL/COM Wizard。)

//////////////////////////////////////////////////////////////////////////
// ATL的GUI程序设计配套源代码
// 第一章 不能免俗的“Hello, World!”
// 工程名称:HelloWorld
// 作者:李马
// http://www.titilima.cn
//////////////////////////////////////////////////////////////////////////

#include <atlbase.h>
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程序了。

    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊搁崐椋庢閿熺姴鐭楅幖娣妼缁愭鏌¢崶鈺佷汗闁哄閰i弻鏇$疀鐎n亞浠炬繝娈垮灠閵堟悂寮婚弴锛勭杸閻庯綆浜栭崑鎾诲冀椤撱劎绋忛梺璺ㄥ櫐閹凤拷

    濠电姷鏁告慨鐑姐€傛禒瀣劦妞ゆ巻鍋撻柛鐔锋健閸┾偓妞ゆ巻鍋撶紓宥咃躬楠炲啫螣鐠囪尙绐為梺褰掑亰閸撴盯鎮惧ú顏呪拺闂傚牊鍗曢崼銉ョ柧婵犲﹤瀚崣蹇旂節婵犲倻澧涢柛瀣ㄥ妽閵囧嫰寮介妸褋鈧帡鏌熼挊澶婃殻闁哄瞼鍠栭幃婊堝煛閸屾稓褰嬮柣搴ゎ潐濞叉ê鐣濈粙璺ㄦ殾闁割偅娲栭悡娑㈡煕鐏炲墽鐭嬫繛鍫熸倐濮婄粯鎷呯粵瀣異闂佹悶鍔嬮崡鍐茬暦閵忋倕鍐€妞ゆ劑鍎卞皬闂備焦瀵х粙鎴犫偓姘煎弮瀹曚即宕卞Ο闀愮盎闂侀潧鐗嗛幊搴㈡叏椤掆偓閳规垿鍩ラ崱妞剧凹濠电姰鍨洪敋閾荤偞淇婇妶鍛櫤闁稿鍊圭换娑㈠幢濡纰嶉柣搴㈣壘椤︾敻寮诲鍫闂佸憡鎸鹃崰搴敋閿濆鏁嗗〒姘功閻绻涢幘鏉戠劰闁稿鎹囬弻锝呪槈濞嗘劕纾抽梺鍝勬湰缁嬫垿鍩為幋锕€宸濇い鏇炴噺閳诲﹦绱撻崒娆戝妽妞ゃ劌鎳橀幆宀勫磼閻愰潧绁﹂柟鍏肩暘閸斿矂鎮為崹顐犱簻闁圭儤鍨甸鈺呮倵濮橆剦妲归柕鍥у瀵粙濡歌閸c儳绱撴担绛嬪殭婵☆偅绻堝濠氭偄绾拌鲸鏅i悷婊冪Ч閹﹢鎳犻鍌滐紲闁哄鐗勯崝搴g不閻愮儤鐓涢悘鐐跺Г閸犳﹢鏌℃担鐟板鐎规洜鍠栭、姗€鎮╅搹顐ら拻闂傚倷娴囧畷鍨叏閹惰姤鈷旂€广儱顦崹鍌炴煢濡尨绱氶柨婵嗩槸缁€瀣亜閺嶃劎鈽夋繛鍫熺矒濮婅櫣娑甸崨顔俱€愬銈庡亝濞茬喖宕洪埀顒併亜閹哄棗浜鹃梺鎸庢穿婵″洤危閹版澘绫嶉柛顐g箘椤撴椽姊虹紒妯哄鐎殿噮鍓欒灃闁告侗鍠氶崢鎼佹⒑閸撴彃浜介柛瀣閹﹢鏁冮崒娑氬幈闁诲函缍嗛崑鍡樻櫠椤掑倻纾奸柛灞剧☉缁椦囨煙閻熸澘顏柟鐓庢贡閹叉挳宕熼棃娑欐珡闂傚倸鍊风粈渚€骞栭銈傚亾濮樺崬鍘寸€规洖缍婇弻鍡楊吋閸涱垽绱遍柣搴$畭閸庨亶藝娴兼潙纾跨€广儱顦伴悡鏇㈡煛閸ャ儱濡煎褜鍨伴湁闁绘ǹ绉鍫熺畳闂備焦瀵х换鍌毼涘Δ鍛厺闁哄洢鍨洪悡鍐喐濠婂牆绀堟慨妯挎硾閽冪喖鏌曟繛褍瀚烽崑銊╂⒑缂佹ê濮囨い鏇ㄥ弮閸┿垽寮撮姀鈥斥偓鐢告煥濠靛棗鈧懓鈻嶉崶銊d簻闊洦绋愰幉楣冩煛鐏炵偓绀嬬€规洟浜堕、姗€鎮㈡總澶夌处

    重磅专题
    往期文章
    最新文章