时间:2023-03-02 09:34:39 | 栏目:C代码 | 点击:次
在VC控制台程序中调用D3DVideoRender时,需要创建新的窗口控件显示图像
#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); }
实例扩展:
#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; }