Win32程序设计基础

  1. /************************************************************************/
  2. /*                       Win32程序设计基础                              */
  3. /************************************************************************/
  4. /************************************************************************/
  5. /* Win32程序的注释,虽然很简单,但是这是Win32程序设计的起步,所以详细些 */
  6. /************************************************************************/
  7. /************************************************************************/
  8. /* 导入包含文件WINDOWS.H,此文件包含了其它的Windows头文件                */
  9. /* WINDEF.H   基本类型定义                                              */
  10. /* WINNT.H    支持Unicode的类型定义                                     */
  11. /* WINBASE.H  内核函数                                                  */
  12. /* WINUSER.H  用户接口函数                                              */
  13. /* WINGDI.H   图形设备接口函数                                          */
  14. /************************************************************************/
  15. #include <windows.h>
  16. /************************************************************************/
  17. /* 窗口对象的过程处理函数                                               */
  18. /* LRESULT: 简单定义为LONG(long)                                       */
  19. /* CALLBACK:__stdcall,指在Windows本身和用户的应用程序之间发生的函数调 */
  20. /*           用的特殊调用序列。                                         */
  21. /* HWND:    窗口句柄,32位数字,该参数为接受消息的窗口的句柄,          */
  22. /*           CreateWindow函数的返回值。                                 */
  23. /* UINT:    unsigned int 无符号整型32位,                              */
  24. /*           该参数为MSG结构中的message域相同,表示该消息的数字         */
  25. /* WPARAM:  UINT,32位消息参数                                         */
  26. /* LPARAM:  LONG,32位消息参数                                         */
  27. /************************************************************************/
  28. LRESULT CALLBACK WndProc(HWNDUINTWPARAMLPARAM);
  29. /************************************************************************/
  30. /* Windows应用程序的主函数,有四个参数,名称固定为WinMain,返回值为int  */
  31. /* WINAPI 在WINDEF.H中定义,#define WINAPI __stdcall                    */
  32. /* HINSTANCE:实例句柄,数字                                             */
  33. /* 在32位系统中WinMain的第二个参数总为NULL(定义为0)                     */
  34. /* 第三个参数用于运行程序的命令行,                                     */
  35. /* 某些Windows应用程序使用这个参数在程序启动时将文件加载到内存          */
  36. /* LPSTR/PSTR:指向字符串的指针,相当于 char *                          */
  37. /* 第四个参数指出程序最初显示的方式,正常,最大化,最小化等。           */
  38. /************************************************************************/
  39. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCEPSTR lpszCmdLine, int iCmdShow)
  40. {
  41.  /************************************************************************/
  42.  /* 定义窗口类                                                           */
  43.  /* TCHAR:char                                                          */
  44.  /* _T和TEXT宏,功能一致,通常没用,在Unicode系统中,                    */
  45.  /* 自动把后面的字符串转换为宽字符串                                     */
  46.  /************************************************************************/
  47.  TCHAR tcClassName[] = TEXT("My Window");  //窗口类名字符串
  48.  /************************************************************************/
  49.  /* WNDCLASS:窗口类结构,定义了窗口的一般特性,可以创建不同的窗口       */
  50.  /* typedef struct                                                       */
  51.  /* {                                                                    */
  52.  /*      UINT        style ;                                             */
  53.  /*      WNDPROC     lpfnWndProc ;                                       */
  54.  /*      int         cbClsExtra ;                                        */
  55.  /*      int         cbWndExtra ;                                        */
  56.  /*      HINSTANCE   hInstance ;                                         */
  57.  /*      HICON       hIcon ;                                             */
  58.  /*      HCURSOR     hCursor ;                                           */
  59.  /*      HBRUSH      hbrBackground ;                                     */
  60.  /*      LPCTSTR     lpszMenuName ;                                      */
  61.  /*      LPCTSTR     lpszClassName ;                                     */
  62.  /* }                                                                    */
  63.  /* WNDCLASS, * PWNDCLASS ;                                              */
  64.  /************************************************************************/
  65.  WNDCLASS wc;                      //窗口类属性描述结构
  66.  wc.lpszClassName = tcClassName;   //窗口类名
  67.  wc.lpszMenuName  = NULL;          //窗口类菜单资源名
  68.  wc.lpfnWndProc   = WndProc;       //窗口对象的过程处理函数,指向函数的指针
  69.  wc.hInstance     = hInstance;     //当前进程对象句柄,接收于WinMain参数
  70.  wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //窗口背景刷子对象
  71.  wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);     //图标对象
  72.  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);         //光标对象
  73.  wc.cbClsExtra    = 0;             //同类窗口对象公共数据区大小
  74.  wc.cbWndExtra    = 0;             //当前窗口对象私有数据区大小
  75.  wc.style         = CS_HREDRAW | CS_VREDRAW; //窗口类风格,水平或垂直尺寸改变后刷新
  76.  if (!RegisterClass(&wc))          //注册窗口类,参数为指向WNDCLASS结构的指针
  77.  {
  78.   /************************************************************************/
  79.   /* 窗口类注册不成功的错误信息                                           */
  80.   /* MessageBox 消息框                                                    */
  81.   /* 参数一:窗口句柄,如果没有则为NULL                                   */
  82.   /* 参数二:消息框主体显示的字符串                                       */
  83.   /* 参数三:消息框标题栏上的字符串                                       */
  84.   /* 参数四:winuser.h中定义的MB_开始的常数组合,消息框风格:按钮,图标    */
  85.   /*      为0,则只有ok按钮                                            */
  86.   /* 返回值:返回IDOK(1)。                                                */
  87.   /* 还可以返回IDYES、IDNO、IDCANCEL、IDABORT、IDRETRY、IDIGNORE等        */
  88.   /************************************************************************/
  89.   MessageBox(NULL, TEXT("RegisterClassError!"), TEXT("Error"), MB_ICONERROR);
  90.   return 0;                        //如果注册失败,返回并终止程序
  91.  }
  92.  /************************************************************************/
  93.  /* 定义窗口对象属性,指定有关窗口的更详细信息                           */
  94.  /************************************************************************/
  95.  TCHAR tcWindowCaptionName[] = TEXT("Win32 API"); //窗口对象标题名称
  96.  CREATESTRUCT cs;                  //窗口对象属性描述结构,定义在WINUSER.H
  97.  cs.lpszClass      = tcClassName;  //窗口类名
  98.  cs.lpszName       = tcWindowCaptionName; //窗口对象标题名称,显示在标题栏
  99.  cs.style          = WS_OVERLAPPEDWINDOW; //窗口对象风格
  100.  cs.x              = 100;          //窗口对象在屏幕上的x坐标
  101.  cs.y              = 100;          //窗口对象在屏幕上的y坐标
  102.  cs.cx             = 400;          //窗口对象的宽度
  103.  cs.cy             = 300;          //窗口对象的高度
  104.  cs.hwndParent     = NULL;         //窗口对象的父窗口句柄
  105.  cs.hMenu          = NULL;         //窗口对象的菜单句柄或子窗口编号
  106.  cs.hInstance      = hInstance;    //当前进程的实例句柄,WinMain参数
  107.  cs.lpCreateParams = NULL;         //创建参数指针,可以访问以后想要引用的程序中的数据
  108.  /************************************************************************/
  109.  /* 创建窗口对象                                                         */
  110.  /* 定义窗口句柄hWnd,值为CreateWindows函数的返回值。                    */
  111.  /* 即创建成功返回窗口的句柄,否则返回NULL                               */
  112.  /************************************************************************/
  113.  HWND hWnd = CreateWindow( cs.lpszClass,
  114.       cs.lpszName,
  115.       cs.style,
  116.       cs.x,
  117.       cs.y,
  118.       cs.cx,
  119.       cs.cy,
  120.       cs.hwndParent,
  121.       cs.hMenu,
  122.       cs.hInstance,
  123.       cs.lpCreateParams);
  124.  if (hWnd == NULL)    //判断创建是否成功
  125.  {
  126.   /************************************************************************/
  127.   /* 窗口对象创建不成功的错误提示                                         */
  128.   /************************************************************************/
  129.   MessageBox(NULL, TEXT("CreateWindowError!"), TEXT("Error!"),MB_ICONERROR);
  130.   return 0;
  131.  }
  132.  /************************************************************************/
  133.  /* 显示窗口对象                                                         */
  134.  /* 此时Windows内部已经创建了这个窗口。已经分配内存。                    */
  135.  /* 但是要显示在显示器上还需要调用两个函数。                             */
  136.  /* ShowWindows(hwnd,iCmdShow)                                           */
  137.  /* 第一个参数是刚刚用CreateWindow创建的窗口的句柄。                     */
  138.  /* 第二个参数是传给WinMain的iCmdShow。用来确定最初如何在屏幕上显示窗口。*/
  139.  /* 也可以自定义选择以选项:                                             */
  140.  /* SW_SHOWNORMAL      //常规                                            */
  141.  /* SW_SHOWMAXIMIZED   //最大化                                          */
  142.  /* SW_SHOWMINNOACTIVE //只显示在任务栏                                  */
  143.  /* UpdateWindow(hWnd)                                                   */
  144.  /* 导致客户区域被绘制。通过给窗口过程(Wndproc)发送一个WM_PAINT消息实现  */
  145.  /************************************************************************/
  146.  ShowWindow(hWnd, iCmdShow);
  147.  UpdateWindow(hWnd);//立即刷新窗口对象
  148.  /************************************************************************/
  149.  /* 消息检索,消息循环                                                   */
  150.  /* MSG:消息结构,被定义在WINUSER.H                                     */
  151.  /* 消息循环以GetMessage调用开始,它从消息队列中取出一个消息             */
  152.  /* 这一调用传递给Windows一个指向msg的MSG结构指针。                      */
  153.  /* 第二、三、四个参数为NULL或者0表示程序接收自己创建的所有窗口的所有消息*/
  154.  /* Windows用从消息队列中取出的下一个消息填充msg结构的各个域             */
  155.  /* MSG:消息结构:                                                      */
  156.  /* typedef struct tagMSG                                                */
  157.  /* {                                                                    */
  158.  /*   HWND   hwnd ;    //消息发向的窗口的句柄。                          */
  159.  /*   UINT   message ; //消息标识符,一个数值,定义在Window头文件中      */
  160.  /*   WPARAM wParam ;  //一个32位的消息参数,含义根据消息不同而不同      */
  161.  /*   LPARAM lParam ;  //同上                                            */
  162.  /*   DWORD  time ;    //消息放入消息队列时的时间                        */
  163.  /*   POINT  pt ;      //消息放入消息队列时的鼠标坐标                    */
  164.  /* }                                                                    */
  165.  /* MSG, * PMSG ;      //结构名                                          */
  166.  /************************************************************************/
  167.  MSG msg;
  168.  while (GetMessage(&msg, NULL, 0, 0))
  169.  {
  170.   /************************************************************************/
  171.   /* 检索消息;当检索到WM_QUIT(其值为0x0012)消息时,从消息循环中退出      */
  172.   /************************************************************************/
  173.   TranslateMessage(&msg);//将msg结构传递给Windows,进行虚拟键盘消息的转换
  174.   DispatchMessage(&msg); //发送消息,由此操作系统调用相应的窗口过程处理消息
  175.  }
  176.  /************************************************************************/
  177.  /* 主窗口返回                                                           */
  178.  /************************************************************************/
  179.  return msg.wParam;
  180. }
  181. /************************************************************************/
  182. /* 窗口对象的过程处理函数                                               */
  183. /* 四个参数与MSG结构中的前四个参数相同。                                */
  184. /* 程序通常不直接调用窗口过程,由Windows本身调用。                      */
  185. /* 程序可以通过SendMessage函数调用自己的窗口过程                        */
  186. /************************************************************************/
  187. LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
  188. {
  189.  /************************************************************************/
  190.  /* 对消息进行分类处理                                                   */
  191.  /* WINUSER.H为每个消息定义以WM为前缀的标识符                            */
  192.  /*一般Windows程序元用switch和case结构来处理,此时必须返回0。            */
  193.  /*窗口过程不处理的其它消息必须传递给DefWindowProc函数,                 */
  194.  /*窗口过程返回该函数返回值                                              */
  195.  /************************************************************************/
  196.  switch (iMsg)
  197.  {
  198.   /************************************************************************/
  199.   /* 客户区的绘制消息,窗口客户区域无效时刷新                             */
  200.   /************************************************************************/
  201.   case WM_PAINT:
  202.   {
  203.    /************************************************************************/
  204.    /* PAINTSTRUCT:绘图结构,定义在WINUSER.H中                             */
  205.    /* RECT:矩形结构                                                       */
  206.    /* HDC:设备描述表句柄                                                  */
  207.    /************************************************************************/
  208.    PAINTSTRUCT ps;
  209.    HDC hDC;
  210.    RECT rect;
  211.    /************************************************************************/
  212.    /* 对于WM_PAINT的处理几乎总是从一个BeginPaint函数开始的:               */
  213.    /* hDC = BeginPaint(hWnd, &ps)                                          */
  214.    /* 而已一个EndPaint函数结束                                             */
  215.    /* EndPaint(hWnd, &ps)                                                  */
  216.    /* 两个调用中第一个参数是程序的窗口句柄,                               */
  217.    /* 第二个参数是指向类型为PAINTSTRUCT的结构指针                          */
  218.    /************************************************************************/
  219.    hDC = BeginPaint(hWnd, &ps);       //获取显示设备对象及绘制描述属性
  220.    GetClientRect(hWnd, &rect);        //获取当前窗口对象客户区矩形
  221.    SetBkMode(hDC,TRANSPARENT);        //设置背景方式
  222.    SetTextColor(hDC, RGB(255, 0, 0)); //设置文本颜色
  223.    /************************************************************************/
  224.    /* 绘制文本                                                             */
  225.    /* DrawText函数,第一个参数是从BeginPaint返回的设备描述表句柄           */
  226.    /* 第二个参数是要输出的文本                                             */
  227.    /* 第三个参数是-1,表示文本串是以字节0终结的。                          */
  228.    /* 第四个参数要绘制的矩形区域                                           */
  229.    /* 最后一个参数是系列标志位,定义在WINDUSER.H中,水平、垂直中央,单行   */
  230.    /************************************************************************/
  231.    DrawText(hDC, TEXT("Hello, Win32!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  232.    EndPaint(hWnd, &ps);               //客户区绘制结束,归还显示设备对象
  233.    return 0;
  234.   }
  235.   case WM_DESTROY:                    //接收到WM_DEFTROY消息
  236.   {
  237.    /************************************************************************/
  238.    /* 发送WM_QUIT消息,通知线程消息检索循环,清除窗口主程序可以退出        */
  239.    /* PostQuitMessage(0)函数在消息队列里插入一个WM_QUIT消息                */
  240.    /************************************************************************/
  241.    PostQuitMessage(0);
  242.    return 0;
  243.   }
  244.  }
  245.  /************************************************************************/
  246.  /* 程序末处理的消息交给window系统的缺省窗口对象的过程处理函数处理       */
  247.  /************************************************************************/
  248.  return DefWindowProc(hWnd, iMsg, wParam,lParam);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值