使用背景

利用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. macbook可以装linux,怎样给老旧的 MacBook 安装 Linux
  2. python安卓版下载安装-python手册中文版apk下载
  3. MSSQL系统常用视图命令及其作用
  4. 数据库迁移mysql到sqlserver_数据库迁移(sqlserver至mysql)
  5. 产品部门四大角色——PM/PD/UE/UI
  6. mysql-可视化软安装过程-navicate
  7. Bootstrap导航中禁用导航链接
  8. linux中until循环的特点,Bash 中的 until 循环详解
  9. [leetcode] 11.盛最多水的容器
  10. 六度分离 HDU - 1869 (最短路径)
  11. Office 2021办公套件iso镜像下载
  12. 内网安全“小迪安全课堂笔记”域横向
  13. 期货量化交易程序CTP入门指南 二
  14. CHARACTERISTIC DEFINITION
  15. 《软件测试》第二章 软件开发的过程
  16. 路由器、交换机的基本配置 1
  17. css里给文字加下划线代码,css添加文字下划线样式的方法
  18. 一个后端开发的 Vue 笔记【入门级】
  19. RMAN完全恢复与不完全恢复测试
  20. java制表键_java-制表符的使用说明

热门文章

  1. 力扣-银行账户概要 II
  2. 练习总结sql面试50题(2021-12-27完结)
  3. Google Earth Engine APP ——制作上传GIF动图并添加全球矢量位置
  4. vue3中使用swiper完整版教程
  5. Python北理工 第六章 组合数据类型
  6. iOS开发 邮件发送
  7. Markdown中图片转PDF之后图片不能显示的问题(已解决)
  8. 一个Unity定点数学库插件 - 包括(数学、导航、碰撞等)
  9. 快速手机打字的诀窍是什么?
  10. 手机呼吸灯原来是这样用的,以前不知道,真的太浪费了