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和作用域上有分别,这里就不再详述,如要了解,请参照上一文。
Atas ialah kandungan terperinci Win32 SDK基础(五)之关于窗口类的简单介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Apl asli Windows 11 (seperti File Explorer) dan apl cangkerang lain menggunakan penjuru bulat dan elemen Reka Bentuk Fasih (seperti Akrilik) secara lalai. Selain sudut bulat, satu lagi ciri reka bentuk penting Windows 11 ialah bahan seperti mika, yang menjajarkan warna latar belakang aplikasi dengan desktop. Mika serupa dengan akrilik tetapi berfungsi sedikit berbeza. Seperti yang diterangkan oleh Microsoft, Bahan Windows Mica mencipta "hierarki warna dengan menjajarkan latar belakang dengan aplikasi

Windows 11 SDK baharu untuk binaan 22523 mendedahkan bahawa Microsoft sedang membangunkan kesan kabur baharu untuk Windows 11. Kesan ini dipanggil Tabbed, dan merupakan tambahan kepada Akrilik dan Mika. DWMWA_SYSTEMBACKDROP_TYPE baharu dalam SDK 22523, API Win32 awam untuk Mica, Acrylic dan campuran "tab" baharu mereka yang pelik: pic.twitter.com/dbsu7ZFiIi — It's All Back (@StartIsBack) 15 Disember 2021 Tersedia dalam SDK berikut Contoh permohonan

Perisian antivirus kadangkala boleh memaparkan amaran yang menyatakan Trojan/win11.casdet rfn pada komputer riba Windows 32. Ia menunjukkan bahawa PC dijangkiti malware Trojan, menyebabkan ia tidak berfungsi. Nasib baik, terdapat beberapa cara yang mungkin untuk menyelesaikan masalah ini, seperti yang dijelaskan di bawah. Selain itu, anda mungkin berminat dengan panduan terperinci kami tentang sama ada cdn.districtm.io ialah pop timbul/virus/perisian hasad atau tidak. Apakah Trojan/win32.casdet rfn? Trojan/win32.casdet rfn ialah jangkitan virus Trojan yang teruk yang boleh mengatasi sistem dan membunuh prosesnya, menjadikannya mudah

Perbezaan antara win32 dan win64 ialah: 1. win32 merujuk kepada persekitaran 32-bit sistem pengendalian Microsoft Windows, dan win64 merujuk kepada versi 64-bit sistem pengendalian Microsoft Windows, yang lebih stabil dan lebih pantas daripada 32 -versi bit; 2. win32 menyokong sehingga 2G memori, win64 mesti mempunyai lebih daripada 4G memori;

Kembali pada Ogos 2021, Microsoft berjanji bahawa OneNote pada Windows 10 dan Windows 11 akan menerima satu siri kemas kini ciri utama dalam beberapa bulan akan datang, kerana gergasi teknologi itu menyatukan berbilang versi aplikasi pengambilan nota menjadi satu bahagian daripada pelanggan. OneNote telah mengalami banyak perubahan sejak beberapa tahun yang lalu. Pada tahun 2018, apabila Microsoft benar-benar mahu orang ramai menggunakan versi UWP OneNote, syarikat itu berhenti menggabungkan versi asal dan kaya ciri OneNote dengan aplikasi Office yang diprapasang. Sebaliknya, Microsoft hanya menyediakan klien UWP dan menambah ciri baharu untuk versi moden. Microsoft kemudiannya berubah

Kuasai kemahiran penting untuk pembangunan menengah Java Hikvision SDK Pengenalan: Dengan perkembangan pesat teknologi maklumat, sistem pengawasan video telah digunakan secara meluas dalam pelbagai bidang. Sebagai penyedia penyelesaian pengawasan video domestik yang terkemuka, produk dan teknologi Hikvision sentiasa menduduki kedudukan penting dalam pasaran. Untuk memenuhi keperluan projek yang berbeza, Hikvision menyediakan SDK untuk pemaju menjalankan pembangunan sekunder. Artikel ini akan memperkenalkan beberapa kemahiran penting untuk menguasai pembangunan sekunder Java Hikvision SDK, dan melampirkan contoh kod yang sepadan. 1. Fahami Hikvision

WindowsAppSDK ialah satu set alat dan API yang boleh digunakan oleh pembangun dalam aplikasi Windows mereka untuk menyediakan kefungsian "konsisten" merentas pelbagai peranti menggunakan Windows 10 (versi 1809 dan lebih baru) dan Windows 11. Sangat penting untuk memahami bahawa ia tidak menggantikan jenis aplikasi sedia ada seperti .NET atau Windows SDK, ia hanya menyediakan set alat API bersatu yang boleh digunakan untuk melengkapkan aplikasi sedia ada anda. Hari ini, Microsoft mengeluarkan versi 1.2 Windows App SDK dengan banyak ciri baharu. Sorotan keluaran ini mungkin pembangun pihak ketiga

Nama penuh sdk ialah "Kit Pembangunan Perisian", yang bermaksud "kit pembangunan perisian" dalam bahasa Cina Ia adalah satu set alat yang disediakan oleh pengilang platform perkakasan, sistem pengendalian (OS) atau bahasa pengaturcaraan. SDK membantu pembangun perisian dalam mencipta aplikasi untuk platform, sistem atau bahasa pengaturcaraan tertentu. SDK asas biasanya terdiri daripada pengkompil, penyahpepijat dan antara muka pengaturcaraan aplikasi (API), tetapi mungkin juga termasuk kandungan lain, seperti: dokumentasi, perpustakaan, persekitaran masa jalan/pembangunan, alat ujian/analisis, protokol rangkaian, dsb.
