日期:2014-05-17  浏览次数:20781 次

Windows程序设计1

Windows程序设计1
2011年03月27日
  第八节 windows的函数
  Windows向应用程序开发人员提供了数以百计的函数。这些函数的例子包括DispatchMes-sage(),PostMessage(),RegisterWindowMessage()以及SetActiveWindow()。对于使用基础类库的C++程序员,许多函数自动被运行。
  在16位的Windows 3.x下的函数声明包括一个pascal修饰符,这在DOS下更为有效Windows95和Windows NT下的32位应用程序不再使用这个修饰符。如你所知,所有Windows函数的参数是通过系统来传递的。函数的参数从最右边的参数开始向左压入栈,这是标准的C方式。在从函数返回之前,调用过程必须按原来压入栈的字节数调整栈指针。
  第九节 windows应用程序框架
  Windows头文件:WINDOWS.H
  WINDOWS.H头文件(以及其它相关文件)是所有程序的内在部分。传统上,WINDOWS.H是所有C语言编写的Windows应用程序必需的一部分。当在C++中使用基础类库时,WINDOWS.H包括在AFXWIN.H头文件中。
  Windows应用程序的组成
     在开发Windows应用程序的过程中有一些重要的步骤:
    *用C语言编写WinMain()函数和相关的窗口函数,或者在C++中使用基础类,比如CWinApp等。
  *创建菜单、对话框和其它资源并把它们放入资源描述文件。
  *(可选)使用Vinsual C++编译器中的企业编辑器来创建对话框。
  *(可选)使用Vinsual C++编译器中的企业编辑器来创建对话框。
  *用项目文件来编译并链接所有的C/C++源程序和资源文件
  Windows应用程序中的组成部分
  1. WinMain()函数
  Windows 95和Windows NT需要一个WinMain()函数。这是应用程序开始执行和结束的地方。
  从Windows向WinMain()传递四个参数。下面的代码段演示了这些参数的使用:
  int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPreInst,
  LPSTR 1pszCmdLine, int nCmdShow)
  第一个参数hInst包含了应用程序的实例句柄。当应用程序在Windows下运行时,这个数字唯一标识了应用程序。
  第二个参数hPreInst将始终是一个NULL值,表明没有这个应用程序的其它实例正在运行,因为在Windows 95和Windows NT下每个应用程序都在它自己单独的地址空间中运行。
  第三个参数1pszCmdLine是指向一个以'/0'结尾的字符串的长指针,这个字符串代表了应用程序的命令行参数。
  WinMain()的第四个参数是nCmdShow。在nCmdShow中存储的整数代表了Windows预定义的许多常量中的一个,它决定了窗口显示的方式。
  2. WNDCLASS
  WinMain()负责注册应用程序的主窗口类。每个窗口类都建立在一些用户选择的风格、字体、标题字、图标、大小、位置等的基础上。窗口类实际上是定义这些属性的一个模板。
    基本上,所有的Windows类定义都使用相同的标准C/C++结构。下面的例子是一个说明WNDCLASSW结构的typedef语句,WNDCLASS是从这儿继承的:
  typedef struct tagWNDCLASSW
  UINT style;
  WNDPROC 1pfnWndProc;
  int cbClsExtra;
  int cbWndExtra;
  HANDLE hInstance;
  HICON hIcon;
  HCURSOR hCursor;
  HBR8USH hbrBackground;
  LPCWSTR 1pszMenuName;
  LPCWSTR 1pszClassName;
  WNDCLASSW,*PWNDCLASSW,NEAR*NPWNDCLASSW, FAR*LPWNDCLASSW;
  下面的部分讨论了WNDCLASS结构中的不同的域。其中有些域可以被赋予NULL,告诉Windows使用缺省的预定义值。
  style:style域指明了类风格。
    1pfnWndProc:接受一个指向窗口函数的指针,它将执行所有的窗口任务。
    cbClsExtra:指定了必须在窗口类结构后面分配的字节数,它可以是NULL。
    cbWndExtra:指定了必须在窗口实例后面分配的字节数,它可以是NULL。
    hInstance:定义了注册窗口类的应用程序实例。它必须是一个实例句柄,不得是NULL。
    hIconhIcon:划定利用窗口最小化时显示的图标。它可以是NULL。
    hCursorhCursor:定义了应用程序使用的光标。这个句柄可以是NULL。
  hbrBackground:提供了背景刷子的标识符。
  1pszMenuName:是指向一个以空字符结尾的字符串的指针。这个字符串是菜单的资源名。这一项可以为NULL。
  1pszClassName:是指向一个以空字符结尾的字符串的指针。这个字符串是窗口类的名字。
  3.WNDCLASSEX
  Windows提供了一种扩展的WNDCLASS定义,名为WNDCLASSEX,它允许应用程序使用小图标。下面是WNDCLASSEX结构的定义:
  typedef struct WNDCLASSEX
  UINT style;
  WNDPROC 1pfnWndProc;
  int cbClsExtra;
  int cbWndExtra;
  HANDLE hInstance;
  HICON hIcon;
  HCURSOR hbrBackground;
  LPCTSTR 1pszMenuName;
  LPCTSTR 1pszClassName;
  HICON hIconSm;
  WNDCLASSEX;
  你可以看到这两个结构是相同的,除了WNDCLASSEX包括了hIconSm成员,这是与窗口类有关的小图标的句柄。
  4.定义窗口类
  应用程序可以定义它们自己的窗口类,只要先定义一个合适类型的结构,然后用窗口类的信息来填充结构的域。
  下面的代码示范了如何定义并初始化一个WNDCLASS结构。
  char szProgName[]="ProgName";
  .
  .
  .
  WNDCLASS wcApp;
  .
  .
  .
  wcApp.1pszClassName=szProgName;
  wcApp.hInstance=hInst;
  wcApp.1pfnWndProc=WndProc;
  wcApp.hCursor=LoadCursor(NULL,IDC-ARROW);
  wcApp.hIcon=NULL;
  wcApp.1pszMenuName=szAppIName;
  wcApp.hbrBackground=GetStockObject(WHITE-BRUSH);
  wcApp.style=CS-HREDRAW| CS-VREDRAW;
  wcApp.cbClsExtra=0;
  wcApp.cbWndExtra=0;
  if(!RegisterClass (&wcApp))
  return 0;
  WNDCLASS结构中的第二个域是wcApp.hInstance,它被赋予了WinMain()被激活后返回的hInst的值。这指明了应用程序的当前实例。1pfnWndProc被赋予执行所有窗口任务的窗口函数的指针地址。对于大部分应用程序,这个函数叫做WndProc()。
    注意:WndProc()是一个用户定义而不是预定义的函数名。在赋值语句之前必须给出函数原型。
  wcApp.hCursor域被赋予实例的光标句柄。
  当wcApp.1pszMenuName被赋予NULL值的时候,Windows就认为这个窗口类没有菜单。 如果有,菜单必须有一个名字,它必须出现在引号里面。GetStockOject()函数返回一个刷子句柄,用于在这个类创建的窗口用户区中画出背景色