win32窗口问题-CreateWindow创建窗口一直失败
使用背景
利用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创建窗口一直失败相关推荐
- 导致CreateWindow创建窗口失败的一种原因
导语:在封装一个基本的Frame显示窗口时遇到CreateWindow函数调用成功,但是窗口总是不显示. CreateWindow返回NULL,GetLastError()返回0 经过网上搜集资料和单 ...
- win32 api CreateWindow创建窗口控件及设置字体
HWND hBtn, hEdit, hText, hCombBox; hBtn = CreateWindow( //按钮创建 "button", "创建的按钮" ...
- 【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )
文章目录 一.导入头文件 二.桌面程序入口函数 三.注册窗口 四.创建窗口 五.显示窗口 六.完整代码示例 七.相关资源 基于 [OpenGL]一.Visual Studio 2019 创建 Wind ...
- idl结果显示窗口如何缩小_科学网—IDL 创建窗口 - 钱磊的博文
一直以来我都觉得写程序创建一个窗口,添加些按钮,显示些会变化的文字是十分神奇的事.但是又懒又笨,一直没学会.最近开始考虑做一个观测模拟系统,模拟一个射电天文望远镜的控制界面.这种东西每个望远镜都由,估 ...
- OpenGL-glut创建窗口
环境:win10 库:OpenGL gult库 创建单个窗口 OpenGL在创建窗口前,先进行窗口的初始化,并可以设置窗口的模式.窗口的位置.窗口的尺寸大小 int main(int argc, ch ...
- win32创建窗口及其消息循环
转自:http://anyzixin.blog.163.com/blog/static/365289122007103031657355/ http://anyzixin.blog.163.com/b ...
- 【转】win32 的DLL中创建windows窗口
转自:https://blog.51cto.com/wangyw/1071967 因工作需求,需要写一个DLL,并在其中创建windows窗口,网上有很多关于DLL创建窗口的文章,不过都是基于MFC的 ...
- CreateWindow() -- 创建普通的窗口
(1)函数原型 1 HWND CreateWindow( 2 LPCTSTR lpClassName, //pointer to register class name 3 LPCTSTR lpWin ...
- win32消息处理和创建窗口
文章目录 0.说明 1.win32事件和消息 2.系统处理消息 3.win32创建窗口和消息处理 4.源代码 0.说明 观看滴水逆向视频总结(部分截图来自于滴水课件) 编译器:vc++6.0 编写语言 ...
最新文章
- macbook可以装linux,怎样给老旧的 MacBook 安装 Linux
- python安卓版下载安装-python手册中文版apk下载
- MSSQL系统常用视图命令及其作用
- 数据库迁移mysql到sqlserver_数据库迁移(sqlserver至mysql)
- 产品部门四大角色——PM/PD/UE/UI
- mysql-可视化软安装过程-navicate
- Bootstrap导航中禁用导航链接
- linux中until循环的特点,Bash 中的 until 循环详解
- [leetcode] 11.盛最多水的容器
- 六度分离 HDU - 1869 (最短路径)
- Office 2021办公套件iso镜像下载
- 内网安全“小迪安全课堂笔记”域横向
- 期货量化交易程序CTP入门指南 二
- CHARACTERISTIC DEFINITION
- 《软件测试》第二章 软件开发的过程
- 路由器、交换机的基本配置 1
- css里给文字加下划线代码,css添加文字下划线样式的方法
- 一个后端开发的 Vue 笔记【入门级】
- RMAN完全恢复与不完全恢复测试
- java制表键_java-制表符的使用说明