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

调试经验 | Visual Studio中代码正常运行,但运行生成的exe报错“0xc000007b无法正常启动” 在VS环境下debug,release都可以正常运行,F5+debug/release也可以正常运行代码。但是在生成的release目录下直接运行exe出现错误如下所示。 由于需要输入参数,写了bat文件运行,和上面的错误一样。该错误不是缺乏输入参数引起的。 搜索了一下0xc000007b无法正常启动的错误,很可能是DirectX的问题。如下 将exe文件拖到depend 阅读详情

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

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

目录

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

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

3、代码是否错误

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

完整代码

参考文献:


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

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

解决:

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

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

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

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

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

解决:

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

3、代码是否错误

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

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

解决:

将ShowWindow(hwnd, WS_OVERLAPPEDWINDOW);改成

	ShowWindow(hwnd, SW_SHOWNORMAL);

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

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

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

完整代码

完整代码如下:

#include<windows.h>

LRESULT CALLBACK WindowProc(
	HWND    hwnd,			//消息所属窗口
	UINT    uMsg,			//具体消息名称
	WPARAM  wParam,			//键盘附加消息
	LPARAM  lParam			//鼠标附加消息
) 
{
	switch (uMsg) {
		case WM_CLOSE:
			DestroyWindow(hwnd);//DestroyWindow发送另外一个消息WM_DESTROY
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;

		case WM_LBUTTONDOWN: //鼠标左键按下
			{
				int xPos = LOWORD(lParam);
				int yPos = HIWORD(lParam);

				char buf[1024];
				wsprintf(buf, TEXT("x=%d,y=%d"), xPos, yPos);

				MessageBox(hwnd, buf, TEXT("鼠标左键按下"),MB_OK);
				break;
			}
		case WM_KEYDOWN://键盘
			MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);
			break;
		
		case WM_PAINT:
			{	
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hwnd, &ps);

				TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));

				EndPaint(hwnd, &ps);
				
				break;
			}

	}




	return	DefWindowProc(hwnd, uMsg, wParam, lParam);
}



//WINAPI代表 __stdcall 参数的传递顺序:从右到左,依次入栈,并在返回前,清空栈
int  WINAPI WinMain(
	HINSTANCE hInstance,     //应用程序的实例句柄
	HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32环境下,参数一般NULL,不起作用
	LPSTR lpCmdLine,         //char *argv[]
	int nShowCmd)           //显示命令
{  
	//1、设计窗口
	//2、注册窗口
	//3、创建窗口
	//4、显示和更新
	//5、通过循环取消息
	//6、处理消息(窗口过程)


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

	//3、创建窗口
	/*
	lpClassName,		类名
	lpWindowName,		标题名
	dwStyle,			WS_OVERLAPPEWINDOW风格
	x,					显示坐标
	y,
	nWidth,				框高
	nHeight, 
	hWndParent,			父窗口 NULL
	hMenu,				菜单
	hInstance,			实例句柄
	lpParam				附加值 鼠标附加值
	*/


	HWND hwnd=CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	//4、显示和更新
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);

	//5、通过循环取消息
	/*
	 HWND        hwnd;      主窗口
    UINT        message;	具体消息名称
    WPARAM      wParam;		附加消息 键盘
    LPARAM      lParam;		附加消息 鼠标
    DWORD       time;		消息产生时间
    POINT       pt;			附加消息 鼠标信息 x,y 
	*/

	MSG msg;
	while (1) 
	{
		/*
		_Out_ LPMSG lpMsg,          封装好的消息,p指针
		_In_opt_ HWND hWnd,			捕获窗口,NULL捕获所有窗口
		_In_ UINT wMsgFilterMin,	最小和最大过滤消息 一般0,捕获所有窗口
		_In_ UINT wMsgFilterMax		捕获所有消息
		*/

		if (GetMessage(&msg, NULL, 0, 0) == FALSE) {
			break;
		}

		//翻译消息
		TranslateMessage(&msg);

		//不为FALSE
		//分发消息
		DispatchMessage(&msg);
	}

	//6、处理消息(窗口过程)



	return 0;
}

结果显示:

参考文献:

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

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

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

Visual Studio 2017 用类向导添加MFC类,直接无法添加MFC类;CFormView相关问题---问题解决 之前在学习C++相关方面的知识,用的软件是VS2017,发现在对项目添加MFC类时出现了问题,导致程序无法正确运行。 直接对项目点击添加类,出现的是以下这个界面,如果自行输入类名,你会发现基类是无法自动跳出的,而这个类是一个普通类,不是MFC类。 点击项目---->添加新项---->MFC---->MFC类---->写好就类名,选择基类,就大功告成了。 1、点击... 阅读详情

相关推荐

VS2017安装并配置VTK

VS2017安装并配置VTK1 说明2 VTK的安装2.1 下载VTK安装包2.2 下载cmake2.3 新建文件夹2.4 cmake编译VTK2.5 vs2017编译VTK.sln2.6检验VTK是否安装成功2.7 安装完成3. VTK如何配置3.1 生成VTK的头文件、dll文件和lib文件3.2 环境变量添加3.3 创建工程并添加include、lib文件夹地址3.4 选择链接器3.5 预处理定义 1 说明 本教程主要针对在Window 64位系统下对VS2017版程序上安装并配置VTK,VTK选取的

LLL_mg的博客 4472

VS在编译MFC的时候编译通过却无法运行的解决方法

在VS2019中编译一个生产分析excel软件,再添加一个多选表格的功能时,编译已经显示0 waring,0 error,但是实际运行时,没有任何反应。首先确定编译确实没有问题,运行时无任何警告报错,其次将代码回退至改动前即可运行。确认该问题大概率并非代码错误引起的问题。打开本地编译器进行调试,发现提示在uart_task函数发生异常。且异常显示为堆栈溢出。正在上传…重新上传取消退出调试模式,在资源解决方案右键选择项目属性,选择链接器---->系统---->堆栈保留大小,发现并未设置,默认值为1M。正在上传

MOSHIWANGJUE的博客 3213

Win7下载安装VS2017(Qt搭载MSVC2017编译环境)

先贴一个VS2017的官方下载地址吧: https://my.visualstudio.com/Downloads?q=visual%20studio%202017&wt.mc_id=o~msft~vscom~older-downloads1https://my.visualstudio.com/Downloads?q=visual%20studio%202017&wt.mc_id=o~msft~vscom~older-downloads在官网下载安装VS2017时我遇到的问题如下,并附上

UNDEFINED_AUBE的博客 6359

在vs上写代码运行不了

如何运行程序将结果显示 在VS中一般运行程序时直接点击调式+开始执行不调式即可,但是经常程序完全没问题,显示运行成功 但没有弹出结果框,这是要调的,当然依然可以不调 代码解决 //在头文件中输入 #include<windows.h> //在最后输入 system("pause"); 调节步骤 1.右键点击你建的项目,然后点击链接器。 2.选择系统,点击子系统,选择控制台,最后点击应用即可。 ...

m0_49131313的博客 1万+

VS中文乱码问题

如果是2015 添加命令步骤可直接跳过 ,最近刚刚换成2017 写控制台程序做功能测试,然后发现居然乱码了。用VS2017新建windows控制台应用程序,在main函数种加一句printf("你好");后,运行结果依然乱码用notapad++打开该文件后,点击菜单栏的编码一项,发现是UTF-8无BOM格式编码,然后改成以ANSI格式编码后也就是说VS是用UTF-8来编码代码文件的,编译出的程...

qq_39887964的博客 4826

VS2017中处理命令行参数的方法----C++语言 Windows系统

我们使用Windows系统的VS2017编程时,有时候需要处理命令行参数,但是该IDE默认情况下没有提供命令行参数,并且也不会自动识别,必须由我们自己去手动打开,接下来就用一个简单的例子来介绍一下如何打开VS2017的命令行参数的选项。 首先,我们有如下的代码: // count.cpp -- counting characters in a list of files #include ...

清水河C罗——Leonardo-Liu 7404

VS2017运行程序出现乱码解决方法

VS2017新建windows控制台程序打印中文乱码问题(纯转载) 最近刚换上VS2017,由于手头又要做个MFC的程序,所以写控制台程序做功能测试,然后发现居然乱码了。 于是用VS2017新建windows控制台应用程序,在main函数种加一句printf("你好");后,运行结果依然乱码 用notapad++打开该文件后,点击菜单栏的编码一项,发现是UTF-8无BOM

1万+

【环境配置】vs2017+opencv在win10下的详细环境配置步骤

环境配置最恼火,不过有了这个详细文档,就不是问题了。 一、下载vs2017和opencv安装包 vs2017官网下载地址:https://visualstudio.microsoft.com/ (下载的是3.4.3版本) opencv下载地址:https://opencv.org/releases.html# (下载的是visual studio community2017版) ...

mustard1020的博客 3770

Windows10下vs2017的OpenGL的配置

Windows10下vs2017的OpenGL的配置有关Windows10下vs2017的OpenGL如何配置,可参照如下方法:目录用 [TOC]来生成目录:Windows10下vs2017的OpenGL的配置 目录 下载OpenGL 配置OpenGL 测试 最后下载OpenGL 打开网址:https://www.opengl.org/resources/libraries/glut/glut_do

wangwei19951128的博客 1万+

OGRE1.12.5+VS2017+windows项目环境搭建

缘由 本学期的虚拟现实与增强显示技术课程项目需要使用OGRE引擎完成,配置非常麻烦,有很多坑,在此记录一下以免以后忘记。使用的版本为OGRE1.12.5+VS2017。 OGRE下载 下载sdk 由于自己编译源代码过于复杂,一些依赖项还需要外网下载,很容易失败,故直接下载 OGRE官网sdk 。进链接后下载 Current Stable Release (Ogre 1.12) 里面的 OGRE 1...

养成系魔法少女笔记 2140

【Arduino 101】五分钟搞懂PID控制算法

【Arduino 101】五分钟搞懂PID控制算法物料清单尺寸接线 文章目录物料清单尺寸接线 物料清单 Arduino Uno x 1 超声波模块(HC-SR04)x 1 舵机(Tower Pro MG996R)x 1 舵机供电: 5V 稳压管(LM7805) x 1 , 滤波电容 (0.33uF, 0.1uF) x 2, 9V 电池 x 1 滑轨:泡沫板 支架:乐高 滚动物体:胶带(Up试过网球,但是测距模块的表现不理想) 尺寸 接线 ...

机器人工坊 1万+

VS2017打开不显示窗口

VS2017打开不显示窗口,进程中可看到devenv.exe

u014790938的专栏 3734

UART全功能测试指南:环路/DMA/RS485/硬件流控实战

UART(通用异步收发器)是嵌入式系统中最基础的串行通信接口,其核心原理基于起始位、数据位、校验位与停止位的异步帧结构,依赖精确的波特率时钟同步与采样重建机制。在工业与物联网场景中,UART不仅需保障基本通信可靠性,更需支持DMA卸载、RS485半双工自动方向控制、RTS/CTS硬件流控等进阶能力,以提升实时性、抗干扰性与系统资源效率。典型应用涵盖调试日志输出、传感器数据采集、Modbus RTU总线通信及固件空中升级。本指南聚焦UART外设测试实践,覆盖环路自检、DMA吞吐验证、RS485时序对齐、硬件流

weixin_42599908的博客 133

Windows上VS2017单步调试FFmpeg源码的方法

之前在https://blog.youkuaiyun.com/fengbingchun/article/details/90114411 介绍过如何在Windows7/10上通过MinGW方式编译FFmpeg 4.1.3源码生成库的步骤,那时只能生成最终的库,却不能产生vs工程,无法进行单步调试。GitHub上有个项目ShiftMediaProject/FFmpeg提供了vs工程,下面对编译过程进行说明: ...

网络资源是无限的 4294

什么是论文的创新点?公式化描述算是创新点吗?

写科研论文时,挑战之一就是如何让你的工作“脱颖而出”,也就是要有创新性。不管实验多么精确、推导多么复杂,若没有真正的创新,论文很可能会被拒。关于如何创新问题上,我最近在看刘雪峰老师的《科技论文写作指南》,看到了很多关于写作的新论述,在这里和大家进行分享。

加百力 的技术博客 1926

基于FPGA的PCIe核系列:FPGA root模式生成工程例子分析(1)

一、 PCIE系统架构 1.1 PCIE分层结构 PCIE结构 1.2 TLP包 四种TLP类型。 Memory (内存空间操作) IO (IO空间操作) Configuration (配置操作) Message (信息操作) 四种类型TLP,如果有需要响应,称为Non-Posted TLP,如果没有需要响应,称为Posted TLP。 TLP包类型 1.2.1 TLP结构 TLP数据格式 1.2.2 Header各个字段的含义 Header格式 ...

huangshanhu的博客 3432

问题1:VS2017:找不到 Windows SDK 版本10.0.17134.0

1. 问题: 找不到 Windows SDK 版本10.0.17134.0。请安装所需的版本的 Windows SDK 或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SDK 版本。 2. 出现问题的过程: Ctrl+F5,开始执行: 然后出现了错误:找不到 Windows SDK 版本10.0.17134.0。请安装所需的版本的 Windows ...

weixin_39450145的博客 1万+

S7-1200 PLC PID功能 | 调节PID参数

S7-1200 PLC PID功能 | 调节PID参数

Robot_PLC_HMI_Automation 1万+

Windows10显示缩放导致Visual Studio 2017 WinForm窗体设计器在高DPI下设计时界面/布局/大小问题

目录 一、问题 二、解决方案 三、最佳解决方案 (1)打开注册表编辑器(WIN+R组合键,输入regedit) (2)导航 (3)新建字符串值 (4)填写数值名称(最好找到自己的VS启动程序的路径,黏贴进去) (5)填写数值数据(注意填写完整,少一个字符都一个字符都不行) (6)验证结果 四、总结 一、问题 图1 VS WinForm窗体设计器显示问题(信息栏是V...

夏侯依风 的博客 2万+

C#实现鼠标点击任意绝对位置(附完整源码)

C#实现鼠标点击任意绝对位置(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 476

ROS2 多机器人导航仿真入门教程(一)

RMF 是建立在 ROS 2 基础上的一系列可重复使用、可扩展的库和工具,可实现任何类型机器人系统的异构机群的互操作性。RMF 利用标准化的通信协议与部署机器人的基础设施、环境和自动化系统进行通信,以优化关键资源(如机器人、电梯、门、通道等)的使用。它通过资源分配和通过 RMF 核心(将在本书后面详细介绍)防止共享资源冲突,从而为系统增加智能。RMF 灵活而强大,几乎可以在任何通信层上运行,并与任何数量的物联网设备集成。RMF 的架构设计允许随着环境自动化水平的提高而扩展。

2506_90492529的博客 1658

Windows10 + VS2017 + Pangolin + 依赖库 配置指南

指南目录配置背景配置环境构建编译libjpeg 配置glew 配置zlib 配置libpng 配置在 VS2017 中配置上述第三方库glew.propslibjpeg.propszlib.propslibpng.props继续编译 PangolinOpenGL 配置使用 配置背景   由于最近需要配置高翔博士 ORBSLAM2 的稠密点云版本,而其中用到的 PCL 库默认是 MD 的运行库,与我之前配置好的其他运行库不同。因此,需要额外再配置一下 Pangolin 库的 MD 版本。   Pangolin

滥觞 5912

碰撞检测 | 图解视线生成Bresenham算法(附ROS C++/Python/Matlab实现)

Bresenham视线生成是一种高效的算法,用于在二维网格上绘制直线。Bresenham算法可以应用在栅格地图中进行一维碰撞检测,即检查起点和终点间直线是否穿过障碍栅格。本文图解Bresenham碰撞检测的原理,并给出ROS C++/Python/Matlab三种实现加深理解

FRIGIDWINTER的博客 1万+

windows 平台使用 VS2017 编译 libevent 源码

一 依赖库编译 先要将其依赖的库编译好,其中openssl需要编译到libevent中,编译成libevent_openssl.lib库,zlib在新版本中只有示例用到。 1)windows 平台使用 VS2017 编译 openssl 源码 参考前面的文章 openssl 默认编译到 C:\Program Files (x86)\OpenSSL 目录,包含收文件,lib文件和dll文件,...

老夏课堂-夏曹俊的技术专栏 1270

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

下一篇: 整理归纳MySQL快速入门学习+win10+VS2017(下载+配置+附加插入数据和显示数据实例)
小白tb
博客等级 码龄8年 1586粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值