您的位置:首页 > 其它

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  directx