1.消息结构体
typedef struct tagMSG {     // msg  
   HWND hwnd;           //标识消息与哪个窗口相关
   UINT message; //指示消息本身
   WPARAM wParam; //消息的附加消息
   LPARAM lParam; //消息的附加消息
   DWORD time;  //消息产生的时间
   POINT pt;  //消息产生时光标的位置
} MSG

2.关于句柄 
(1)句柄(HANDLE),资源的标识。
(2)操作系统要管理和操作这些资源,都是通过句柄来找到
 对应的资源。按资源的类型,又可将句柄细分成图标句柄
(HICON),光标句柄(HCURSOR),窗口句柄(HWND),
 应用程序实例句柄(HINSTANCE)等等各种类型的句柄。
 操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。

3.WinMain函数

Windows程序的入口函数
int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance应用程序实例句柄
  HINSTANCE hPrevInstance,  // handle to previous instance应用程序先前的实例句柄
                            // This parameter is always NULL在Win32下总是为空
  LPSTR lpCmdLine,          // command line命令行参数
  int nCmdShow              // show state指定程序窗口的显示状态
);

注:VC++6.0下设置命令行参数的方法:
   Projects->Settings->Debug->Program arguments

4.窗口的创建 
创建一个完整的窗口需要经过下面四个操作步骤:
(1)设计一个窗口类;
 typedef struct _WNDCLASS { 
  UINT     style;            //指定窗口类的类型,如:CS_HREDRAW-窗口水平尺寸
                                   //或水平大小发生变化时,窗口重绘,CS_VREDRAW-窗口
       //垂直尺寸或垂直大小发生变化时,窗口重绘
  WNDPROC lpfnWndProc;   //函数指针,指向窗口函数
  int      cbClsExtra;   //类风格的额外的数据,通常设置为0
  int      cbWndExtra;       //窗口类的额外数据,通常设置为0
  HANDLE  hInstance;   //当前应用程序的实例号
  HICON    hIcon;            //图标的句柄,设置标题栏使用的图标
  HCURSOR  hCursor;          //光标的句柄
  HBRUSH   hbrBackground;    //画刷的句柄
  LPCTSTR  lpszMenuName;     //指定菜单的名字
  LPCTSTR  lpszClassName;    //设置窗口的名字
 } WNDCLASS;

<1>"winuser.h"
    #define CS_VREDRAW          0x0001
    #define CS_HREDRAW          0x0002
    #define CS_DBLCLKS          0x0008
     假如:style=CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE
     如果需要在style中去掉CS_NOCLOSE,可以使用style & ~CS_NOCLOSE
    <2>函数名可以表示函数代码的首地址.
    <3>hIcon,使用LoadIcon函数来赋值:wndcls.hCursor=LoadCursor(NULL,IDC_CROSS)
       HICON LoadIcon( HINSTANCE hInstance, //This parameter must be NULL when 
                                            //a standard icon is being loaded. 
         //微软已经为我们设置好了标准的图标,所以这里
         //的值设置为NULL
                       LPCTSTR lpIconName
                     );
    <4>设置光标:wndcls.hCursor=LoadCursor(NULL,IDC_CROSS),LoadCursor和LoadIcon的用法
       很接近.
    <5>设置画刷的句柄:wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
       API函数GetStockObject:Win GDI函数,
              HGDIOBJ GetStockObject(
     int fnObject   // stock object type
       );
       fnObject:BLACK_BRUSH/DKGRAY_BRUSH/DC_BRUSH........ 
       (HBRUSH)强制类型转换
       
(2)注册窗口类;
 RegisterClass(&wndcls);注册窗口类
 ATOM RegisterClass(
      CONST WNDCLASS *lpWndClass   //指向窗口类的指针
        );
        "windef.h":typedef WORD                ATOM;
            typedef unsigned short      WORD;
(3)创建窗口;
        首先定义一个窗口句柄:HWND hwnd;
 使用API函数CreateWindow创建窗口:
 HWND CreateWindow(          
  LPCTSTR lpClassName,         //注册的窗口类名,如果指定的类名没有注册,应用
                               //程序依然可以运行,只不过不会产生窗口
  LPCTSTR lpWindowName,        //窗口的名字,即窗口标题栏的文字
  DWORD dwStyle,       //窗口的类型  
  int x,                       //窗口显示的时候的水平坐标
  int y,                       //窗口显示的时候的垂直坐标    
  int nWidth,                  //窗口的宽度
  int nHeight,                 //窗口的高度
  HWND hWndParent,             //指向父窗口的句柄
  HMENU hMenu,                 //窗口菜单的句柄
  HINSTANCE hInstance,         //应用程序实例的句柄
  LPVOID lpParam               //WM_CREATE消息的附加参数
 );
 hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,
  0,0,600,400,NULL,NULL,hInstance,NULL);
 #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED  | / //产生层叠的窗口,具有标题栏和边框
                             WS_CAPTION        | /   //具有标题栏
                             WS_SYSMENU        | /   //具有系统菜单
                             WS_THICKFRAME     | /   //具有可调边框的窗口
                             WS_MINIMIZEBOX    | /   //具有最小化,最大化按钮,此时必须同时
                                //设置WS_SYSMENU
                             WS_MAXIMIZEBOX)
        同理,如果要在WS_OVERLAPPEDWINDOW中去掉最大化按钮,可以使用
 WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX
 如果将x设置为CW_USEDEFAULT,系统将为窗口左上角选择缺省的坐标,同时忽略y坐标
 如果将nWidth设置为CW_USEDEFAULT,同上nHeight被忽略.

(4)显示窗口:
        ShowWindow(hwnd,SW_SHOWNORMAL);
 BOOL ShowWindow(
       HWND hWnd,
              int nCmdShow
        );
        nCmdShow:SW_HIDE
   Hides the window and activates another window.
   SW_MAXIMIZE
    Maximizes the specified window.
   SW_MINIMIZE
          Minimizes the specified window and activates the
   next top-level window in the Z order.
(5)更新窗口
       UpdateWindow(hwnd);

5.消息循环:
       GetMessage(&msg,NULL,0,0);
       BOOL GetMessage(          //从消息队列中取出一条消息
            LPMSG lpMsg,         //消息结构体的指针
            HWND hWnd,           //指示获取哪一个窗口的消息
            UINT wMsgFilterMin,  //指定消息的最小值,指定消息的范围
            UINT wMsgFilterMax   //指定消息的最大值,指定消息的范围,设置为0表示没有消息过滤
       ); 
lpMsg
[out] Pointer to an MSG structure that receives message information
      from the thread's message queue
      out指示不需我们赋值,只需放置一个这样的变量,由系统函数为我们填充

TranslateMessage(&msg);转换消息/翻译消息
      比如它可以将WM_KEYDOWN和WM_KEYUP消息转换为WM_CHAR消息,然后重新投递到消息队列

DispatchMessage(&msg);将消息分发给窗口的回调函数,

6.窗口过程回调函数
 LRESULT CALLBACK WindowProc(
         HWND hwnd,
  UINT uMsg,
  WPARAM wParam,
                LPARAM lParam
        );
 函数名可以更改,函数参数的类型不能改变.

case WM_CHAR:
  char szChar[20];
  sprintf(szChar,"char is %d",wParam);//sprintf格式化wParam值,存入szChar中
  MessageBox(hwnd,szChar,"weixin",0);
  break;
        int MessageBox(
         HWND hWnd,               //消息框所属的窗口
  LPCTSTR lpText,          //消息框显示的文本
  LPCTSTR lpCaption,       //消息框的标题
  UINT uType               //消息框的类型
 );  
        uType:
 MB_OK
  The message box contains one push button: OK. This is the default.
 MB_OKCANCEL
  The message box contains two push buttons: OK and Cancel.
 MB_YESNO
  The message box contains two push buttons: Yes and No.

#define MB_OK                       0x00000000L
        #define MB_OKCANCEL                 0x00000001L

case WM_LBUTTONDOWN:
  MessageBox(hwnd,"mouse clicked","weixin",0);
  HDC hdc;              //设备描述表句柄
  hdc=GetDC(hwnd);
  TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));
  ReleaseDC(hwnd,hdc);
  break;

HDC GetDC(
  HWND hWnd   // handle to window
 );

BOOL TextOut(
  HDC hdc,           // handle to DC
  int nXStart,       // x-coordinate of starting position
  int nYStart,       // y-coordinate of starting position
  LPCTSTR lpString,  // character string
  int cbString       // number of characters
 );
 ReleaseDC(hwnd,hdc);

case WM_PAINT:           //当窗口重绘时发送WM_PAINT消息
  HDC hDC;
  PAINTSTRUCT ps;
  hDC=BeginPaint(hwnd,&ps);
  TextOut(hDC,0,0,"维新培训",strlen("维新培训"));
  EndPaint(hwnd,&ps);
  break;
 HDC BeginPaint(
  HWND hwnd,            // handle to window
  LPPAINTSTRUCT lpPaint // paint information
 );
        BeginPaint和EndPaint函数只能在WM_PAINT里面使用,其它的任何地方都不能使用
 GetDC和ReleaseDC也不能WM_PAINT里面使用,能在其它地方使用

case WM_CLOSE:
  if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
  {
   DestroyWindow(hwnd);      //使用这个函数时,会发送WM_DESTROY消息
                             //销毁窗口
  }
  break;

查看MSDN MessageBox函数的返回值:
 IDABORT        Abort button was selected. 
 IDCANCEL       Cancel button was selected. 
 IDCONTINUE     Continue button was selected. 
 IDIGNORE       Ignore button was selected. 
 IDNO           No button was selected. 
 IDOK           OK button was selected. 
 IDRETRY        Retry button was selected. 
 IDTRYAGAIN     Try Again button was selected. 
 IDYES          Yes button was selected

BOOL DestroyWindow( 
      HWND hWnd
        );

case WM_DESTROY:
  PostQuitMessage(0);
  break;

void PostQuitMessage(
      int nExitCode                //指示应用程序退出的代码
                                   //执行这个函数会投递WM_QUIT消息到消息队列
 );

WM_QUIT消息可以使GetMessage函数的值为0

default:
  return DefWindowProc(hwnd,uMsg,wParam,lParam);
  //其它的消息由缺省的窗口过程处理.这段程序是比不可少的

7.CALLBACK
 #define CALLBACK    __stdcall    //标准的调用约定
 #define WINAPIV     __cdecl      //c语言调用约定
 在参数传递的顺序和堆栈的清除有些差异.
修改调用约定:
 Projects->Settings->c/c++->Category:Code Generation

孙鑫VC学习笔记:第一讲 Windows程序内部运行原理相关推荐

  1. 《VC++深入详解》学习笔记 第一章 Windows程序内部运行机制

    (金光鳞闪影若茫) 窗口四步走: 设计窗口类 注册窗口类 创建窗口 显示更新窗口 最后创建消息循环和响应函数 设计窗口类: typedef struct {UINT style;//窗口类型 WNDP ...

  2. 孙鑫VC++学习笔记(转载至程序员之家--虎非龙)[11--15] .

    第11课 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型.添加LButtonDown和Up消息. 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据.为此创建一个新类来记录绘画类型 ...

  3. 孙鑫VC++学习笔记(转载至程序员之家--虎非龙)[11--15]

    第11课 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型.添加LButtonDown和Up消息. 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据.为此创建一个新类来记录绘画类型 ...

  4. 孙鑫VC++LESSON1:Windows程序内部运行原理

    视频链接:https://www.bilibili.com/video/BV1Ts411f7fw/?spm_id_from=333.337.search-card.all.click&vd_s ...

  5. Windows程序内部运行原理

    Windows程序内部运行原理   为了理解Visual C++应用程序开发过程,先要理解Windows程序的运行机制.因为 Visual C++是 Windows 开发语言,需要明白在 Window ...

  6. Windows程序内部运行原理(2)

    Windows程序内部运行原理   为了理解Visual C++应用程序开发过程,先要理解Windows程序的运行机制.因为 Visual C++是 Windows 开发语言,需要明白在 Window ...

  7. VC++学习(1):Windows程序内部运行原理

    Windows应用程序,操作系统,计算机硬件之间的相互关系 关于API:向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需 ...

  8. 孙鑫VC学习笔记:第七讲

    七.对话框 2006年8月5日 14:25 因为笔记是用OneNote做的,上传以后为看不到图片,于是我截图放到相册上面, 相册地址为:http://photo.163.com/photos/good ...

  9. 【MFC】1.Windows程序内部运行原理

    1.原理与内容 Windows应用程序,操作系统,计算机硬件之间的相互关系: 向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声 ...

  10. 惯性导航系统学习笔记——第一讲

    惯性导航系统学习笔记 第一讲 惯性导航系统概述 一.惯性导航基本概念 二.惯性导航基本原理 三.惯性导航应用与发展 四.小结 第一讲 惯性导航系统概述 本文为学习朱家海教授<惯性导航系统> ...

最新文章

  1. 小雨坐地铁--[最短路分层建图+虚点]
  2. pandas 提取股票价格
  3. 巧用Graphviz和pvtrace等工具可视化C函数调用
  4. 连载:阿里巴巴大数据实践—数据开发平台
  5. 【数据结构与算法】之深入解析“实现strStr()”的求解思路与算法示例
  6. 自定义spring boot的自动配置
  7. 福布斯评选 8 位 AI 风云女性,李飞飞、Coursera 创始人在列
  8. mastercam后处理升级_Mastercam中文版后处理MPFan 有了它就可以自己修改后处理了 呵呵...
  9. android外接usb摄像头demo_手机USB接口有哪些功能 手机USB接口功能介绍【详解】
  10. 注意,GitHub发布重大更新,关系到所有程序员!
  11. 在 ML2 中配置 VXLAN - 每天5分钟玩转 OpenStack(110)
  12. HDFS的shell命令
  13. python模拟登录浏览器_Python爬虫常用之登录(二) 浏览器模拟登录
  14. 卖服务器销售打广告语句子,朋友圈销售广告语大全,创意广告语最能打动客户的句子!...
  15. 通过opencv制作人脸识别的窗口,这也太疯狂了
  16. Web前端期末大作业-农产品一体化平台网页设计(HTML+CSS+JS)
  17. 屏蔽微信分享到朋友圈等按钮
  18. T-SQL - 习题02_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式
  19. 百度地图 -- 离线地图开发
  20. 函数-function(函数的一般形式、命名、定义调用声明、函数的传递方式)

热门文章

  1. 如何给域里的每台电脑分配一个***远程访问IP地址
  2. 《精通LabVIEW虚拟仪器程序设计与案例实现》一2.6 VI的创建与编辑
  3. 在js中如何比较两个时间字符串的大小
  4. UVa 674 - Coin Change
  5. attention的前世今生
  6. [国家集训队]飞飞侠
  7. valgrind--CPP程序内存泄露检查工具
  8. java使用poi读取word(简单,简约,直观)
  9. iOS 获取设备的方向
  10. iOS应用架构谈 本地持久化方案及动态部署