阅读 218

VC中控制台程序创建窗口的实例方法

在本篇文章里小编给大家分享的是关于VC中控制台程序创建窗口的实例方法及相关代码内容,有需要的朋友学习下吧。

在VC控制台程序中调用D3DVideoRender时,需要创建新的窗口控件显示图像

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "windows.h"
#include "TCHAR.h"
  
//声明自定义消息处理函数
LRESULT CALLBACK WindowProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    );
  
int _tmain(int argc, _TCHAR* argv[])
{
    HINSTANCE hInstance;
    hInstance = GetModuleHandle(NULL);  //获取一个应用程序或动态链接库的模块句柄
    WNDCLASS Render_WND;
    Render_WND.cbClsExtra = 0;
    Render_WND.cbWndExtra = 0;
    Render_WND.hCursor = LoadCursor(hInstance, IDC_ARROW);  //鼠标风格
    Render_WND.hIcon = LoadIcon(hInstance, IDI_APPLICATION);    //图标风格
    Render_WND.lpszMenuName = NULL; //菜单名
    Render_WND.style = CS_HREDRAW | CS_VREDRAW; //窗口的风格
    Render_WND.hbrBackground = (HBRUSH)COLOR_WINDOW;    //背景色
    Render_WND.lpfnWndProc = WindowProc;    //【关键】采用自定义消息处理函数,也可以用默认的DefWindowProc
    Render_WND.lpszClassName = _T("RenderWindow");  //【关键】该窗口类的名称
    Render_WND.hInstance = hInstance;   //【关键】表示创建该窗口的程序的运行实体代号
  
    RegisterClass(&Render_WND);
  
    HWND hwnd = CreateWindow(
        _T("RenderWindow"),           //【关键】上面注册的类名lpszClassName,要完全一致 
        L"Zombie"//窗口标题文字 
        WS_OVERLAPPEDWINDOW, //窗口外观样式 
        0,             //窗口相对于父级的X坐标 
        0,             //窗口相对于父级的Y坐标 
        320,                //窗口的宽度 
        240,                //窗口的高度 
        NULL,               //没有父窗口,为NULL 
        NULL,               //没有菜单,为NULL 
        hInstance,          //当前应用程序的实例句柄 
        NULL);              //没有附加数据,为NULL 
  
    //去标题栏
    SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_CAPTION);
  
    //去边框
    SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) & ~(WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME));
  
    // 显示窗口 
    ShowWindow(hwnd, SW_SHOW);
  
    // 更新窗口 
    UpdateWindow(hwnd);
  
    // 消息循环 
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
  
    return 0;
}
  
  
// 自定义消息处理函数的实现
LRESULT CALLBACK WindowProc(
    _In_  HWND hwnd,
    _In_  UINT uMsg,
    _In_  WPARAM wParam,
    _In_  LPARAM lParam
    )
{
    switch (uMsg)
    {
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
  
        case WM_KEYDOWN:
        {
            if (wParam == VK_ESCAPE)//按Esc键退出
            {
                PostQuitMessage(0);
                return 0;
            }
        }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

实例扩展:

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
80
81
#include <iostream>
#include <Windows.h>
using namespace std;
 
 
LRESULT CALLBACK __WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
 
    PAINTSTRUCT ps;
    HDC hdc;
    switch (msg) {
    case WM_CLOSE:
        MessageBox(NULL,"WM_CLOSE", "", NULL);
        break;
    default:
        break;
    }
 
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
 
int main()
{
    // 窗口属性初始化
    HINSTANCE hIns = GetModuleHandle(0);
    WNDCLASSEX wc;
    wc.cbSize = sizeof(wc);                             // 定义结构大小
    wc.style = CS_HREDRAW | CS_VREDRAW;                 // 如果改变了客户区域的宽度或高度,则重新绘制整个窗口
    wc.cbClsExtra = 0;                                  // 窗口结构的附加字节数
    wc.cbWndExtra = 0;                                  // 窗口实例的附加字节数
    wc.hInstance = hIns;                                // 本模块的实例句柄
    wc.hIcon = NULL;                                    // 图标的句柄
    wc.hIconSm = NULL;                                  // 和窗口类关联的小图标的句柄
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;            // 背景画刷的句柄
    wc.hCursor = NULL;                                  // 光标的句柄
    wc.lpfnWndProc = __WndProc;                         // 窗口处理函数的指针
    wc.lpszMenuName = NULL;                             // 指向菜单的指针
    wc.lpszClassName = "LYSM_class";                    // 指向类名称的指针
 
    // 为窗口注册一个窗口类
    if (!RegisterClassEx(&wc)) {
        cout << "RegisterClassEx error : " << GetLastError() << endl;
    }
 
    // 创建窗口
    HWND hWnd = CreateWindowEx(
        WS_EX_TOPMOST,              // 窗口扩展样式:顶级窗口
        "LYSM_class",               // 窗口类名
        "LYSM_title",               // 窗口标题
        WS_OVERLAPPEDWINDOW,        // 窗口样式:重叠窗口
        0,                          // 窗口初始x坐标
        0,                          // 窗口初始y坐标
        800,                        // 窗口宽度
        600,                        // 窗口高度
        0,                          // 父窗口句柄
        0,                          // 菜单句柄
        hIns,                       // 与窗口关联的模块实例的句柄
        0                           // 用来传递给窗口WM_CREATE消息
    );
    if (hWnd == 0) {
        cout << "CreateWindowEx error : " << GetLastError() << endl;
    }
    UpdateWindow(hWnd);
    ShowWindow(hWnd, SW_SHOW);
 
    // 消息循环(没有会导致窗口卡死)
    MSG msg = { 0 };
    while (msg.message != WM_QUIT) {
        // 从消息队列中删除一条消息
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {           
            DispatchMessage(&msg);
        }
    }
 
     
    cout << "finished." << endl;
    getchar();
end:
 
    getchar();
    return 0;
}

到此这篇关于VC中控制台程序创建窗口的实例方法的文章就介绍到这了

原文链接:https://blog.csdn.net/jobsxiao/article/details/52651869


    文章分类
    代码人生
    版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
    相关推荐