随笔 - 1, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

Windows 程序设计学习笔记1

/*------------------------------------------------------------------

HelloMsg.c -- Displays "Hello, Windows 98!" in a message box

(c) Charles Petzold, 1998

--------------------------------------------------------------------
*/

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
            PSTR szCmdLine, int iCmdShow)
{
  MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0);
  return 0 ;
}

几乎每一个使用C/C++编写的Windows程序在开头都会使用include引入"windows.h"头文件,WINDOWS.H是主要的含入文件,
它包含了其它Windows表头文件,这些表头文件的某些也包含了其它表头文件.这些表头文件中最重要的和最基本的是:

WINDEF.H 基本型态定义。
WINNT.H 支持Unicode的型态定义。
WINBASE.H Kernel函数。
WINUSER.H 使用者接口函数。
WINGDI.H 图形设备接口函数。
  
这些表头文件定义了Windows的所有数据型态、函数呼叫、数据结构和常数标识符,它们是Windows文件中的一个重要部分.
每一个C/C++程序都有一个程序入口(main函数),Windows程序的也有进入点:WinMain,该函数总是像这样出现:

int WINAPI WinMain ( HINSTANCE hInstance,HINSTANCE hPrevInstance,
            PSTR szCmdLine,int iCmdShow)

WinMain在WINBASE.H中有如下声明:

int
WINAPI
WinMain(
      HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPSTR lpCmdLine,
      int nShowCmd
      );

其中第三个参数在WINBASE.H中定义为LPSTR,示例中为PSTR.这两种数据型态都定义在WINNT.H中,作为指向字符串的指针.LP前缀代表「长指针」,这是16位Windows下的写法.


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

#define WINAPI __stdcall

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

WinMain的第1个参数被称作「执行实体句柄」.在Windows程序设计中,句柄仅是一个应用程序用来识别某些东西的数字.在这种情况下,该句柄唯一地标识该程序,还需要它在其它Windows函数呼叫中作为参数.
在Windows的早期版本中,当同时运行同一程序多次时,便创建了该程序的「多个执行实体(multiple instances)」.同一应用程序的所有执行实体共享程序和只读的内存(通常是例如菜单和对话框模板的资源).程序通过检查hPrevInstance参数就能够确定自身的其它执行实体是否正在运行,然后它可以略过一些繁杂的工作并从前面的执行实体将某些数据移到自己的数据区域,在32位Windows版本中,该概念已被抛弃,故传给WinMain的第2个参数总是NULL(定义为0).
WinMain的第3个参数是用于执行程序的命令列,如某些Windows应用程序利用它在程序启动时将文件加载内存.
WinMain的第4个参数指出程序最初显示的方式,可以是正常的或者是最大化地充满整个画面,或者是最小化显示在工作列中.

MessageBox函数用于显示短信息,虽然,MessageBox显示的小窗口不具有什么功能,实际上被认为是一个对话框.
MessageBox的第1个参数通常是窗口句柄.
第2个参数是在消息框主体中显示的字符串.
第3个参数是出现在消息框标题列上的字符串,在示例程序中,这些文字字符串的每一个都被封装在一个TEXT宏中.

MessageBox的第4个参数用于在对话框中显示按钮,它可以是在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

如果在示例程序中将第4个参数设置为0,则仅显示「OK」按钮.可以使用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

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

posted on 2011-11-29 10:39 Anders 阅读(1628) 评论(0)  编辑 收藏 引用 所属分类: Win32


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理