Win32 SDK基础(五)之关于窗口类的简单介绍


本文摘自PHP中文网,作者黄舟,侵删。

一、引言

在上一文中,我们从零开始创建了一个窗口。其中很重要的一个步骤,就是注册窗口类,如下面的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//注册窗口类

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会在操作系统内部注册大量的系统级别的窗口类,我们在进行开发时,可以直接根据窗口类名称创建这些窗口。为了解释这个问题,在上一文中的代码之上,我们引入下面的代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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属性,如下:

1

wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;

为了验证这个问题,我们新添加一个dll项目,然后定义一个如下的窗口注册函数RegisterWindow():

阅读剩余部分

相关阅读 >>

win32 sdk基础(十二)之wm_paint消息的处理(图)

win32 sdk基础(十三)之键盘和鼠标消息的详细介绍

win32 sdk基础(二)之关于cl.exe和link.exe编译和连接程序的详解(图)

win32 sdk基础(八)之 关于windows消息机制的详解(图)

win32 sdk基础(一)之windows程序分类以及库和头文件所在目录的详解

win32 sdk基础(六)之详解窗口类的查找过程和相关api

win32 sdk基础(五)之关于窗口类的简单介绍

win32 sdk基础(七)之如何创建一个窗口的子窗口的案例

win32和win64的区别是什么

win32 sdk基础(四)之如何从零开始创建windows窗口的第二步

更多相关阅读请进入《win32》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...