windows编程笔记【二】windows类 WNDCLASSEX详解

MFC教程 -- Windows界面开发 MFC教程 -- Windows界面开发 Windows消息机制 初步认识MFC 要想熟练掌握 Windows 应用程序的开发, 首先需要理解 Windows 平台下程序运行的内部机制。如果想要更好的学习掌握 MFC,必须要先了解Windows 程序的内部运行机制,为我们扫清学习路途中的第一个障碍,为进一步学习 MFC 程序打下基础。 1.1 基本概念解释 我们在编写标准C程序的时候,经常会调用各种库函数来辅助完成某些功能:初学者使用得最多的C库函数就是printf了,这些库函数是由你所使用的编 阅读详情
AI摘要

本文介绍了Windows游戏编程中Window类的基础知识,包括WNDCLASSEX结构体的各个字段含义及如何初始化。涵盖窗口样式设置、回调函数定义、图标与光标加载等内容。

本笔记源自windows游戏编程大师技巧第二版2.6章,记做学习随笔。

使用vs2017环境编译。

 Windows是一个面向对象的操作系统,Windows大量概念都源自于C++,其中一个概念就是Window类。

类描述了窗口的基本信息,比如窗口的图标,鼠标进入窗口的图标,和一些可定制的东西。

window的数据类有两个,WNDCLASS和WNDCLASSEX两个,WNDCLASS比较古老,可能要被弃用,我们使用WNDCLASSEX。

我们只需要创建一个这样的类,然后填写所有的字段。

#include <Windows.h>
#include <windowsx.h>

#define WIN32_LEAN_AND_MEAN

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline,int ncmdshow)
{
	WNDCLASSEX winclass; //创建Windows类,这样创建就可以了
	return 0;
}

来看WNDCLASSEX类的原型吧。

typedef struct WNDCLASSEX {
UINT cbSize; //WNDCLASSEX 的大小。我们可以用sizeof(WNDCLASSEX)来获得准确的值。
UINT style; //从这个窗口类派生的窗口具有的风格。您可以用“or”操作符来把几个风格或到一起。
WNDPROC lpfnWndProc; //窗口处理函数的指针。
int cbClsExtra; //指定紧跟在窗口类结构后的附加字节数。
int cbWndExtra; //指定紧跟在窗口实例的附加字节数。如果一个应用程序在资源中用CLASS伪指令注册一个对话框类时,则必须把这个成员设成DLGWINDOWEXTRA。
HINSTANCE hInstance; //本模块的实例句柄。
HICON hIcon; //图标的句柄。
HCURSOR hCursor; //光标的句柄。
HBRUSH hbrBackground; //背景画刷的句柄。
LPCTSTR lpszMenuName; //指向菜单的指针。
LPCTSTR lpszClassName; //指向类名称的指针。
HICON hIconSm; //和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标。
} WNDCLASSEX;

第一个:cbSize,填写WNDCLASSEX类本身的大小。因为这个结构被像指针一样传递,别的函数会检查他的大小,以确定数据块最低限度多大,这样你写入,别的函数就无需计算,我们这样写即可:

winclass.cbSize = sizeof(WNDCLASSEX);

第二个:style,包含描述窗口属性的样式(style)信息标志。

CS_HREDRAW若移动或改变窗口宽度,则刷新整个窗口
CS_VREDRAW若移动或改变窗口高度,则刷新整个窗口。
CS_OWNDC

为该类中每窗口分配一个单值的设备描述表(稍后再说)

CS_DBLCLKS当用户双击鼠标时向窗口程序发送一个双击的信息,同时光标位于该类的窗口里
CS_PARENTDC在父窗口中设定一个子窗口的剪切区,以便子窗口能够在父窗口中。
CS_SAVEBITS在一个窗口中保存用户图像,以便于该窗口被遮住,移动时不必每次刷新屏幕,但是会占用更多内存
CS_NOCLOSE禁用系统菜单上的关闭命令
winclass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS;

我们的窗口只需要这样选择参数即可,其他的参数后边再记录具体用途。

第三个:lpfnWndProc,他是一个回调函数,当你的窗口有消息后,比如用户要点击按钮,或者输入什么,win就会替你调用这个函数。

当然,这个回调函数是自己写的。

winclass.lpfnWndProc = WndProc; //WndProc不是window提供的东西,我们一会要自己写一个。

等到下一章来写WndProc回调函数,当然不喜欢WndProc这个名字的话,也可以取自己喜欢的回调函数名字。

第四五个:cbClsExtra,bWndExtra,为软件或窗口添加附件内存,绝大数人都是简单的设为0,默认值也是0。

winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;

第六个:hInstance,他就填写WinMain()函数中的hinstance,也就是应用程序的句柄。可以看上一篇笔记有对这个做出详细解释。

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline,int ncmdshow)//第一个实参
{
        .
        .
        .
	winclass.hInstance = hinstance; //WinMain实参的第一个参数,是程序的句柄。
	return 0;
}

说明一下:句柄有很多,比如窗口句柄,上边的程序句柄,还有图标,菜单等等。。句柄起到类似指针的效果,任何前缀h的类型通常就是句柄,关于句柄的详细信息自行搜索。

第七个:hIcon,他装载一个标准程序的应用图标

winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

LoadIcon()原型如下:

HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName);

第一个值是程序句柄类,他可以调用程序包含的图片资源,LPCTSTR是字符串,可以填入资源名字或字符串,我们这个用一个win提供的默认图标。

第八个:hCursor,是设置应用程序的鼠标样式

winclass.hCursor = LoadCursor(NULL, IDC_ARROW);

还是使用Ladlcom函数,这里用一个win提供的默认标准箭头。

第九个,hbrBackground,这是默认填充窗口,也就是设置窗口的背景颜色。

winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

    GetStockObject()参数为预设画刷,之后强制转换为HBRUSH即可。

第十个,lpszMenuName,用于加载和选用窗口,暂时设为NULL,后边会用到。

winclass.lpszMenuName = NULL;

十一个,lpszClassName,他的作用是为你的WNDCLASSEX类取一个别名,是一个标识符,之后你就可以用这个新名字来引用这个类了。

winclass.lpszClassName = "WINCLASS1";

这里取名为“WINCLASS1”。

十二个, LoadIcon,他是小应用图标,用于在任务栏和窗口标题栏现实的图标。

winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

依然是使用LoadIcon()设置.

来回顾一下我们的设置:

#include <Windows.h>
#include <windowsx.h>

#define WIN32_LEAN_AND_MEAN


int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline,int ncmdshow)
{

	WNDCLASSEX winclass;
	winclass.cbSize = sizeof(WNDCLASSEX);
	winclass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS;
	winclass.lpfnWndProc = WndProc; //WndProc还没有定义。
	winclass.cbClsExtra = 0;
	winclass.cbWndExtra = 0;
	winclass.hInstance = hinstance;
	winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	winclass.lpszMenuName = NULL;
	winclass.lpszClassName = "WINCLASS1";
	winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

	return 0;
}

这段代码目前不能运行的,因为我们还没有写lpfnWndProc的回调函数。

API CreateWindowEx各参数详解与WNDCLASSEXW中style的参数含义 CreateWindowEx各参数详解与WNDCLASSEXW中style的参数含义 阅读详情

相关推荐

Windows窗口编程:RegisterClassEx详解与实战

在Windows桌面应用开发中,窗口类(Window Class)是构建用户界面的核心概念,它定义了窗口的属性和行为特征。通过WNDCLASSEX结构体配置窗口样式、消息处理函数等关键参数后,需调用RegisterClassEx API完成系统注册。这一机制实现了窗口模板化管理,开发者可快速创建具有统一特性的窗口实例。在GUI编程、系统级开发等场景中,掌握窗口类注册技术能有效解决消息处理、资源管理等典型问题。结合CS_HREDRAW样式和WNDPROC回调等热词技术点,本文深入解析了跨平台兼容性处理、线程安

weixin_28730927的博客 301

WNDCLASS(WNDCLASSEX)结构介绍

WNDCLASS结构包含了窗口类的属性。 这个结构在使用RegisterClassEx函数注册窗口类时被WNDCLASSEX结构所取代。如果不需为窗口类设置小图标时,仍然可以使用WNDCLASS和RegisterClass。 typedef struct { UINT style; WNDPROC lpfnWndProc;

gebiwanglaowu的博客 2945

窗口类分析 WNDCLASSEX

window系统提供了三种类型的窗口类 系统全局类(System global classes) 应用程序全局类(Application global classes) 应用程序局部类(Application local classes)

Win32 程序开发:窗口类结构体WNDCLASS和WNDCLASSEX

1) 简单介绍窗口类结构体 1. 什么是窗口类结构体(摘抄自百度百科) 窗口类结构体是用来储存某一类窗口的信息,窗口类结构体包含了一个窗口类的全部信息。 比如:窗口的图标、菜单栏、背景颜色、窗口的消息处理等等 2.窗口类结构体 WNDCLASS和WNDCLASSEX 窗口类结构体有:WNDCLASS、WNDCLASSEX WNDCLASS 为早期的版本 W...

南雨兮 7487

LT8711/LT8712 Type-C转HDMI设计方案|替代LT8711/LT8712芯片|GSV2201可完全替代兼容LT8711/LT8712

LT8711UX是一款高性能C/DP1.2型至HDMI2.0转换器,用于将USB Type-C源或DP1.2源连接到HDMI2.0接收器。该LT8711UX集成了一个DP1.2兼容的接收器,和一个HDMI2.0兼容的发射器。此外,还包括两个CC控制器,用于CC通信,以实现DP Alt模式和功率传输功能,一个用于上游Type-C端口和另一个用于下游端口。

weixin_63518914的博客 1641

IC618新手避坑指南:从零在Linux上配置Cadence Virtuoso环境(含cds.lib文件详解)

本文详细介绍了在Linux系统上配置Cadence Virtuoso IC618环境的完整指南,特别针对新手常见问题提供解决方案。重点解析了cds.lib文件的关键配置,包括库路径定义和工艺库管理,并分享了高效工作流设置和典型问题排查技巧,帮助工程师快速搭建稳定的EDA设计环境。

weixin_26805597的博客 556

Windows窗口编程:RegisterClassEx函数与WNDCLASSEX结构体详解

在Windows桌面应用开发中,窗口是用户交互的基础单元,而窗口类的注册是创建和管理窗口的关键步骤。RegisterClassEx函数作为Win32 API的核心组件,负责向系统注册窗口类的特征和行为逻辑。通过WNDCLASSEX结构体,开发者可以定义窗口的样式、图标、光标、背景等属性,并指定消息处理函数。理解RegisterClassEx的工作原理对于开发兼容性强的Windows应用至关重要,尤其在处理DPI感知、高对比度支持等现代UI需求时。本文深入解析WNDCLASSEX结构体的成员和注册流程,帮助开

weixin_26805597的博客 311

不用买显示器!用USBMMID虚拟显示器软件在Win10上扩展4个屏幕(保姆级教程)

本文提供了一份详细的保姆级教程,指导用户如何在Windows 10系统上,无需购买额外硬件,通过USBMMID虚拟显示器软件扩展出多达4个虚拟屏幕。文章深入解析了虚拟显示器的核心原理,并基于微软IDD框架,手把手教学从软件获取、环境检查到安装配置的全过程,帮助开发者和多任务用户构建高效、免费的虚拟多屏工作站,实现生产力的飞跃。

backprop5master的博客 660

WNDCLASSEX

WNDCLASSEX是一个窗口,最重要的成员是lpfnWndProc。前缀 lpfn 表示该成员是一个指向函数的长指针。在 Win32中由于内存模式是 FLAT 型,所以没有 near 或 far 的区别。 描述 每一个窗口类必须有一个窗口过程,当 Windows 把属于特定窗口的消息发送给该窗口时,该窗口的窗口类负责处理所有的消息,如键盘消息或鼠标消息。由于窗口过程差不多智能地处理了所有的窗口消息循环,所以您只要在其中加入消息处理过程即可。 结构体原型: typedef struct W

顺其自然~专栏 656

OpenClaw(小龙虾) 安装部署教程

OpenClaw(原名Clawdbot)是一个开源的、可本地部署的个人AI助理,它能接入飞书、钉钉等即时通讯工具,帮你处理邮件、管理文件,甚至控制电脑。

qq_40668700的博客 1385

CAN-do-paser:Java开发的CAN总线数据帧解析库

CAN总线数据帧使用DBC文件信息解析为物理量,基于Java开发的数据解析工具。

佳瑞的博客 1134

创建Windows类

Windows中窗口,控件,对话框实质上都是窗口,Windows类是一种Windows可以处理的窗口类型描述。在Windows中有大量预定义的Windows类,但是也可以方便的创建自己的Windows类。对于每个应用程序,至少需要创建一个Windows类。以Windows类为模版,生成窗口,处理消息。 有两种数据结构可用于保存Windows类消息:WNDCLASS和WNDCLASSEX。WNDC

四夕日 月 1675

【Diffusion分割】医学图像分割中去噪扩散技术

扩散模型(DPM)在图像生成方面表现出了卓越的性能,其性能往往优于其他生成模型。自其问世以来,强大的噪声-图像去噪管道已被扩展到各种判别任务中,包括图像分割。在医学成像中,图像往往是大型三维扫描图像,由于内存消耗大、迭代采样过程耗时,使用 DPM 对一幅图像进行分割的效率极低。在这项工作中,我们提出了一种(LDSeg),可在潜空间中执行扩散,用于医学影像分割。我们。潜空间条件扩散不仅能确保对多标签对象进行精确的 n-D 图像分割,还能缓解基于 DPM 的传统分割法的主要潜在问题:(。

qq_43583311的博客 1171

WNDCLASS和WNDCLASSEX

typedef struct { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HB...

309

SAP生产版本导入避坑大全:从‘黄灯’到‘绿灯’,详解CM_FV_MKAL_CONSISTENCY_CHECK检查函数

本文深入解析SAP生产版本导入过程中的常见问题,特别是通过`CM_FV_MKAL_CONSISTENCY_CHECK`检查函数从‘黄灯’异常到‘绿灯’正常的修复方法。涵盖静态与动态校验机制、典型异常场景诊断及批量导入最佳实践,帮助SAP运维人员高效解决生产版本管理难题。

weixin_30568591的博客 389

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

[学习笔记] Windows编程——窗口和消息 ——(二)窗口类

每个窗口类都有一个由所有该窗口类对象所共享的窗口程序来处理该类的所有窗口实例的消息,以控制其行为和外观。进程必须先注册窗口类,然后才能创建该类的窗口。注册窗口类会将窗口程序、类样式和其他类属性与类名因此类名是比较重要的,是 Key,创建窗口类对象时都是使用类名字符串来查找窗口类)相关联。

cxsydzn的博客 1414

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Windows 串口注册窗口类函数详解

ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex;//定义一个窗口结构的对象wcex wcex.cbSize = sizeof(WNDCLASSEX);设置窗口结构的大小 wcex.style = CS_HREDRAW | CS_VREDRAW;设置窗口类型 wcex.lpfnWndProc = WndProc;窗口消息处...

weixin_37603532的博客 1002

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[API档案]WNDCLASSEX

[API档案]WNDCLASSEXWNDCLASSEX原型参数: WNDCLASSEX原型 typedef struct tagWNDCLASSEXW { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIc

qq_38670822的博客 374

Windows窗口程序详解

窗口程序示例程序comment。

weixin_57164754的博客 784

windows SDK编程 --- 第一个窗口程序(2)

回调函数是一种在程序中被传递并在特定事件或条件发生时执行的函数。简单来说,你可以把回调函数想象为一种“延迟调用”的方法,即你指定一个函数现在不立即执行,而是在将来某个特定的时刻自动执行。HWND hwnd,UINT msg,// 根据消息类型进行分支处理在 Windows 操作系统中,消息尤为重要。Windows 维护一个消息队列,用于存储待处理的各种事件消息。当事件发生(如用户的鼠标操作、键盘操作或其他系统事件)时,相应的消息会被生成并发送到消息队列中。

取个名字太难了a的博客 1335

Win32学习笔记 - WNDCLASSEX结构体

typedef struct _WNDCLASSEX { UINT cbSize; //结构体的大小 UINT style; //窗口类的风格 WNDPROC lpfnWndProc; //窗口处理函数

Vinx Blog 1034

Win32应用程序基础——WNDCLASSEX窗口类。

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34192732的博客 253

windows学习笔记二

窗口类 每个窗口都是一个窗口类的成员,窗口类是一个属性集.Microsoft Windows系统在创建应用程序的窗口时用它作为一个模板。每个窗门类有一个与之相应的窗口过程,由同类窗口所共享,窗口过程为该类的所有窗口处理消息,从而控制它们的特性和外观。有关窗口过程.参见 “窗口过程”。 应用程序必须在它创建某类窗口之前注册这个窗口类,注册一个窗口类也就是把一个窗口过程、类风格及其它一些类

2620

C++Windows编程之注册窗口类

我们用Visual Studio创建一个win32项目上会自动生成一个注册窗口类。如下: // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex

4514
上一篇: windows编程笔记【一】win32 API下第一个窗口
下一篇: windows编程笔记【三】注册windows类 创建窗口
崔佳宇_
崔佳宇_ 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄10年 1万+粉丝 173原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值