VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 777|回复: 1

[交流] win32创建窗口

[复制链接]
39_avatar_middle
最佳答案
0 
online_vip 发表于 2022-12-30 10:31:59 | 显示全部楼层 |阅读模式
我用win32创建窗口,窗口处于死循环,点击X无效,不知什么原因,请大家指点
  1. #include <windows.h>
  2. #include<TCHAR.h>       //程序中使用了TCHAR类型,因此需要包含<TCHAR.h>
  3. HINSTANCE g_hInstance = 0;//当前程序的实例句柄

  4. static TCHAR szWindowClass[] = _T("WindowClass"); //窗口类名
  5. static TCHAR szTitle[] = _T("我的窗口程序");      //窗口标题


  6. // 2.定义窗口处理函数[自定义,用来处理消息的]
  7. LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
  8. //WndProc 是函数名,可以自定义
  9. ///参数1:窗口句柄
  10. //参数2:消息ID
  11. //参数3和参数4:是消息附加数据
  12. {

  13.     //7.消息处理

  14.     switch (msgID)
  15.     {
  16.    
  17.     case  WM_DESTROY://接到DispatchMessage()发来WM_DESTROY消息
  18.         PostQuitMessage(0);//通知系统进程中止退出
  19.     default:
  20.         return DefWindowProc(hWnd, msgID, wParam, lParam);//由系统默认处理的其它消息
  21.         break;
  22.     }
  23.    

  24. }


  25. //3.注册窗口类
  26. void Register(LPSTR lpClassName, WNDPROC wndProc)
  27. //Register函数名自定义
  28. // 参数1:窗口类名
  29. //参数2:窗口处理函数
  30. {
  31.     WNDCLASSEX wcs = { 0 };
  32.     //WNDCLASSEX成员很多,先赋值0;
  33.     //赋值0后,除下面必要的给成员赋值外,其余赋值0的均自动使用默认值。
  34.     wcs.cbSize = sizeof(WNDCLASSEX);  //因适应不同操作系统版本需要,必须如此赋值不能缺省

  35.     wcs.cbClsExtra = 0;//窗口类扩展数据缓冲区
  36.     //0   表示不需要缓冲区      4的整数倍
  37.     wcs.cbWndExtra = 0;    //窗口扩展数据缓冲区
  38.     //0   表示不需要缓冲区     4的整数倍
  39.     wcs.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);//指定窗口背景色-白色
  40.     //是画刷
  41.     wcs.hCursor = LoadCursor(NULL, IDC_ARROW);     //为所有基于该窗口类的窗口设定一个鼠标指针
  42.     //NULL表示使用系统默认鼠标指针
  43.     wcs.hIcon = NULL;     //为所有基于该窗口类的窗口设定一个图标
  44.     //NULL表示使用系统默认图标
  45.     wcs.hInstance = g_hInstance;    //当前程序的实例句柄
  46.     wcs.lpfnWndProc = wndProc;   //窗口处理函数(必须是回调函数)
  47.     //就是参数2     DefWindowProc系统默认处理函数
  48.     wcs.lpszClassName = lpClassName; //指定窗口类名
  49.     //就是参数1   
  50.     wcs.lpszMenuName = NULL;           //指定窗口菜单
  51.     //NULL表示没有菜单
  52.     wcs.style = CS_HREDRAW | CS_VREDRAW;  //指定窗口样式,各种样式可以使用按位或操作符组合起来
  53.     //看:https://www.cnblogs.com/liming19680104/p/17004922.html//

  54.     if (!RegisterClassEx(&wcs))  //注册窗口类
  55.         //如果函数成功,则返回值是窗口类型的标识号。如果函数失败,则返回值为0
  56.     {
  57.         MessageBox(NULL, _T("注册窗口失败"), _T("Caption"), NULL);
  58.     }

  59. }

  60. //4.创建窗口
  61. HWND CreateMain(LPSTR lpClassName, LPSTR lpWindowName)
  62. //参数1:窗口类名称
  63. //参数2:窗口标题栏字符串
  64. {
  65.     HWND hWnd = CreateWindow(lpClassName, lpWindowName, WS_OVERLAPPEDWINDOW, 100, 100, 700, 500, NULL, NULL, g_hInstance, NULL);//创建窗口
  66.     //参数1:窗口类名称
  67.     //参数2:窗口标题栏字符串
  68.     //参数3:窗口样式
  69.     //参数4和参数5:窗口坐标
  70.     //参数6和参数7:窗口宽和高
  71.     //参数8:父窗口句柄
  72.     //参数9:菜单句柄
  73.     //参数10:当前程序实例句柄
  74.     //参数11:附加数据,指向一个值的指针,该值传递给窗口 WM_CREATE 消息
  75.     //返回值:窗口句柄,失败返回NULL
  76.    
  77.     if (!hWnd)
  78.     {
  79.         MessageBox(NULL, _T("创建窗口失败"), _T("Tip"), NULL);
  80.         
  81.     }
  82.    
  83.     return hWnd;

  84. }


  85. //5.显示窗口
  86. void Display(HWND hWnd, int nCmdShow)
  87. //函数名自定义
  88. {
  89.     ShowWindow(hWnd, nCmdShow);
  90.     //参数1:窗口句柄
  91.     //参数2:显示方式

  92. }

  93. //6.消息循环
  94. int Message()
  95. {
  96.     MSG nMsg = { 0 };
  97.     BOOL bmsg = GetMessage(&nMsg, NULL, 0, 0);
  98.     //作用:GetMessage是从调用线程的消息队列里取得一个消息并将其放于指定的结构
  99.     //      此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息
  100.     //      GetMessage不接收属于其他线程或应用程序的消息
  101.     //      获取消息成功后,线程将从消息队列中删除该消息。函数会一直等待直到有消息到来才有返回值
  102.     //参数1:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息
  103.     //参数2:取得其消息的窗口的句柄(HWND)。
  104.     //       当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息
  105.     //       线程消息通过PostThreadMessage寄送给调用线程
  106.     //参数3:UINT wMsgFilterMin指定被检索的最小消息值的整数
  107.     //参数4:UINT wMsgFilteMax指定被检索的最大消息值的整数
  108.     //       如果参数3和参数4都为零,GetMessage获取所有可得的消息(即,无范围过滤)
  109.     //       常数 WM_KEYFIRST和WM_KEYAST可作为过滤值取得与键盘输入相关的所有消息
  110.     //       常数WM_MOUSEFIRST和WM_MOUSELST可用来接收所有的鼠标消息
  111.     //返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值;如果函数取得WM_QUIT消息,返回值是零
  112.     //        如果出现了错误,返回值是-1
  113.     //GetMessage不从队列里清除WM.PAINT消息。该消息将保留在队列里直到处理完毕
  114.     while (bmsg)
  115.     {
  116.         BOOL bt = TranslateMessage(&nMsg);
  117.         //作用:函数功能:该函数将虚拟键消息(快捷键消息)转换为字符消息。
  118.         //参数:指向含有消息的MSG结构的指针,该结构里含有用函数GetMessage或PeekMessage从调用线程的消息队列里取得的消息信息
  119.         // 返回值:如果消息被转换(即字符消息被寄送到调用线程的消息队列里),返回非零值。
  120.         //         如果消息是WM_kEYDOWN,WM_KEYUP WM_SYSKEYDOWN或WM_SYSKEYUP,返回非零值,不考虑转换。
  121.         //         如果消息没被转换(即字符消息没被寄送到调用线程的消息队列里),返回值是零。
  122.         //说明:由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。
  123.         //     字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,
  124.         //     系统将产生WM_KEYDOWN和WM_KEYUP消息。这两个消息的附加参数( wParam和 lParam)包含的是 虚拟键代码和扫描码等信息,
  125.         //    而我们在程序中往往需要得到某个字符的ASCII码,TranslateMessage这个函数就可以将WM_KEYDOWN和WM_ KEYUP消息的组合
  126.         //    转换为一条WM_CHAR消息(该消息的wParam附加参数包含了字符的ASCII码),并将转换后的新消息投递到调用线程的消息队列中
  127.         //   注意,TranslateMessage函数并不会修改原有的消息,它只是产生新的消息并投递到消息队列中。
  128.         //   也就是说TranslateMessage会发现消息里是否有字符键的消息,如果有字符键的消息,就会产生WM_CHAR消息,如果没有就不会产生什么消息
  129.         //备注:WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR或WM_DEADCHAR消息
  130.         //      WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个WM_SYSCHAR或 WM_SYSDEADCHAR消息
  131.         //      TranslateMessage为那些由键盘驱动器映射为ASCll字符的键产生WM_CHAR消息
  132.         //      如果应用程序为其他用途处理虚拟键消息,不应调用TranslateMessage。例如,如果调用TranslateAccelerator返回一个非零值,应用程序不应调用TranslateMessage
  133.         //      TranslateMessage只能用于转换调用GetMessage或PeekMessage接收的消息


  134.         LONG nlong = DispatchMessage(&nMsg);
  135.         //函数功能:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得或者TranslateMessage函数传递的
  136.         //          它根据msg结构中的hWnd窗口句柄成员找到相应的窗口类 ,然后根据注册窗口时wndclass类结构找到相应的窗口函数WndPorc()。由消息传递函数将消息传递给窗口函数WndPorc()进行消息处理
  137.         //参数:指向含有消息的MSG结构的指针
  138.         //返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略


  139.     }

  140.     return (int)nMsg.wParam;//通常是一个与消息有关的常量值,也可能是窗口或控件的句柄

  141. }

  142. // 1.定义WinMain函数
  143. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIns, LPSTR lpCmdLine, int nCmdShow)
  144. //参数1:当前程序实例句柄
  145. //参数2:前一个程序的实例句柄
  146. //参数3:命令行字符串
  147. //参数4:显示方式
  148. //CALLBACK是回调函数的意思,有系统调佣
  149. {
  150.     g_hInstance = hInstance;

  151.     Register(szWindowClass, WndProc); //调用注册函数
  152.     //参数1:窗口类名--自定义
  153.     HWND hWnd = CreateMain(szWindowClass, szTitle);  //调用创建窗口函数

  154.     Display(hWnd, nCmdShow); //调用显示窗口函数
  155.     Message();  //调用消息循环函数


  156.     return 0;

  157. }
复制代码




上一篇:旋转3d图形,保持编辑框焦点
53_avatar_middle
最佳答案
0 
在线会员 发表于 2023-1-5 08:34:43 | 显示全部楼层
窗口过程在处理消息时,必须返回0。窗口过程不予处理的所有消息应该被传给名为DefWindowProc的Windows函数。从DefWindowProc返回的值必须由窗口过程返回。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-2-6 07:22

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表