Win32 SDK基础(三)之如何从零开始创建windows窗口的第一步


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

一、从Windows的程序分类说起。

从高中第一次接触电脑开始(惭愧,高中才会用电脑,大学一年级才知道有QQ这么个东西,家里穷,没办法),在我的概念中电脑应该就是windows这样的。所以,直到大学临毕业,才知道原来还有linux这种操作系统,然后毕业之后开始工作才明白苹果公司也有一套自己的操作系统。所以,至今也想不明白,我怎么就踏上了码农这条不归路。然后一踏上就一发不可收拾,直到某天被拍死在沙滩上。。。

废话说多了,我们进入主题。接触过了这么多年的windows,作为码农,我们有必要先把windows的这些程序分下类:

(1)控制台程序。

这恐怕作为一个专业码农,开发过的第一种程序。我们在大学一年级第一次用C语言编写第一个“hello world”时,当时的程序就是控制台程序。他的本质是DOS程序,没有自己的窗口,你看到的输出Hello world的窗口是程序本身借用了操作系统的DOS窗口。

(2)窗口程序。

窗口程序恐怕是我们接触最多的一种程序了,从常用的office到各种可见界面的程序,都是windows下窗口程序。而本次专栏的目标,就是介绍windows窗口程序的基础。

(3)动态库程序。

这就是大名鼎鼎的dll,对于新手来说可能只见过猪跑,没吃过猪肉,对于windows的普通用户来说可能猪跑都没见过。但是作为一个程序员老油条,这应该再熟悉不过了吧。我们也会在后面介绍该类程序的开发基础。

(4)静态库程序。

这种是后缀名为lib的程序类型,属于古董级别的程序了,没有dll常用,但是依然有自己的江湖地位。同样我们后面也会介绍其开的开发基础。

介绍完了废话以及winddows程序的分类,我们开发正式开始下面的内容了。

二、从零开始创建windows的过程

本文的主要目的是介绍下自己创建windows程序的方法,也许你听说过MFC程序,这种界面框架已经将Windows界面程序的创建过程完全封装,而我们接下来要学习的就是摆脱MFC的束缚,从零开发创建一个windows界面程序。首先我们先介绍下创建Windows程序的一个步骤,在后面的文章中我会逐步实现并解释每个步骤。

创建一个Windows界面程序共分为7步:

(1)定义WinMain函数(这是windows界面程序的入口,请参照本专栏第一篇文章内容)。

(2)定义窗口处理函数。

(3)注册窗口

(4)创建窗口

(5)显示窗口

(6)编写消息循环函数

(7)处理消息

三、创建试验环境

我们先创建一个win32窗口程序。我们用VS2015的编程环境,创建win32窗口程序的步骤是文件->新建->项目,在模板里面选择Visual C++,然后选择Win32窗口程序。但是在最后一步,点击完成按钮之前,我们要选择空项目,也就是说这个项目建成后将会什么文件都没有,我们要新建一个cpp文件来从零开始创建一个窗口程序。


3.1 定义winMain函数。

我们在新添加的空的cpp文件中,添加如下程序入口的wWinMain函数:

1

2

3

4

5

6

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,

_In_opt_ HINSTANCE hPrevInstance,

_In_ LPWSTR    lpCmdLine,

_In_ int       nCmdShow)

{

}

这里我们先介绍下WinMain函数的几个参数:

hInstance ―― 当前程序的实例句柄,也就是目前程序所在的内存的位置。

hPrevInstance ――当前程序的前一个程序实例句柄,目前已经废弃,不再使用。

lpCmdLine ―― 命令行参数,我们执行程序时可以用命令行的形式传入一些参数。

nCmdShow ―― 窗口的显示方式,最大化、最小化那种。

3.2 定义窗口处理函数

窗口处理函数用来为系统回调函数,主要用来处理消息。像我们平常对程序的一系列操作,反应到程序内部,其实都是产生了一系列的操作。比如窗口关闭时会传递窗口关闭的消息,窗口最大化时也会传递最大化的消息,包括我们拖动窗口都会产生消息。而我们定义的窗口处理函数就是处理操作上述的消息,如下面所示,我们定义的窗口处理函数处理了一个WM_DESTROY消息,这是我们在关闭窗口时发送的消息,被我们的窗口处理函数捕获之后,会调用系统的APIPostQuitMessage(0),使窗口退出。

窗口处理函数共有四个参数:

hWnd ―― 是窗口的句柄。

uMsg ―― 是传入的消息,它的本质就是无符号整形的数字。

wParam、lParam ―― 是消息附带的两个参数。

1

2

3

4

5

6

7

8

9

10

11

12

13

//窗口处理函数

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);

}

我们先定义窗口处理函数,稍后再进行使用。

3.3 编写窗口注册函数

一个窗口,在创建之前需要先向操作系统进行注册,这类似现实生活中我们开公司,要先向工商局进行注册一样。wce是一个WNDCLASSEX 类型的结构体,这就是一个窗口类,包含了我们所需要的窗口信息,包括菜单、图标、背景色等等。它最主要的是两个成员,hInstance是当前程序的实例句柄,lpszClassName是我们注册的类名称,其他的这里不再解释,可参照MSDN。

我们通过RegisterClassEx()这个API将窗口类在操作系统中进行注册,并通过其返回值判断是否注册成功。我们在WinMain函数中进行窗口的注册工作,请看下面的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,

_In_opt_ HINSTANCE hPrevInstance,

_In_ LPWSTR    lpCmdLine,

_In_ int       nCmdShow)

{

    //注册窗口类

    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 = hInstance;

    wce.lpfnWndProc = wndProc;

    wce.lpszClassName = “Main”;

    wce.lpszMenuName = NULL;

    wce.style = CS_HREDRAW | CS_VREDRAW;

    ATOM nAtom = RegisterClassEx(&wce);

    if (!nAtom )

    {

        MessageBox(NULL, "注册失败", "Infor", MB_OK);

        return 0;

    }

}

3.4 创建窗口

接下来我们创建窗口,创建窗口我们使用CreateWindowEx系统API,请留意下面它的第2、3两个参数,第二个参数使我们之前注册的窗口类名称,第三个参数是窗口的标题名称,其他的是一些窗口显示的参数,这里不再详细解释。

1

2

HWND hWnd = CreateWindowEx(0, “Main”, “Window”,

WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);

以上就是Win32 SDK基础(三)之如何从零开始创建windows窗口的第一步的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

win32是什么意思?

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

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

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

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

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

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

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

关于sdk基础的详细介绍

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

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



打赏

取消

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

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

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

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

评论

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