DirectX9でやっています。
//-----------------------------------------------------------------------------
//!
//! @file main.cpp
//! @brief メインループ
//!
//-----------------------------------------------------------------------------
#include <windows.h> // Windowsヘッダー
//---- DirectX関連
#include <d3d9.h> // Direct3D本体
#include <d3dx9.h> // D3DXライブラリ
#pragma comment(lib, "d3d9.lib")
#define MAX_LOADSTRING 100
typedef signed char s8; //!< 8bit符号あり整数
typedef unsigned char u8; //!< 8bit符号なし整数
typedef signed short s16; //!< 16bit符号あり整数
typedef unsigned short u16; //!< 16bit符号なし整数
typedef signed int s32; //!< 32bit符号あり整数
typedef unsigned int u32; //!< 32bit符号なし整数
typedef signed long long s64; //!< 64bit符号あり整数
typedef unsigned long long u64; //!< 64bit符号なし整数
typedef float f32; //!< 単精度浮動小数点数
typedef double f64; //!< 倍精度浮動小数点数
//---- グローバル変数
HINSTANCE hInst; // 現在のインターフェイス
TCHAR szTitle[MAX_LOADSTRING]; // タイトルバーのテキスト
TCHAR szWindowClass[MAX_LOADSTRING]; // メインウィンドウクラス名
//---- DirectX関連
IDirect3D9* _pD3D = NULL; // Direct3D本体
IDirect3DDevice9* _pD3DDevice = NULL; // ビデオカードへのアクセスポインタ
//--------------------------------------------------------------
// 安全な解放
//--------------------------------------------------------------
template <typename T>
void SAFE_RELEASE(T*& p)
{
if( p!= NULL ) {
p->Release();
p = NULL;
}
}
//-----------------------------------------------------------------------------
//! Direct3D初期化
//-----------------------------------------------------------------------------
HRESULT InitD3D(HWND hWnd)
{
//-------------------------------------------------------------
// Direct3Dの作成
//-------------------------------------------------------------
_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
if( _pD3D == NULL )
{
return E_FAIL;
}
//-------------------------------------------------------------
// Direct3Dデバイスの作成
//-------------------------------------------------------------
//---- オプション設定
D3DPRESENT_PARAMETERS d3dpp; // デバイス生成用のパラメーター
ZeroMemory( &d3dpp, sizeof( d3dpp ) ); // 0で初期化
d3dpp.BackBufferWidth = 1280; // バックバッファの解像度(幅)
d3dpp.BackBufferHeight = 720; // 〃 の解像度(高さ)
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; // 〃 のピクセルフォーマット
d3dpp.BackBufferCount = 2; // 〃 の個数 1:ダブルバッファ 2:トリプルバッファ
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = true; // true:ウィンドウモード false:フルスクリーンモード
d3dpp.EnableAutoDepthStencil = true; // Zバッファの自動生成
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // Zバッファのピクセルフォーマット
d3dpp.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
d3dpp.FullScreen_RefreshRateInHz = 0;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
//---- デバイスの作成
HRESULT hr;
hr = _pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &_pD3DDevice);
if( hr != D3D_OK ) {
hr = _pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &_pD3DDevice);
if( hr != D3D_OK ) {
hr = _pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &_pD3DDevice);
if( hr != D3D_OK ) {
MessageBox(hWnd, L"D3Dデバイスの初期化ができませんでした.", L"ERROR", MB_OK);
return false;
}
}
}
//-------------------------------------------------------------
//! 入力レイアウトの作成
//-------------------------------------------------------------
return S_OK;
//return true;
}
//-----------------------------------------------------------------------------
//! Direct3D解放処理
//-----------------------------------------------------------------------------
VOID Cleanup()
{
SAFE_RELEASE(_pD3DDevice);
SAFE_RELEASE(_pD3D);
}
//-----------------------------------------------------------------------------
//! Direct3D描画処理
//-----------------------------------------------------------------------------
VOID Render()
{
IDirect3DDevice9* pD3DDevice = _pD3DDevice;
// バックバッファのクリア
pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255,255,255), 1.0f, 0);
//-------------------------------------------------------------
// 描画開始(シーンの描画)
//-------------------------------------------------------------
HRESULT hr;
hr = pD3DDevice->BeginScene();
if( hr != D3D_OK){ // デバイスLOST状態の場合は描画発行しない
return;
}
//if( SUCCEEDED(_pD3DDevice->BeginScene()))
//{
// // 描画処理を以下に記述
// _pD3DDevice->EndScene();
//}
// 描画処理を以下に記述
//-------------------------------------------------------------
// 描画終了(シーンの終了)
//-------------------------------------------------------------
pD3DDevice->EndScene();
//=============================================================
// バックバッファをスワップして画面更新
//=============================================================
pD3DDevice->Present(NULL, NULL ,NULL ,NULL);
}
//-----------------------------------------------------------------------------
//! ウィンドウプロシージャ
//! @param [in] hwnd ウィンドウハンドル
//! @param [in] message ウィンドウメッセージ
//! @param [in] wparam パラメーター1
//! @param [in] lparam パラメーター2
//! @return ウィンドウメッセージ実行後の処理コード
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
switch(message){
//-------------------------------------------------------------
case WM_PAINT: // 画面再描画
//-------------------------------------------------------------
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
}
return 0;
//-------------------------------------------------------------
case WM_KEYDOWN: // キーボード押したとき
//-------------------------------------------------------------
{
if( wparam == VK_ESCAPE ) { // ESCキー押したとき
DestroyWindow(hwnd); // ウィンドウを閉じる
}
}
break;
//-------------------------------------------------------------
case WM_DESTROY: // ウィンドウが破棄されたとき
//-------------------------------------------------------------
PostQuitMessage(0);
return 0;
//-------------------------------------------------------------
case WM_SIZE: // ウィンドウサイズが変更された瞬間
//-------------------------------------------------------------
break;
//-------------------------------------------------------------
case WM_LBUTTONDOWN: // キーボード押したとき
//-------------------------------------------------------------
break;
//-------------------------------------------------------------
case WM_CLOSE: // 閉じるボタン押したとき
//-------------------------------------------------------------
break;
//---- デフォルトのウィンドウプロシージャ
return DefWindowProc(hwnd, message, wparam, lparam);
}
}
//=============================================================================
//! アプリケーション開始エントリ
//=============================================================================
INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPTSTR, INT)
{
UNREFERENCED_PARAMETER( hInst );
// ウィンドウクラスの登録
WNDCLASSEX wc =
{
sizeof( WNDCLASSEX ),
CS_CLASSDC,
MsgProc,
0L,
0L,
GetModuleHandle( NULL ),
NULL,
NULL,
NULL,
NULL,
L"D3D Tutorial",
NULL
};
RegisterClassEx( &wc );
//-------------------------------------------------------------
// ウィンドウサイズをクライアントサイズから計算
// 正しく描画するため
//-------------------------------------------------------------
RECT rect = { 0, 0, 1280, 720 };
u32 style = WS_OVERLAPPEDWINDOW;
//u32 style = WS_THICKFRAME;
// クライアント領域からウィンドウの大きさを求める
AdjustWindowRect(&rect, style, false);
s32 w = rect.right - rect.left;
s32 h = rect.bottom - rect.top;
// アプリケーションウィンドウの作成
HWND hWnd = CreateWindowW( L"D3D Tutorial", L"D3D Tutorial 05: DirectX",
style,
100,
100,
w, h,
NULL, NULL, wc.hInstance, NULL );
// Direc3Dの初期化
if( SUCCEEDED(InitD3D( hWnd )) )
{
// ウィンドウ表示
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
// メッセージループ
MSG msg;
ZeroMemory( &msg, sizeof( msg ) );
//while(GetMessage(&msg, NULL, 0, 0) )
while( msg.message != WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage(&msg);
DispatchMessage (&msg);
}
else
Render();
if( GetKeyState(VK_ESCAPE) & 0x80 ){
break;
}
}
// 終了
Cleanup();
}
// 解放
UnregisterClass(L"D3D Tutorial", wc.hInstance );
return 0;
}
//=============================================================================
// END OF FILE
//=============================================================================
どうもウィンドウの上の角が丸いのと、
s32 w = rect.right - rect.left;
s32 h = rect.bottom - rect.top;
このふたつの値がちゃんと増えているので、タイトルバーの中身だけが描画されていない状態だと思われます。
どこがいけないのでしょうか?しょうもないミスだったらすみません。
回答お願いします。