Win32 SDK基础(五)之关于窗口类的简单介绍
一、引言
在上一文中,我们从零开始创建了一个窗口。其中很重要的一个步骤,就是注册窗口类,如下面的代码:
//注册窗口类 BOOL Register(LPSTR lpClassName, WNDPROC wndProc) { WNDCLASSEX wce = { 0 }; wce.cbSize = sizeof(wce); wce.cbClsExtra = 0; wce.cbWndExtra = 0; wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wce.hCursor = NULL; wce.hIcon = NULL; wce.hIconSm = NULL; wce.hInstance = g_hInstance; wce.lpfnWndProc = wndProc; wce.lpszClassName = lpClassName; wce.lpszMenuName = NULL; wce.style = CS_HREDRAW | CS_VREDRAW; ATOM nAtom = RegisterClassEx(&wce); if (nAtom == 0) return FALSE; return true; }
Windows下的任何一个窗口,在创建之前都要在系统中已经明确的注册,我们在使用CreateWindowEx进行窗口的创建时,第二个参数的名称就是窗口类名称,这个名称在我们代码可见的作用域内应该是唯一的。本文主要讨论下Windows下,窗口类的问题。
二、窗口类分类
Windows中所有可见的一切元素基本上都属于一个窗口,不管它的形状如何,是圆的、方的、甚至是无规则的。所有的这些窗口都属于某一个窗口类,大体上来说Windows的窗口类共分为三种:
(1)系统窗口类
(2)全局窗口类
(3)局部窗口类
下面,我将就Windows中窗口类的分类分别进行讨论。
2.1 系统窗口类
一个按钮、一个编辑框所有这些我们在windows操作系统中可见的控件其实都是一个窗口。当我们安装完操作系统之后,Windows会在操作系统内部注册大量的系统级别的窗口类,我们在进行开发时,可以直接根据窗口类名称创建这些窗口。为了解释这个问题,在上一文中的代码之上,我们引入下面的代码。
HWND CreateMain(LPSTR lpClassName, LPSTR lpWndName) { HWND hWnd = CreateWindowEx(0, lpClassName, lpWndName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL); return hWnd; } int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { // TODO: Place code here. g_hInstance = hInstance; HWND hWnd = CreateMain("Button", "window"); Display(hWnd); Message(); return 0; }
CreateMain是我们定义的一个创建窗口的函数。它接收两个参数,第一个时已经注册的窗口类名称,第二个是窗口的标题。与上一文中的代码不同,我们省去了注册自定义窗口的步骤。而是在WinMain函数中,调用CreateMain创建了一个窗口类名称为“Button”的窗口。我想你已经知道我们要做什么了吧?对,就是要生成一个Button按钮。我们常用的所有控件都已经被操作系统注册成了系统窗口类,我们都可以直接使用。请看下面的程序运行结果:
你还可以尝试去创建诸如编辑框、下拉框等其他系统级别的窗口。
2.2 全局窗口类
全局窗口类指注册之后可以在应用程序全局范围内使用的窗口类。比如,我们可以在dll中对全局窗口类进行注册,那么引入该dll的所有程序都可以使用该类。注册全局使用的窗口类时,我们只需要在注册时对wec的结构体的style成员添加CS_GLOBALCLASS属性,如下:
wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
为了验证这个问题,我们新添加一个dll项目,然后定义一个如下的窗口注册函数RegisterWindow():
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0);//可以使GetMessage返回0 break; default: break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } BOOL RegisterWindow() { WNDCLASSEX wce = { 0 }; wce.cbSize = sizeof(wce); wce.cbClsExtra = 0; wce.cbWndExtra = 0; wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wce.hCursor = NULL; wce.hIcon = NULL; wce.hIconSm = NULL; wce.hInstance = NULL; wce.lpfnWndProc = WndProc; wce.lpszClassName = "DllMain"; wce.lpszMenuName = NULL; wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS; ATOM nAtom = RegisterClassEx(&wce); if (nAtom == 0) return FALSE; return true; }
RegisterWindow()中注册的窗口类名称为"DllMain",我们在dll的主函数中调用该注册函数完成注册:
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { .... RegisterWindow(); return TRUE; } }
在我们的主程序中使用该窗口类创建窗口:
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { ... HWND hWnd = CreateMain("DllMain", "我是一个Dll注册的窗口"); Display(hWnd); Message(); return 0; }
运行程序你会发现我们也成功生产了这个窗口:
2.3 局部窗口类
局部窗口类从定义上来说,凡是未在wce的style中添加CS_GLOBALCLASS,而注册的窗口类都是局部窗口类。
wce.style = CS_HREDRAW | CS_VREDRAW;//未添加CS_GLOBALCLASS
我们在上一文中注册的窗口就是一个局部的窗口类,它的特点就是只能在注册的作用域内使用,由于它和全局窗口类只在注册的style和作用域上有分别,这里就不再详述,如要了解,请参照上一文。
以上是Win32 SDK基础(五)之关于窗口类的简单介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Windows 11 的原生应用(如文件资源管理器)和其他 shell 应用默认使用圆角和 Fluent Design 元素(如 Acrylic)。除了圆角,Windows 11 的另一个重要设计特点是云母等材质,它将应用程序的背景颜色与桌面对齐。云母与亚克力类似,但其工作方式略有不同。正如微软所描述的,Windows Mica 材料通过将背景与应用程序对齐来创建“颜色层次结构

用于build22523的新Windows11SDK透露,微软正在为Windows11开发新的模糊效果。该效果称为Tabbed,并且是对Acrylic和Mica的补充。22523SDK中的新DWMWA_SYSTEMBACKDROP_TYPE、云母、亚克力的公共Win32API及其奇怪的新“选项卡”混合:pic.twitter.com/dbsu7ZFiIi-一切都回来了(@StartIsBack)2021年12月15日可以在以下SDK的示例应用程序

防病毒软件有时可能会在 Windows 32 笔记本电脑上显示一条警告,指出 Trojan/win11.casdet rfn。它表示PC感染了特洛伊木马恶意软件,导致其出现故障。幸运的是,有一些可能的方法可以解决此问题,如下所述。此外,您可能对我们关于 cdn.districtm.io 是否为弹出窗口/病毒/恶意软件的详细指南感兴趣。什么是 Trojan/win32.casdet rfn?Trojan/win32.casdet rfn 是一种严重的木马病毒感染,可以超越系统并杀死其进程,使其容易

win32和win64的区别是:1、win32是指Microsoft Windows操作系统的32位环境,win64是指Microsoft Windows操作系统的64位版本,比32位版本更加稳定快速;2、win32最高支持2G的内存,win64必须是4G以上内存;3、win64支持基于64位的处理器,而win32却不能完全支持;4、win32追求简洁,win64追求性能。

早在2021年8月,微软就承诺Windows10和Windows11上的OneNote将在未来几个月内收到一系列主要功能更新,这是这家科技巨头将多个版本的笔记应用程序统一为一个单一版本的努力的一部分客户。OneNote在过去几年中发生了许多变化。2018年,当微软真正希望人们使用其UWP版本的OneNote时,该公司停止将原始且功能丰富的OneNote版本与预装的Office应用程序捆绑在一起。相反,微软只提供了UWP客户端并为现代版本添加了新功能。微软后来改

掌握Java海康SDK二次开发的必备技巧引言:随着信息技术的迅猛发展,视频监控系统在各个领域得到了广泛的应用。而作为国内领先的视频监控解决方案提供商,海康威视的产品和技术一直在市场中占据着重要的地位。为了满足不同项目的需求,海康威视提供了SDK供开发者进行二次开发。本文将介绍一些掌握Java海康SDK二次开发的必备技巧,并附上相应的代码示例。一、了解海康威视

WindowsAppSDK是一组工具和API,开发人员可以在其Windows应用程序中使用这些工具和API,以便在使用Windows10(版本1809及更高版本)和Windows11的各种设备上提供“一致”的功能。了解它确实很重要它不会取代现有的应用程序类型,例如.NET或WindowsSDK,它只是提供一个统一的API工具集,可以用来补充您现有的应用程序。今天,微软发布了具有许多新功能的WindowsAppSDK1.2版本。此版本的亮点可能是第三方开发人

sdk全称“Software Development Kit”,中文意思为“软件开发工具包”,是由硬件平台、操作系统(OS)或编程语言的制造商提供的一套工具。SDK可协助软件开发人员面向特定的平台、系统或编程语言创建应用。一个基本的SDK通常由编译器、调试器和应用编程接口(API)组成,但也可能包含其他内容,比如:文档、库、运行时/开发环境、测试/分析工具、网络协议等。
