タイトルバーが表示されないです

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
EKISUKE
記事: 108
登録日時: 13年前

タイトルバーが表示されないです

#1

投稿記事 by EKISUKE » 12年前

タイトル通りタイトルバーが表示されず、ウィンドウが設定した背景色で塗りつぶされてしまいます。


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
//=============================================================================
WS_OVERLAPPEDWINDOWで、タイトルバーの表示フラグが立っていると思ったのですが、
どうもウィンドウの上の角が丸いのと、
s32 w = rect.right - rect.left;
s32 h = rect.bottom - rect.top;
このふたつの値がちゃんと増えているので、タイトルバーの中身だけが描画されていない状態だと思われます。

どこがいけないのでしょうか?しょうもないミスだったらすみません。
回答お願いします。

EKISUKE
記事: 108
登録日時: 13年前

Re: タイトルバーが表示されないです

#2

投稿記事 by EKISUKE » 12年前

自己解決しました。

コード:

//-----------------------------------------------------------------------------
//! ウィンドウプロシージャ
//! @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);
 
    }
}
この部分の

コード:

 return DefWindowProc(hwnd, message, wparam, lparam);
をswitch分の外にだしたら無事描画されました。

閉鎖

“C言語何でも質問掲示板” へ戻る