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


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

3.5 显示窗口。

创建了窗口之后,如果要想运行时能够看见窗口,我们还需要显式的设置显示窗口:

1

2

ShowWindow(hWnd, SW_SHOW);

UpdateWindow(hWnd);

ShowWindow和UpdateWindow都是系统的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

27

28

29

30

31

32

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;

    }

     

    //创建窗口

    HWND hWnd = CreateWindowEx(0, “Main”, “Window”, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);

    //显示窗口

   ShowWindow(hWnd, SW_SHOW);

   UpdateWindow(hWnd);

}

3.6 开启消息循环

所谓的消息循环,其实就是一个死循环,不断的通过GetMessage捕捉着窗口的消息,再通过TranslateMessage将虚拟键消息转换为字符消息,然后通过DispatchMessage将消息分派给我们的窗口程序进行处理(所谓处理就是调用我们定义的窗口处理函数WinProc):

1

2

3

4

5

6

7

8

9

void Message()

{

    MSG nMsg = { 0 };

    while (GetMessage(&nMsg, NULL, 0, 0))

    {

        TranslateMessage(&nMsg);

        DispatchMessage(&nMsg);

    }

}

完成了消息循环之后,我们最终的代码如下(这里面对窗口注册的程序进行了封装,但是过程是一致的):

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

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

#include<windows.h>

HINSTANCE g_hInstance = 0;

//窗口处理函数

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

 

}

//创建主窗口

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;

}

//显示窗口

void Display(HWND hWnd)

{

    ShowWindow(hWnd, SW_SHOW);

    UpdateWindow(hWnd);

}

//消息循环

void Message()

{

    MSG nMsg = { 0 };

    while (GetMessage(&nMsg, NULL, 0, 0))

    {

        TranslateMessage(&nMsg);

        DispatchMessage(&nMsg);

    }

}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,

    _In_opt_ HINSTANCE hPrevInstance,

    _In_ LPWSTR    lpCmdLine,

    _In_ int       nCmdShow)

{

    // TODO: Place code here.

 

    g_hInstance = hInstance;

    BOOL nRet = Register("Main", WndProc);

    if (!nRet)

    {

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

        return 0;

    }

    HWND hWnd = CreateMain("Main", "window");

    Display(hWnd);

    Message();

    return 0;

}

就此我们完成了窗口处理的整个过程,运行程序,成功创建并显示的一个Windows窗口:

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

相关阅读 >>

耳机控的程序员最烦这种声音,你中招了没有

window10版本号怎么看

在windows 7的回收站中存放的是什么

win32和win64的区别是什么

system占用cpu过高怎么办

如何在macbook上安装windows?

windows update服务无法启动怎么解决?

windows远程桌面默认端口怎么修改

windows电脑关不了机怎么办

windows资源保护无法执行请求操作的解决办法

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



打赏

取消

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

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

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

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

评论

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