DirectX 创建一个窗口
2016-01-17 01:14
330 查看
#include <d3d9.h> #pragma comment(lib, "d3d9.lib") PDIRECT3D9 g_D3D = nullptr; // D3D对象 PDIRECT3DDEVICE9 g_D3DDevice = nullptr; // D3D设备对象 bool InitializeD3D(HWND hWnd); // 初始化D3D void ShutdownD3D(); // 退出窗口之前释放D3D对象和D3D设备对象 void RenderScene(); // 渲染场景 // windows的消息处理函数 LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; break; default: break; } // windows消息的默认处理函数 return DefWindowProc(hWnd, msg, wParam, lParam); } void MyCreateWindow(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { // 声明一个窗口类 包含创建一个窗口所需要的相关数据信息 WNDCLASSEX wc = { sizeof(WNDCLASSEX), // 窗口类的内存空间大小(字节) CS_CLASSDC, // 窗口风格 MsgProc, // 处理消息的函数指针 0, // 类额外信息 0, // 窗口额外信息 hInstance, // 句柄,可以看作是窗口的身份标识 nullptr, // 图标样式 nullptr, // 鼠标样式 nullptr, // 背景画刷 也可以设置为一个颜色值 调用UnregisterClass后由系统删除 nullptr, // 菜单 "AppClass", // 窗口类名 nullptr // 窗口小图标 }; // 注册窗口类 RegisterClassEx(&wc); // 创建窗口 HWND hWnd = CreateWindow( "AppClass", // 窗口类名 "Window Title", // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口风格 (可重叠) 100, // 窗口左上角在屏幕坐标中的X值 100, // 窗口左上角在屏幕坐标中的Y值 640, // 窗口宽度 480, // 窗口高度 GetDesktopWindow(), // 窗口父类 nullptr, // 菜单 hInstance, // 句柄 nullptr ); if (InitializeD3D(hWnd)) { // 设置指定窗口为显示状态 ShowWindow(hWnd, SW_SHOWDEFAULT); // 发送绘制消息给窗口 UpdateWindow(hWnd); MSG msg; ZeroMemory(&msg, sizeof(msg)); while (msg.message != WM_QUIT) { if (PeekMessage( &msg, // 存储消息的结构体指针 nullptr, // 窗口消息和线程消息都会被处理 0, // 消息过滤最小值; 为0时返回所有可用信息 0, // 消息过滤最大值; 为0时返回所有可用信息 PM_REMOVE // 指定消息如何处理; 消息在处理完后从队列中移除 )) { TranslateMessage(&msg); // 变换虚拟键消息到字符消息,字符消息被发送到调用线程的消息队列 DispatchMessage(&msg); // 派发消息到窗口过程 } else { // 渲染场景 RenderScene(); } } } // 释放D3D对象和D3D设备对象资源 ShutdownD3D(); // 注销窗口类,释放窗口所占用资源 UnregisterClass("AppClass", wc.hInstance); } int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { MyCreateWindow(hInstance, hPrevInstance, lpCmdLine, nShowCmd); return 0; } bool InitializeD3D(HWND hWnd) { // 显示模式 (以像素为单位的屏幕宽高,刷新频率,surface formt) D3DDISPLAYMODE displayMode; // 创建D3D对象 获取主显卡硬件信息 最先被创建,最后被释放 g_D3D = Direct3DCreate9(D3D_SDK_VERSION); if (g_D3D == nullptr) { return false; } // 获取显示模式 if (FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT/*查询主显卡*/, &displayMode))) { return false; } // D3D 显示参数 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = true; // 是否窗口化 d3dpp.BackBufferFormat = displayMode.Format; // D3DFMT_X8R8G8B8 表示为32位RGB像素格式 每种颜色用一个字节表示 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 帧缓冲区交换方式; 可能是COPY可能是FLIP,由设备来确定适合当前情况的方式 // 创建D3D设备对象 ---- 代表显卡 if (FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice))) { return false; } return true; } void ShutdownD3D() { if (g_D3DDevice != nullptr) { g_D3DDevice->Release(); } if (g_D3D != nullptr) { g_D3D->Release(); // 最行创建, 最后释放 } } void RenderScene() { g_D3DDevice->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); g_D3DDevice->BeginScene(); // 3D图形数据 g_D3DDevice->EndScene(); // 显示backbuffer内容到屏幕 g_D3DDevice->Present(nullptr, nullptr, nullptr, nullptr); }
相关文章推荐
- C++基于Directx MMX实现的图像灰度转换代码
- 操作系统进程描述
- 为什么DirectX做的游戏,操作感总是不如Windows原生程序?
- CPU显卡内存与3DMAX渲染的关系
- DirectX--昨天、今天、明天
- Win7版IE10下载包中暗藏了DirectX 11.1
- 2点关于ipx
- OpenGL与DirectX 比较
- DirectX学习第二篇:构建框架
- DirectX Exporter for 3ds Max
- (转)DirectX下 Viewing Frustum 的详细实现
- 绘制六面体
- 【DirectX 9.0c入门教程】之一 开发环境搭建:安装vs2008 sp1和DirectX SDK
- 绘制位图 -chap4
- DirectX渲染状态设置
- 【DirectX游戏编程】游戏中摄像机类的实现(上篇:如何获得观察坐标系转换矩阵)
- openGL\DirectX游戏开发电子书下载
- 如何学好游戏3D引擎编程
- DirectX Media Objects
- Directx 9.0/9.0c 在vs2010 里面的环境配置