当前位置:   article > 正文

VS2017+Windows底层窗口的实现——“代码运行正确,但是无窗口”显示问题解决汇总_vs中代码正确但是运行不了

vs中代码正确但是运行不了

博主是根据B站“黑马程序员MFC教程(已完结)”(黑马程序员MFC教程(已完结)_哔哩哔哩_bilibili)进行Windows底层窗口的实现的学习。在学习过程中遇到了“代码运行正确,但是无窗口显示”的问题,下面对产生的原因和解决方法进行了一个汇总。

(作为编程刚刚入门的小白,如果写的内容有错误,欢迎大家的批评指正,一起学习!)

目录

1、wc.lpfnWndProc = WindowProc前被//注释了

2、创建的工程不是Win32项目

3、代码是否错误

补充:出现一下框框马上闪退现象

完整代码

参考文献:


1、wc.lpfnWndProc = WindowProc前被//注释了

  1. //1、设计窗口
  2. WNDCLASS wc;
  3. wc.cbClsExtra = 0; //类的额外的内存
  4. wc.cbWndExtra = 0; //窗口额外的内存
  5. wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景
  6. wc.hCursor = LoadCursor(NULL, IDC_HAND); //设置光标,第一个为NULL,代表使用系统提供的光标
  7. wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标
  8. wc.hInstance = hInstance; //应用程序实例句柄 传入WinMain形参即可
  9. //wc.lpfnWndProc = WindowProc; //回调函数 窗口过程
  10. wc.lpszClassName = TEXT("win"); //指定窗口类名称
  11. wc.lpszMenuName = NULL; //菜单名称
  12. wc.style = 0; //风格显示 0代表默认

解决:

将里面前的//符号删去,改成

	wc.lpfnWndProc = WindowProc; //回调函数 窗口过程

2、创建的工程不是Win32项目

关于win32 控制台应用程序、win32 项目、mfc项目、空项目的区别,大家可以参考这篇文章——(1条消息) 说说win32 控制台应用程序、win32 项目、mfc项目、空项目那些事儿_sl850216662的博客-CSDN博客_win32项目

因为两大类的区别主要是定义的宏不一样,win32 项目和mfc的为WINDOWS,win32控制台的为CONSOLE。

解决:

打开项目-属性-连接器-系统-子系统中的控制台(/SUBSYSTEM:CONSOLE改成)改成窗口(/SUBSYSTEM:WINDOWS)。

3、代码是否错误

我本来以为代码运行没问题,应该代码不会有什么问题了,最后逐条比对发现,我显示    ShowWindow里面的参数有一个复制错误了,所有才没有显示出窗口,所以大家一定要细心呀!

  1. //4、显示和更新
  2. ShowWindow(hwnd, WS_OVERLAPPEDWINDOW);
  3. UpdateWindow(hwnd);

解决:

将ShowWindow(hwnd, WS_OVERLAPPEDWINDOW);改成

	ShowWindow(hwnd, SW_SHOWNORMAL);

补充:出现一下框框马上闪退现象

可能也是代码出现错误,可以检查一下5、通过循环取消息这个部分的代码是否错误了,最有可能出错的就是这行代码写错了。

		if (GetMessage(&msg, NULL, 0, 0) == FALSE) 

完整代码

完整代码如下:

  1. #include<windows.h>
  2. LRESULT CALLBACK WindowProc(
  3. HWND hwnd, //消息所属窗口
  4. UINT uMsg, //具体消息名称
  5. WPARAM wParam, //键盘附加消息
  6. LPARAM lParam //鼠标附加消息
  7. )
  8. {
  9. switch (uMsg) {
  10. case WM_CLOSE:
  11. DestroyWindow(hwnd);//DestroyWindow发送另外一个消息WM_DESTROY
  12. break;
  13. case WM_DESTROY:
  14. PostQuitMessage(0);
  15. break;
  16. case WM_LBUTTONDOWN: //鼠标左键按下
  17. {
  18. int xPos = LOWORD(lParam);
  19. int yPos = HIWORD(lParam);
  20. char buf[1024];
  21. wsprintf(buf, TEXT("x=%d,y=%d"), xPos, yPos);
  22. MessageBox(hwnd, buf, TEXT("鼠标左键按下"),MB_OK);
  23. break;
  24. }
  25. case WM_KEYDOWN://键盘
  26. MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);
  27. break;
  28. case WM_PAINT:
  29. {
  30. PAINTSTRUCT ps;
  31. HDC hdc = BeginPaint(hwnd, &ps);
  32. TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));
  33. EndPaint(hwnd, &ps);
  34. break;
  35. }
  36. }
  37. return DefWindowProc(hwnd, uMsg, wParam, lParam);
  38. }
  39. //WINAPI代表 __stdcall 参数的传递顺序:从右到左,依次入栈,并在返回前,清空栈
  40. int WINAPI WinMain(
  41. HINSTANCE hInstance, //应用程序的实例句柄
  42. HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32环境下,参数一般NULL,不起作用
  43. LPSTR lpCmdLine, //char *argv[]
  44. int nShowCmd) //显示命令
  45. {
  46. //1、设计窗口
  47. //2、注册窗口
  48. //3、创建窗口
  49. //4、显示和更新
  50. //5、通过循环取消息
  51. //6、处理消息(窗口过程)
  52. //1、设计窗口
  53. WNDCLASS wc;
  54. wc.cbClsExtra = 0; //类的额外的内存
  55. wc.cbWndExtra = 0; //窗口额外的内存
  56. wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景
  57. wc.hCursor = LoadCursor(NULL, IDC_HAND); //设置光标,第一个为NULL,代表使用系统提供的光标
  58. wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标
  59. wc.hInstance = hInstance; //应用程序实例句柄 传入WinMain形参即可
  60. wc.lpfnWndProc = WindowProc; //回调函数 窗口过程
  61. wc.lpszClassName = TEXT("win"); //指定窗口类名称
  62. wc.lpszMenuName = NULL; //菜单名称
  63. wc.style = 0; //风格显示 0代表默认
  64. //2、注册窗口
  65. RegisterClass(&wc);
  66. //3、创建窗口
  67. /*
  68. lpClassName, 类名
  69. lpWindowName, 标题名
  70. dwStyle, WS_OVERLAPPEWINDOW风格
  71. x, 显示坐标
  72. y,
  73. nWidth, 框高
  74. nHeight,
  75. hWndParent, 父窗口 NULL
  76. hMenu, 菜单
  77. hInstance, 实例句柄
  78. lpParam 附加值 鼠标附加值
  79. */
  80. HWND hwnd=CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
  81. //4、显示和更新
  82. ShowWindow(hwnd, SW_SHOWNORMAL);
  83. UpdateWindow(hwnd);
  84. //5、通过循环取消息
  85. /*
  86. HWND hwnd; 主窗口
  87. UINT message; 具体消息名称
  88. WPARAM wParam; 附加消息 键盘
  89. LPARAM lParam; 附加消息 鼠标
  90. DWORD time; 消息产生时间
  91. POINT pt; 附加消息 鼠标信息 x,y
  92. */
  93. MSG msg;
  94. while (1)
  95. {
  96. /*
  97. _Out_ LPMSG lpMsg, 封装好的消息,p指针
  98. _In_opt_ HWND hWnd, 捕获窗口,NULL捕获所有窗口
  99. _In_ UINT wMsgFilterMin, 最小和最大过滤消息 一般0,捕获所有窗口
  100. _In_ UINT wMsgFilterMax 捕获所有消息
  101. */
  102. if (GetMessage(&msg, NULL, 0, 0) == FALSE) {
  103. break;
  104. }
  105. //翻译消息
  106. TranslateMessage(&msg);
  107. //不为FALSE
  108. //分发消息
  109. DispatchMessage(&msg);
  110. }
  111. //6、处理消息(窗口过程)
  112. return 0;
  113. }

结果显示:

参考文献:

(1条消息) Windows底层窗口的实现———学习笔记_miaoxiaocheng的博客-CSDN博客_windows底层

黑马程序员MFC教程(已完结)_哔哩哔哩_bilibili

(1条消息) 说说win32 控制台应用程序、win32 项目、mfc项目、空项目那些事儿_sl850216662的博客-CSDN博客_win32项目

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/160905
推荐阅读
相关标签
  

闽ICP备14008679号