楼主: 0ang1

windows程序架构

[复制链接]
  • TA的每日心情
    无聊
    2016-8-29 16:30
  • 签到天数: 33 天

    [LV.5]常住居民I

    发表于 2015-3-5 15:22:44 | 显示全部楼层 |阅读模式
    一、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消息后才会终止消息循环。
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2016-8-29 16:30
  • 签到天数: 33 天

    [LV.5]常住居民I

     楼主| 发表于 2015-3-5 15:23:08 | 显示全部楼层
    自己沙发呵呵
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-3-8 19:00:04 | 显示全部楼层
    能不能弄个看得懂的。。。。。

    点评

    可以整理一些简单的  详情 回复 发表于 2015-3-8 20:37
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-8-29 16:30
  • 签到天数: 33 天

    [LV.5]常住居民I

     楼主| 发表于 2015-3-8 20:37:36 | 显示全部楼层
    Skye 发表于 2015-3-8 19:00
    能不能弄个看得懂的。。。。。

    可以整理一些简单的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-29 12:20
  • 签到天数: 44 天

    [LV.5]常住居民I

    发表于 2015-3-15 16:12:11 | 显示全部楼层
    简单了解下还是很有用的,不过的确不会用的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-28 05:25:51 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-28 15:54:34 | 显示全部楼层
    感谢楼主的分享~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-6-30 18:47:19 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-7-1 02:12:03 | 显示全部楼层
    支持,看起来不错呢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-7-1 09:37:22 | 显示全部楼层
    支持中国红客联盟(ihonker.org)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    指导单位

    江苏省公安厅

    江苏省通信管理局

    浙江省台州刑侦支队

    DEFCON GROUP 86025

    旗下站点

    邮箱系统

    应急响应中心

    红盟安全

    联系我们

    官方QQ群:112851260

    官方邮箱:security#ihonker.org(#改成@)

    官方核心成员

    Archiver|手机版|小黑屋| ( 苏ICP备2021031567号 )

    GMT+8, 2024-5-1 10:29 , Processed in 0.034602 second(s), 13 queries , Gzip On, MemCache On.

    Powered by ihonker.com

    Copyright © 2015-现在.

  • 返回顶部