`

Windows程序架构

阅读更多

一、Windows程序框架

            所有的Windows程序都是基于一个模式的,分为以下几个步骤:
             1、定义窗口类(使用已有窗口类时可省略)
             2、注册窗口类(使用已有窗口类时可省略)
             3、创建窗口
             4、显示窗口(根据情况可省略)
             5、更新窗口(根据情况可省略)
             6、设立消息循环
             7、响应消息

             用MFC编程看不到以上步骤,但实际上这些步骤仍然存在,只不过是封装在MFC的框架之中了
   
             以下是Windows编程的基本架构,它几乎是万能的,稍加修改就可用作任何程序的起始阶段:

             #include <windows.h>
             LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
             int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmd,int nCmdShow)
             {
                 HWND hWnd;
                 MSG msg;
                 WNDCLASS w;
                 memset(&w,0,sizeof(w));
                 w.style=CS_HREDRAW|CS_VREDRAW;
                 w.lpfnWndProc=WndProc;
                 w.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
                 w.lpszClassName="Win32Test";
                 RegisterClass(&w);
                 hWnd=::CreateWindow("Win32Test","Test",WS_OVERLAPPEDWINDOW,10,10,600,400,NULL,NULL,hInst,NULL);
                 ShowWindow(hWnd,nCmdShow);
                 UpdateWindow(hWnd);
                 while(GetMessage(&msg,NULL,0,0))
                 {
                         TranslateMessage(&msg);
                         DispatchMessage(&msg);
                 }
                 return (int)(msg.wParam);
             }

             LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
             {
              if(uMsg==WM_DESTROY)
              {
               PostQuitMessage(0);
               return 0;
              }
              return DefWindowProc(hwnd,uMsg,wParam,lParam);
             }

         在Visual studio .net中,以上程序在编译时可能会出错,这是由于Visual studio .net生成的工程默认采用Unicode。修正方法有两种:一是修改工程属性,去掉Unicode;二是将字符转为Unicode字符(如L“Win32Test”或TEXT("Win32Test"),其中用TEXT()方式转换对Unicode工程及非Unicode工程均可用,可易植性好。若是#include <TCHAR.H>,则还可用_T()及_TEXT())。

     特别需要注意的是,消息循环时,要用while(GetMessage(&msg,NULL,0,0)),而非while(GetMessage(&msg,hWnd,0,0))。因为此时是从Windows中取消息,而非仅从本窗口中取消息,否则会出现窗口已关闭而程序仍在运行的情况。

二、 框架程序注释

              1、WinMain函数
              WinMain函数是Windows程序的入口点,程序自此开始,它的各项参数是:
              (1)HINSTANCE hInst是当前进程的句柄
              (2)HINSTANCE hPreInst是这个程序前一个实例的句柄,只对16位Windows编程有用,对Win32编程无效,总是NULL。
              (3)LPSTR lpszCmd是传给程序的参数
              (4)int nCmdShow指明程序开始时的状态(最大化/最小化/正常)

              2、定义Window类
              WNDCLASS或WNDCLASSEX结构用于定义Windows窗口类的名称、样式、窗口处理函数、背景、图标、光标、菜单等属性。其中最重要的是窗口类名称及窗口处理函数。
              对WNDCLASS及WNDCLASSEX结构不详述。

              3、注册Windows类
              RegisterClass或RegisterClassEx用于注册窗口类,其参数类型是指向WNDCLASS或WNDCLASSEX的指针。
              对RegisterClass及RegisterClassEx结构不详述。

              4、生成窗口
              CreateWindow或CreateWindowEx用于生成窗口,其函数原型为:
              HWND CreateWindow(
                   LPCTSTR lpClassName,              //窗口类名称
                   LPCTSTR lpWindowName,             //窗口标题
                   DWORD dwStyle,             //窗口样式
                   int x,              //水平位置
                   int y,              //垂直位置
                   int nWidth,             //窗口宽度
                   int nHeight,             //窗口高度
                   HWND hWndParent,            //父窗口句柄
                   HMENU hMenu,             //菜单句柄
                   HINSTANCE hInstance,            //进程句柄
                   LPVOID lpParam);            //窗口建立的数据的地址

               HWND CreateWindowEx(
                   DWORD dwExStyle,            //扩展的窗口样式
              LPCTSTR lpClassName,            //窗口类名称
                   LPCTSTR lpWindowName,             //窗口标题
                   DWORD dwStyle,             //窗口样式
                   int x,              //水平位置
                   int y,              //垂直位置
                   int nWidth,             //窗口宽度
                   int nHeight,             //窗口高度
                   HWND hWndParent,            //父窗口句柄
                   HMENU hMenu,             //菜单句柄
                   HINSTANCE hInstance,            //进程句柄
                   LPVOID lpParam);            //窗口建立的数据的地址

              5、显示并更新窗口
              ShowWindow函数用于显示窗口,它除了需要窗口的句柄作为参数外,还需要一个参数用于确定窗口的状态,这个参数有以下值:
                   SW_SHOWMINIMIZED 最小化
                   SW_SHOWMAXIMIZED 最大化
                   SW_SHOW            正常显示
               UpdateWindow函数用于更新窗口,它向Windows发送一条WM_PAINT消息,以要更新的窗口的句柄为参数。

              6、消息循环
              GetMessage函数用于获取消息,在窗口消息循环时,要用while(GetMessage(&msg,NULL,0,0)),而非while(GetMessage(&msg,hWnd,0,0))。因为此时是从Windows中取消息,而非仅从本窗口中取消息,否则会出现窗口已关闭而程序仍在运行的情况。GetMessage只有在收到WM_QUIT消息时才会返回0,从而终止消息循环。
              TranslateMessage用于对消息进行处理以使消息规范化,DispatchMessage将消息传递给窗口过程,以使窗口过程能够处理消息。

              7、响应消息
              对消息的响应是由窗口过程完成的。窗口过程是一个回调函数,其原型为:
LRESULT CALLBACK WindowProc(
               HWND hwnd,            //发送消息的窗口句柄
               UINT uMsg,            //消息
               WPARAM wParam, //消息参数
               LPARAM lParam); //消息参数

              DefWindowProc是Windows默认的窗口过程函数,程序可只对自己感兴趣的消息进行处理,其余消息交给默认窗口过程函数处理。
              PostQuitMessage函数向系统发出WM_QUIT消息,系统在接收到WM_QUIT消息后才会终止消息循环。

分享到:
评论

相关推荐

    windows程序的文件结构

    windows程序的文件结构,系统介绍文件结构的文档 windows程序的文件结构,系统介绍文件结构的文档

    Windows 程序设计(第5版)(上、下册)--详细书签版

     Charles Petzold从 1984年开始编写个人计算机程序,从 1985年开始编写 Microsoft Windows程序。他在《Microsoft Systems Joumal》1986年 12月号上发表了第一篇关于 Windows程序设计的杂志论文。从 1986年到 1995年...

    windows 程序设计

    在Windows中,API还意味着一个特殊的程序架构,我们将在每章的开头进行研究。 一般而言,Windows API自Windows 1.0以来一直保持一致,没什么重大改变。具有Windows 98程序写作经验的Windows程序写作者会对Windows ...

    深入研究Windows内部原理系列之三:Windows体系结构-从应用程序的角度.zip

    深入研究Windows内部原理系列之三:Windows体系结构-从应用程序的角度.zip

    MFC Windows程序设计(第2版修订版)--源代码

     《mfc windows程序设计(第2版)》是对其极为经典的第1版的全面更新,本书不仅扩展了已被认为是权威的关于microsoft用于windows api的功能强大的c++类库的阐述,还新增了有关com、ole和activex的内容。本书的作者...

    Windows程序设计(第2版)王艳_源代码

    书籍目录: 第1章 Windows程序设计基础   1.1 必须了解的内容   1.2 VC++的基本使用  1.3 本书推荐的编程环境  1.4 代码的风格  第2章 Win32程序运行原理   2.1 CPU的保护模式和Windows系统  2.2 ...

    windows 程序设计中文教程.chm(wcb2003)

    如在本章稍后所讨论的,这不是写作Windows程序的唯一方法。然而,无论最终您使用什么方式写作程序,了解Windows API都是非常重要的。 正如您可能知道的,Windows 98已成为使用Intel 32位微处理器(例如486和Pentium...

    windows 程序设计中文版

    第1章 起步 1.1 Windows环境 1.1.1 Windows简史 1.1.2 Windows的方方面面 1.1.3 动态链接 1.2 Windows编程选项 1.2.1 API及内存管理模式 1.2.2 语言选择 1.2.3 编程环境 1.2.4 API文档 1.3 你的第一个Windows程序 ...

    Windows程序设计(第五版)

    如在本章稍后所讨论的,这不是写作Windows程序的唯一方法。然而,无论最终您使用什么方式写作程序,了解Windows API都是非常重要的。 正如您可能知道的,Windows 98已成为使用Intel 32位微处理器(例如486和Pentium...

    MFC.Windows程序设计(第2版)修订版 高清pdf带源码

    MFC.Windows程序设计(第2版)...《MFC Windows程序设计》(第2版)(修订版)涵盖了以下专题:事件驱动程序设计和MPC的基础知识文档/视图体系结构位图、调色板和区域多线程和线程同步MFC与组件对象模型(COM)ActiveX控件

    用C++编写的windows操作系统的多线程同步程序

    在掌握基于消息的windows程序结构和多线程程序设计方法的基础上,设计一个多线程同步的程序。使学生能够从程序设计的角度了解多线程程序设计的方法和在windows系统下多线程同步互斥的机制。 2、实验内容 理解Windows...

    MFC Windows程序设计(第2版)修订版+源代码

    作者: (美)Jeff Prosise ...《MFC Windows程序设计》(第2版)(修订版)涵盖了以下专题:事件驱动程序设计和MPC的基础知识文档/视图体系结构位图、调色板和区域多线程和线程同步MFC与组件对象模型(COM)ActiveX控件

    MFC Windows程序设计带书签高清版

    《MFCWindows程序设计》(第2版)...《MFCWindows程序设计》(第2版)(修订版)涵盖了以下专题:事件驱动程序设计和MPC的基础知识文档/视图体系结构位图、调色板和区域多线程和线程同步MFC与组件对象模型(COM)ActiveX控件

    Windows程序设计基础课件:第2讲MFC应用程序框架及文档视图架构.pdf

    Windows程序设计基础课件:第2讲MFC应用程序框架及文档视图架构.pdf

    Windows程序设计教程.zip

    该文档详细介绍了Windows程序设计流程、基本结构、语法结构等。感兴趣的朋友可以下载下来学习学习,了解了解。

    Windows SDK笔记(一):Windows程序基本结构

    Windows SDK笔记(一):Windows程序基本结构

Global site tag (gtag.js) - Google Analytics