⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.开始.txt

📁 本书介绍了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程序写作的方法
💻 TXT
📖 第 1 页 / 共 3 页
字号:
  
这些表头文件定义了Windows的所有数据型态、函数呼叫、数据结构和常数标识符,它们是Windows文件中的一个重要部分。使用Visual C++ Developer Studio的Edit菜单中的Find in Files搜索这些表头文件非常方便。您还可以在Developer Studio中打开这些表头文件并直接阅读它们。

程序进入点


正如在C程序中的进入点是函数main一样,Windows程序的进入点是WinMain,总是像这样出现:

int WINAPI WinMain (      HINSTANCE hInstance,HINSTANCE hPrevInstance,

           PSTR szCmdLine,int iCmdShow)

该进入点在/ Platform SDK / User Interface Services / Windowing / Windows / Window Reference / Window Functions中有说明。它在WINBASE.H中声明如下:

int

WINAPI

WinMain(

    HINSTANCE hInstance,

    HINSTANCE hPrevInstance,

    LPSTR lpCmdLine,

    int nShowCmd

    );

您会注意到我在HELLOMSG.C中做了许多小改动。第三个参数在WINBASE.H中定义为LPSTR,我将它改为PSTR。这两种数据型态都定义在WINNT.H中,作为指向字符串的指针。LP前缀代表「长指针」,这是16位Windows下的产物。

我还在WinMain声明中改变了两个参数的名称。许多Windows程序中的变量名使用一种称作「匈牙利表示法」的命名系统,该系统在变量名称前面增加了表示变量数据型态的短前缀,我将在第三章更详细地讨论这个概念。现在仅需记住前缀i表示int、sz表示「以零结束的字符串」。

WinMain函数声明为返回一个int值。WINAPI标识符在WINDEF.H定义,语句如下:

#define WINAPI __stdcall

该语句指定了一个呼叫约定,包括如何生产机械码以在堆栈中放置函数呼叫的参数。许多Windows函数呼叫声明为WINAPI。

WinMain的第一个参数被称作「执行实体句柄」。在Windows程序设计中,句柄仅是一个应用程序用来识别某些东西的数字。在这种情况下,该句柄唯一地标识该程序,还需要它在其它Windows函数呼叫中作为参数。在Windows的早期版本中,当同时运行同一程序多次时,您便创建了该程序的「多个执行实体(multiple instances)」。同一应用程序的所有执行实体共享程序和只读的内存(通常是例如菜单和对话框模板的资源)。程序通过检查hPrevInstance参数就能够确定自身的其它执行实体是否正在运行。然后它可以略过一些繁杂的工作并从前面的执行实体将某些数据移到自己的数据区域。

在32位Windows版本中,该概念已被抛弃。传给WinMain的第二个参数总是NULL(定义为0)。

WinMain的第三个参数是用于执行程序的命令列。某些Windows应用程序利用它在程序启动时将文件加载内存。WinMain的第四个参数指出程序最初显示的方式,可以是正常的或者是最大化地充满整个画面,或者是最小化显示在工作列中。我们将在 第三章中介绍使用该参数的方法。

MessageBox函数


MessageBox函数用于显示短信息。虽然,MessageBox显示的小窗口不具有什么功能,实际上它被认为是一个对话框。

MessageBox的第一个参数通常是窗口句柄,我们将在第三章介绍其含义。第二个参数是在消息框主体中显示的字符串,第三个参数是出现在消息框标题列上的字符串。在HELLMSG.C中,这些文字字符串的每一个都被封装在一个TEXT宏中。通常您不必将所有字符串都封装在TEXT宏中,但如果想将您的程序转换为Unicode字符集,这确是一个好主意。我将在第二章详细讨论该问题。

MessageBox的第四个参数可以是在WINUSER.H中定义的一组以前缀MB_开始的常数的组合。您可从第一组中选择一个常数指出希望在对话框中显示的按钮:

#define     MB_OK                                                0x00000000L

#define     MB_OKCANCEL                                          0x00000001L

#define     MB_ABORTRETRYIGNORE                                  0x00000002L

#define     MB_YESNOCANCEL                                       0x00000003L

#define     MB_YESNO                                             0x00000004L

#define     MB_RETRYCANCEL                                       0x00000005L

如果在HELLOMSG中将第四个参数设置为0,则仅显示「OK」按钮。可以使用C语言的OR(|)操作符号将上面显示的一个常数与代表内定按钮的常数组合:

#define     MB_DEFBUTTON1                                        0x00000000L

#define     MB_DEFBUTTON2                                        0x00000100L

#define     MB_DEFBUTTON3                                        0x00000200L

#define     MB_DEFBUTTON4                                        0x00000300L

还可以使用一个常数指出消息框中图示的外观:

#define     MB_ICONHAND                                     0x00000010L

#define     MB_ICONQUESTION                            0x00000020L

#define     MB_ICONEXCLAMATION                          0x00000030L

#define     MB_ICONASTERISK                                 0x00000040L

这些图示中的某些有替代名称:

#define     MB_ICONWARNING                MB_ICONEXCLAMATION

#define     MB_ICONERROR                  MB_ICONHAND

#define     MB_ICONINFORMATION            MB_ICONASTERISK

#define     MB_ICONSTOP                   MB_ICONHAND

虽然只有少数其它MB_常数,但您可以自己参考表头文件或 / Platform SDK / User Interface Services / Windowing / Dialog Boxes / Dialog Box Reference / Dialog Box Functions里的文件。

在本程序中,MessageBox返回数值1,但更严格地说它返回IDOK,IDOK在WINUSER.H中定义,等于1。根据在消息框中显示的其它按钮,MessageBox函数还可返回IDYES、IDNO、IDCANCEL、IDABORT、 IDRETRY或IDIGNORE。

这个小的Windows程序真的与K&R的「hello, world」程序有着同等效果吗?您也许认为不是,因为MessageBox函数并没有「hello, world」中printf函数所具有的潜在格式化文字能力。但我们将在下一章中看到编写类似printf的MessageBox版本的方法。

编译、连结和执行


当您准备编译HELLOMSG时,您可从「Build」菜单中选择「 Build Hellomsg.exe」,或者按F7,或者在「 Build」工具列中选择「Build」图示。(该图示的外观显示在「 Build」菜单中。如果当前没有显示「Build」工具列,您可从「 Tools」菜单中选择「Customize」并选择「 Toolbars」页面标签,选中「Build」或者「 Build MiniBar」。)

另一种方法,您可从「Build」菜单中选择「Execute Hellomsg.exe」,或者按「Ctrl+F5」,或者在「 Build」工具列单击「Execute Program」图标(该图标看上去像一个红的感叹号),就会弹出一个消息框询问是否编译该程序。

正常情况下,在编译阶段,编译器从C原始码文件产生一个.OBJ(目标)文件。在连结阶段,连结程序结合.OBJ文件和.LIB(库)文件以建立.EXE(可执行)文件。通过在「 Project」页面标签上选择「Settings」并单击「 Link」页面标签可以查看这些库文件的列表。特别地,您会注意到KERNEL32.LIB、USER32.LIB和GDI32.LIB。这些是三个主要Windows子系统的「引用链接库」。它们包含了动态链接库的名称以及放进.EXE文件的引用信息。Windows使用该信息处理程序对KERNEL32.DLL、USER32.DLL、GDI32.DLL动态链接库中函数的呼叫。

在Visual C++ Developer Studio中,您可用不同的设定编译和连结程序。内定情况下,它们是「Debug」和「Release」。可执行文件被存放在以这些名称命名的子目录下。在Debug设定下,信息被附加到 .EXE文件中,这些信息有助于测试程序和追踪原始码。

如果您喜欢在命令列下工作,附上的CD-ROM包含所有范例程序的.MAK(make)文件。(可通过「 Tools」菜单选择「Options」,再选择「 Build」页面标签,来告诉Developer Studio生成make文件。这里有一个复选框需要勾选)。您需要执行在Developer Studio的BIN子目录下的VCVARS32.BAT来设置环境变量。要从命令列执行make文件,可以转到HELLOMSG目录并执行:

NMAKE /f HelloMsg.mak CFG="HelloMsg - Win32 Debug"

或者

NMAKE /f HelloMsg.mak CFG="HelloMsg - Win32 Release"

然后您可通过输入:

DEBUG\HELLOMSG

或者

RELEASE\HELLOMSG

从命令列执行.EXE文件。

我已经在本书附上的CD-ROM中对项目文件中的内定Debug设定做了一个改动。在「 Project Settings」对话框中,选择「C/C++」页面标签后,在「 Preprocessor Definitions」栏中,我已定义了标识符UNICODE。我将在下一章中对此有更多的解释。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -