在d3d::InitD3D中我们谈到它完成了主显示窗口的创建,下面我们了解下窗口是如何被创建的。
窗口创建的步骤如下:
1.设计一个窗口类。
2.注册窗口。
3.创建窗口。
4.显示及更新窗口。
在d3d::InitD3D 的代码中:
// Create the main application window.
//设计窗口类
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW; //窗口类的类型
wc.lpfnWndProc = (WNDPROC)d3d::WndProc; //窗口过程函数
wc.cbClsExtra = 0; //用于设置窗口结构体附加内存空间
wc.cbWndExtra = 0; //用于设置窗口注册时分配的附加内存空间
wc.hInstance = hInstance; //窗口句柄
wc.hIcon = LoadIcon(0, IDI_APPLICATION); //窗口图标句柄
wc.hCursor = LoadCursor(0, IDC_ARROW); //鼠标句柄
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置画刷句柄
wc.lpszMenuName = 0; //窗口菜单名
wc.lpszClassName = "Direct3D9App"; //窗口类名
//注册窗口类
if( !RegisterClass(&wc) )
{
::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
return false;
}
//创建窗口
HWND hwnd = 0; //初始化句柄
hwnd = ::CreateWindow("Direct3D9App", //注册的窗口类的名字
"Direct3D9App", //窗口名,即窗口显示时看到的名字
WS_EX_TOPMOST, //窗口类型
0, 0, width, height, //前两参数是设置窗口初始的坐标,后两参数是设置窗口初始的宽长
0 /*父窗口的句柄*/, 0 /* 菜单的句柄 */, hInstance, 0 /*extra*/);
if( !hwnd )
{
::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
return false;
}
//显示及更新窗口
::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd);
——————————————————————————————
d3d::InitD3D完成的另一个功能是初始化Driect3D,
初始化Driect3D的步骤如下:
1.获得一个IDirect3D9接口指针,通过这个接口获得设备信息(后面检查设备的兼容性会用到)和创建IDirect3DDevice接口。
2.检查硬件的兼容性(显卡是否支持某种特性)。
3.填充D3DPRESENT_PARAMETERS结构。
4.创建设备。
以下是初始化Driect3D代码:
// Step 1: Create the IDirect3D9 object.
IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if( !d3d9 )
{
::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
return false;
}
// Step 2: Check for hardware vp.
D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
// Step 3: Fill out the D3DPRESENT_PARAMETERS structure.
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Step 4: Create the device.
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
deviceType, // device type
hwnd, // window associated with device
vp, // vertex processing
&d3dpp, // present parameters
device); // return created device
if( FAILED(hr) )
{
// try again using a 16-bit depth buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
device);
if( FAILED(hr) )
{
d3d9->Release(); // done with d3d9 object
::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
return false;
}
}