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

📄 chapter2.txt

📁 游戏核心编程,游戏发烧友需要知道的基本知识哦
💻 TXT
📖 第 1 页 / 共 5 页
字号:
  消息传送概念使Windows能够实现多任务。消息有四个基本来源。应用程序可以从用户那儿接受消息,也可以是Windows本身,应用程序本身或者是其它应用程序。
  用户消息包括按键消息、鼠标移动、鼠标指点或单击、菜单选择、滚动条的定位等。应用程序必须花费大量的时间来处理用户消息。用户产生的消息表明运行程序的人希望改变应用程序的表现方式。
  无论何时,如果状态发生改变,将会有一个消息被发往应用程序。一个例子是用户单击了应用程序的图标,表明他们想要将此应用程序变为活动的应用程序。在这种情况下,Windows告诉应用程序它的主窗口被打开了,它的大小和位置被改变了等等Windows产生的消息可以被处理,也可以被忽略,这跟应用程序当前的状态有关。
    相应消息
    在传统的面向过程的C语言Windows应用程序中,对于遇到的每一种消息,它都有一个相应的过程来处理这消息。不同的窗口对相同的消息会产生不同的响应。Windows把每个消息发送到应用程序的不同窗口,而不同的窗口对相同的消息会有不同解释。不令应用程序需要不同的过程来处理每一种消息,每一个窗口也应有不同的过程来处理不同的消息。窗口过程集合了应用程序的所有消息处理过程。
    消息循环
    所有Windows应用程序的一个基本组成就是消息处理循环。每一个C应用程序都在内部执行这个操作。C应用程序包含了创建并初始化窗口的过程,随后是消息处理循环,最后是结束应用程序所需的一些代码。消息循环负责处理Windows发给主程序的消息。在这儿,程序知道有了消息,并且要求Windows将消息发送到合适的窗口过程以供处理。当消息被接受时,窗口过程就执行希望的动作。
       
    第八节 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()函数返回一个刷子句柄,用于在这个类创建的窗口用户区中画出背景色。
    wcApp.style窗口类风格被设为CS-HREDRAW或CS-VREDRAW。
    最后的两个域,weApp.cbClsExtra以及wcApp.cbWndExtra经常被设为0。这些域可以被选用以指明窗口结构和窗口数据结构后面应该保留的附加字节数。
   下面这段代码用于注册窗口类:

⌨️ 快捷键说明

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