`

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操作系统环境下开发应用程序的核心技术和原理。Windows作为全球最广泛使用的桌面操作系统,它的程序设计技术对于IT专业人士来说至关重要。本书覆盖了从早期的挑战到现在...

    Windows程序设计 第6版

    《Windows程序设计 第6版》是一本深入探讨Windows平台下程序开发的经典著作,尤其针对C#编程语言进行了详细的讲解。本书旨在帮助读者掌握利用C#进行高效、稳定且功能丰富的Windows应用程序开发的技术与技巧。 首先...

    windows程序设计第三版

    《Windows程序设计第三版》是计算机科学领域的一本经典教材,主要关注于Windows操作系统下的应用程序开发。这本书深入探讨了如何利用Microsoft的API(应用程序接口)和其他相关工具来编写高效、稳定的本地应用程序。...

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

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

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

    在深入探讨Windows操作系统内部原理的过程中,我们不能忽视其体系结构对应用程序开发和运行的重要性。本系列的第三部分,我们将从应用程序的角度出发,理解Windows体系结构的精髓。这将帮助开发者更好地设计、优化和...

    Windows程序设计(第五版)源码

    《Windows程序设计(第五版)源码》是深入学习Windows平台下程序开发的重要参考资料,尤其对于使用VC++和MFC框架进行开发的程序员来说,它提供了丰富的实例和实践素材。这本书的内容涵盖了Windows API、MFC类库以及...

    windows程序设计源程序

    在Windows程序设计领域,源程序是开发者用于创建可执行应用程序的原始代码。这些源代码通常由C、C++或更现代的语言如C#编写,它们提供了深入理解操作系统工作原理的窗口。"Windows程序设计源程序"这个主题涵盖了一...

    Windows程序设计和源码

    在IT领域,Windows程序设计是开发人员必备的技能之一,特别是在桌面应用开发中。源码则是程序员学习和理解软件工作原理的重要工具。本资源“Windows程序设计和源码”提供了一个经典的入门教程,帮助初学者迈入...

    Windows程序设计(第5版 珍藏版)光盘源码

    《Windows程序设计(第5版 珍藏版)光盘源码》是关于Windows操作系统下进行程序开发的重要参考资料,适合计算机科学与技术、软件工程等相关专业的学生以及对Windows编程有深入兴趣的开发者。该书的第五版珍藏版不仅...

    Windows程序设计教程

    在Windows程序设计中,首先要理解的是Windows API(应用程序接口),它是Windows操作系统提供给开发者的一系列函数、结构和常量,用于创建和管理应用程序。例如,CreateWindow函数用于创建窗口,SendMessage函数用于...

    MFC Windows程序设计电子书

    《MFC Windows程序设计电子书》是一份涵盖了MFC(Microsoft Foundation Classes)在Windows平台下进行应用程序开发的详细教程。MFC是微软提供的一套C++类库,它基于面向对象编程思想,为开发者提供了构建Windows应用...

    mfc windows 程序设计(三)

    在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)库在Windows程序设计中的应用,特别是针对标题和描述中提到的“MFC Windows程序设计(三)”这一主题。MFC是微软提供的一种C++类库,它封装了Windows ...

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

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

    windows程序设计第五版(珍藏版)光盘文件

    《Windows程序设计第五版》是深入探讨Windows操作系统编程的经典之作,尤其这个珍藏版更是包含了丰富的资料和资源。光盘文件中的各个部分都是为了帮助读者更好地理解和实践Windows程序设计。 EULA.txt 文件通常代表...

    MFC windows程序设计(第二版)及源码

    《MFC Windows程序设计(第二版)》是一本专注于Windows应用程序开发的专业书籍,它深入浅出地介绍了使用Microsoft Foundation Classes (MFC)库进行Windows应用程序设计的方法和技巧。MFC是微软提供的一种C++类库,...

    Windows程序设计(CHM)(附windowsAPI参考)

    1. **Windows程序结构**:包括程序的启动过程,消息循环,以及如何处理窗口消息。 2. **进程与线程**:深入理解进程间的通信机制,线程同步和调度,以及如何创建和管理线程。 3. **内存管理**:介绍如何动态分配和...

    windows程序的文件结构

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

    Visual C++环境下Windows程序开发概述 Visual C++环境下Windows程序开发概述

    在《第12章 Visual C++环境下Windows程序开发概述》的PPT中,可能会涵盖以下内容:Windows程序设计的基本原理、MFC架构的介绍、如何使用IDE创建和管理项目、关键的MFC类及其作用、消息系统的工作机制、以及一些常见...

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

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

Global site tag (gtag.js) - Google Analytics