服务器之家

服务器之家 > 正文

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

时间:2022-03-09 14:19     来源/作者:jobsxiao

在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中控制台程序创建窗口的实例方法的文章就介绍到这了,更多相关VC中控制台程序如何创建窗口内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

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

相关文章

热门资讯

2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
返回顶部