使用背景

利用VS创建空项目,使用WinMain入口构建代码创建一个win32窗口时,运行老是不显示窗口,调试发现程序在CreateWindow时老是产生失败结果:

就是上图,_hWnd获取CreateWindow的结果,这里结果一直为空

问题原因

检查代码发现在WndProc中有一处问题

红色圈起来的地方,比较运算写错了(失误讨打)
谨以此问题告诫所有在踏入程序海洋的同胞

下面附上完整代码
代码引用自:《深入浅出MFC(侯捷)》
Generic.h

#ifndef _INCLUDE_WIN32_MLTTHRDPRIORITY_H
#define _INCLUDE_WIN32_MLTTHRDPRIORITY_HBOOL InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);LONG OnAbout(HWND, UINT, WPARAM, LPARAM);LONG OnCommand(HWND, UINT, WPARAM, LPARAM);
LONG OnExit(HWND, UINT, WPARAM, LPARAM);
LONG OnDestroy(HWND, UINT, WPARAM, LPARAM);LONG OnResume(HWND, UINT, WPARAM, LPARAM);#endif //_INCLUDE_WIN32_MLTTHRDPRIORITY_H

Generic.c

#include <windows.h>
#include "Generic.h"
#include "resource.h"HINSTANCE _hInst;    //应用程序句柄
HWND _hWnd;         //窗口句柄char _szAppName[] = "Generic";     //应用程序类名
char _szTitle[] = "Sample of Generic(MultiThread)";  //应用程序标题名//消息与方法结构
struct MSGMAP_ENTRY{UINT nMessage;      //消息(数据)LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);    //指向执行消息的函数指针(处理数据的方法)
};
#define dim(x) (sizeof(x)/sizeof(x[0]))         //声明获取消息映射入口的尺寸//模拟消息映射(防MFC)
struct MSGMAP_ENTRY _messageEntries[] = {WM_COMMAND, OnCommand,WM_DESTROY, OnDestroy,
};//消息映射(WM_COMMAND)
struct MSGMAP_ENTRY _commandEntries[] = {IDM_ABOUT, OnAbout,IDM_EXIT, OnExit,IDM_RESUME, OnResume,
};HANDLE _hThread[5];       //全局变量_线程句柄数组int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{MSG msg;UNREFERENCED_PARAMETER(lpCmdLine);     //(不考虑临界参数)避免编译时的警告if (!hPrevInstance)if (!InitApplication(hInstance))return 0;if (!InitInstance(hInstance, nCmdShow))return 0;while(TRUE){if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){if (msg.message == WM_QUIT)break;TranslateMessage(&msg);DispatchMessage(&msg);}}return 0;
}BOOL InitApplication(HINSTANCE hInstance)
{WNDCLASS wc;wc.style = CS_HREDRAW | CS_VREDRAW;   //窗口样式wc.lpfnWndProc = (WNDPROC)WndProc;wc.cbClsExtra = 0;        //窗口类无扩展wc.cbWndExtra = 0;     //窗口无扩展wc.hInstance = hInstance;   //窗口依赖的应用程序句柄wc.hIcon = LoadIcon(hInstance, "Cheng");    //窗口图标wc.hCursor = LoadCursor(NULL, IDC_ARROW);    //窗口光标wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  //窗口画刷wc.lpszMenuName = "GenericMenu";       //窗口菜单资源名wc.lpszClassName = _szAppName;            //窗口类名return (RegisterClass(&wc));
}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{_hInst = hInstance;_hWnd = CreateWindow(_szAppName, _szTitle, //窗口类名(必需与注册类名保持一致)和标题WS_OVERLAPPEDWINDOW, //窗口风格(重叠窗口)CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, //窗口位置和尺寸NULL, NULL,    //无父窗口,无菜单hInstance,    //窗口依赖的应用程序句柄NULL       //预留);if (!_hWnd){return FALSE;}ShowWindow(_hWnd, nCmdShow);        //显示窗口UpdateWindow(_hWnd);  //绘制用户区,发送WM_PAINT消息return TRUE;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT nMessage, WPARAM  wParam, LPARAM lParam)
{int i;for (i = 0; i < dim(_messageEntries); i++){if (nMessage == _messageEntries[i].nMessage){return ((*_messageEntries[i].pfn)(hWnd, nMessage, wParam, lParam));}}return (DefWindowProc(hWnd, nMessage, wParam, lParam));
}LRESULT CALLBACK About(HWND hDlg, UINT nMessage, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER(lParam);        //(不考虑临界参数)避免编译时的警告switch(nMessage){case WM_INITDIALOG:return (TRUE);       //TRUE 表示处理了这个消息break;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, TRUE);  //关闭对话框return (TRUE);   //TRUE 表示处理了这个消息}break;}return (FALSE);     //表示没有处理这个消息
}LONG OnCommand(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{int i;for (i = 0; i < dim(_commandEntries); i++){if (LOWORD(wParam) == _commandEntries[i].nMessage){return ((*_commandEntries[i].pfn)(hWnd, nMessage, wParam, lParam));}}return DefWindowProc(hWnd, nMessage, wParam, lParam);
}
//
LONG OnAbout(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{DialogBox(_hInst,  //对话框依赖的应用程序句柄"AboutBox",     //对话框资源名hWnd,           //对话框父窗口句柄(DLGPROC)About    //对话框函数);return (TRUE);
}LONG OnExit(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{DestroyWindow(hWnd);return 0;
}LONG OnDestroy(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{PostQuitMessage(0);return 0;
}LONG OnResume(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{return 0;
}

resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Generic.rc#define    IDM_NEW 25001
#define IDM_OPEN    25002
#define IDM_SAVE    25003
#define IDM_SAVEAS  25004
#define IDM_PRINT   25005
#define IDM_PRINTSETUP 25006
#define IDM_EXIT 25007
#define IDM_UNDO    25008
#define IDM_CUT 25009
#define IDM_COPY    25010
#define IDM_PASTE   25011
#define IDM_LINK    25012
#define IDM_LINKS   25013
#define IDM_HELPCONTENTS 25014
#define IDM_HELPSEARCH 25015
#define IDM_HELPHELP 25016
#define IDM_ABOUT 25017
#define IDM_RESUME  25018
#define IDM_DELETE  25019// 新对象的下一组默认值
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        101
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

Generic.rc

#include "resource.h"
Cheng ICON DISCARDABLE "Cheng.ico"GenericMenu MENU DISCARDABLE
BEGINPOPUP "系统(&T)"BEGINMENUITEM "退出(&X)"   IDM_EXITENDPOPUP "文件(&F)"BEGINMENUITEM "新建(&N)" IDM_NEWMENUITEM "打开(&O)"  IDM_OPENMENUITEM "保存(&S)" IDM_SAVEMENUITEM "另存为(&A)"    IDM_SAVEASMENUITEM SEPARATORMENUITEM "打印(&P)" IDM_PRINTMENUITEM "打印设置(&R)"  IDM_PRINTSETUPENDPOPUP "编辑(&E)"BEGINMENUITEM "撤销(&Z\tCtrl+Z)"  IDM_UNDOMENUITEM SEPARATORMENUITEM "剪切(&t\tCtrl+X)"  IDM_CUTMENUITEM "复制(&C\tCtrl+C)" IDM_COPYMENUITEM "粘贴(&V\tCtrl+V)"    IDM_PASTEMENUITEM "删除(&D)"    IDM_DELETEENDPOPUP "操作(&P)"BEGINMENUITEM "启动(&R)"   IDM_RESUMEENDPOPUP "帮助(&H)"BEGINMENUITEM "关于(&B)"   IDM_ABOUTEND
END

win32窗口问题-CreateWindow创建窗口一直失败相关推荐

  1. 导致CreateWindow创建窗口失败的一种原因

    导语:在封装一个基本的Frame显示窗口时遇到CreateWindow函数调用成功,但是窗口总是不显示. CreateWindow返回NULL,GetLastError()返回0 经过网上搜集资料和单 ...

  2. win32 api CreateWindow创建窗口控件及设置字体

    HWND hBtn, hEdit, hText, hCombBox; hBtn = CreateWindow( //按钮创建 "button", "创建的按钮" ...

  3. 【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )

    文章目录 一.导入头文件 二.桌面程序入口函数 三.注册窗口 四.创建窗口 五.显示窗口 六.完整代码示例 七.相关资源 基于 [OpenGL]一.Visual Studio 2019 创建 Wind ...

  4. idl结果显示窗口如何缩小_科学网—IDL 创建窗口 - 钱磊的博文

    一直以来我都觉得写程序创建一个窗口,添加些按钮,显示些会变化的文字是十分神奇的事.但是又懒又笨,一直没学会.最近开始考虑做一个观测模拟系统,模拟一个射电天文望远镜的控制界面.这种东西每个望远镜都由,估 ...

  5. OpenGL-glut创建窗口

    环境:win10 库:OpenGL gult库 创建单个窗口 OpenGL在创建窗口前,先进行窗口的初始化,并可以设置窗口的模式.窗口的位置.窗口的尺寸大小 int main(int argc, ch ...

  6. win32创建窗口及其消息循环

    转自:http://anyzixin.blog.163.com/blog/static/365289122007103031657355/ http://anyzixin.blog.163.com/b ...

  7. 【转】win32 的DLL中创建windows窗口

    转自:https://blog.51cto.com/wangyw/1071967 因工作需求,需要写一个DLL,并在其中创建windows窗口,网上有很多关于DLL创建窗口的文章,不过都是基于MFC的 ...

  8. CreateWindow() -- 创建普通的窗口

    (1)函数原型 1 HWND CreateWindow( 2 LPCTSTR lpClassName, //pointer to register class name 3 LPCTSTR lpWin ...

  9. win32消息处理和创建窗口

    文章目录 0.说明 1.win32事件和消息 2.系统处理消息 3.win32创建窗口和消息处理 4.源代码 0.说明 观看滴水逆向视频总结(部分截图来自于滴水课件) 编译器:vc++6.0 编写语言 ...

最新文章

  1. 骚操作 | 不重启 JVM,替换掉已经加载的类,偷天换日?
  2. 205页PPT,看5G+AI引领的下一个时代!
  3. 批量镜像locator(比如表情模板)
  4. OpenCV | OpenCv常用函数(代码类)
  5. linux下source命令使用详解
  6. Cookie中不能有空格_PHP 使用cookie
  7. CS144 lab0 笔记
  8. 【Linux】XXX is not in the sudoers file …… 的解决方案
  9. 怎样搭建本地svn服务器环境-轻松掌握版本管理
  10. JS中移动端项目取余数和switch于PC端的不同
  11. iOS 跨平台开发,该用 Flutter 还是 Swift?
  12. ASP.Net 服务器应用程序不可用 解决方法
  13. 汉澳Sinox2014X64server高级桌面服务器版操作系统发布
  14. 范浩强树的学习历程,同时附加一个例题HDU4585shaolin
  15. C语言中函数的基本知识
  16. POJ 3537 Crosses and Crosses 博弈论 SG函数 记忆化搜索
  17. 2016 CSDN最佳博客(Android)
  18. 服务器打开显示选择键盘布局,更改服务器上的TTY键盘布局?
  19. 智商高的人情商都低?這個人來告訴你
  20. PHP excel 直接输出导出

热门文章

  1. html编辑软件hubiler,HTMLPAD(HTML编辑器)
  2. uni-app | 小程序嵌入H5页面实现支付功能
  3. nginx的优化有哪些?
  4. 动态给下拉框,单选框赋值,设置默认选中项的几种方法
  5. JS中var和let的区别
  6. Qt之输入控件(QTextEdit)
  7. Excel电商女装评价分析
  8. App Store 审核指南(2013/1/29中文版)
  9. wf4.0支持mysql吗_WF4.0 基础篇 (一)开始使用WF
  10. tensorflow的sess.run的参数执行顺序