質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

1990閲覧

winapi ウィンドウがすぐ閉じてしまう

itukikikuti

総合スコア19

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2015/04/01 16:04

winapiとdirectx11でゲームを作っているんですが
アプリケーションが起動した直後に終了してしまいます。

思い当たる原因を調べても
原因は分かりませんでした。

教えてもらえたらうれしいです。
行数が多くてすみません。

lang

1#include "Application.h" 2 3int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) 4{ 5 UNREFERENCED_PARAMETER(hPrevInstance); 6 UNREFERENCED_PARAMETER(lpCmdLine); 7 8 //コンソールを作成 9#if _DEBUG 10 OpenConsole(); 11#endif 12 13 Application application = Application("DirectX Test", Rect(0, 0, 640, 480), hInstance, nCmdShow); 14 15 //メインループ 16 MSG msg = { 0 }; 17 while (application.Message(&msg)) 18 { 19 application.Render(); 20 } 21 22 application.End(); 23 24 return (int)msg.message; 25}

lang

1#include "Application.h" 2 3struct vtx3 { 4 XMFLOAT3 pos; 5}; 6 7//引数なしコンストラクタ 8Application::Application() 9{ 10 MessageBox(nullptr, "Applicationクラスのコンストラクタに引数がないので\n初期化ができませんでした。", "Error", MB_ICONSTOP); 11} 12 13//引数ありコンストラク 14Application::Application(string winTitle, RECT winRect, HINSTANCE hInstance, int cmdShow) 15{ 16 Application::hInstance = hInstance; 17 18 Application::winTitle = winTitle; 19 Application::winRect = winRect; 20 Application::winHandle = nullptr; 21 22 Application::driverType = D3D_DRIVER_TYPE_NULL; 23 Application::featureLevel = D3D_FEATURE_LEVEL_11_0; 24 Application::device = nullptr; 25 Application::immediateContext = nullptr; 26 Application::swapChain = nullptr; 27 Application::renderTargetView = nullptr; 28 Application::vertexShader = nullptr; 29 Application::pixelShader = nullptr; 30 Application::vertexLayout = nullptr; 31 Application::vertexBuffer = nullptr; 32 33 34 if (FAILED(InitWindow(cmdShow))) 35 return; 36 37 if (FAILED(InitDevice())) 38 { 39 End(); 40 return; 41 } 42} 43 44//デストラクタ 45Application::~Application() 46{ 47 48} 49 50//アプリケーションの終了処理 51void Application::End() 52{ 53 CleanupDevice(); 54 CloseConsole(); 55} 56 57//メッセージの処理 58bool Application::Message(MSG *msg) 59{ 60 while (WM_QUIT != msg->message) 61 { 62 if (PeekMessage(msg, winHandle, 0, 0, PM_REMOVE)) 63 { 64 TranslateMessage(msg); 65 DispatchMessage(msg); 66 } 67 else 68 { 69 return true; 70 } 71 } 72 73 return false; 74} 75 76//描画 77void Application::Render() 78{ 79 //バックバッファをクリア 80 float ClearColor[4] = { 0.0f, 0.125f, 0.3f, 1.0f }; 81 immediateContext->ClearRenderTargetView(renderTargetView, ClearColor); 82 83 //三角ポリゴンの描画 84 immediateContext->VSSetShader(vertexShader, nullptr, 0); 85 immediateContext->PSSetShader(pixelShader, nullptr, 0); 86 immediateContext->Draw(3, 0); 87 88 //画面に反映 89 swapChain->Present(0, 0); 90} 91 92//ウィンドウの初期化 93HRESULT Application::InitWindow(int cmdShow) 94{ 95 WNDCLASSEX winClass; 96 winClass.cbSize = sizeof(WNDCLASSEX); 97 winClass.style = CS_HREDRAW | CS_VREDRAW; 98 winClass.lpfnWndProc = WndProc; 99 winClass.cbClsExtra = 0; 100 winClass.cbWndExtra = 0; 101 winClass.hInstance = hInstance; 102 winClass.hIcon = nullptr; 103 winClass.hCursor = LoadCursor(nullptr, IDC_ARROW); 104 winClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 105 winClass.lpszMenuName = nullptr; 106 winClass.lpszClassName = "Windows_Direct3D_11_Application_Shader_Program_Class"; 107 winClass.hIconSm = nullptr; 108 if (!RegisterClassEx(&winClass)) 109 return E_FAIL; 110 111 //ウィンドウを生成 112 AdjustWindowRect(&winRect, WS_OVERLAPPEDWINDOW, false); 113 winHandle = CreateWindow("Windows_Direct3D_11_Application_Shader_Program_Class", winTitle.c_str(), 114 WS_OVERLAPPEDWINDOW, 115 CW_USEDEFAULT, CW_USEDEFAULT, winRect.right - winRect.left, winRect.bottom - winRect.top, nullptr, nullptr, hInstance, 116 nullptr); 117 118 if (!winHandle) 119 return E_FAIL; 120 121 ShowWindow(winHandle, cmdShow); 122 123 return S_OK; 124} 125 126//デバイスの初期化 127HRESULT Application::InitDevice() 128{ 129 HRESULT hr = S_OK; 130 131 RECT rc; 132 GetClientRect(winHandle, &rc); 133 UINT width = rc.right - rc.left; 134 UINT height = rc.bottom - rc.top; 135 136 UINT createDeviceFlags = 0; 137#ifdef _DEBUG 138 createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; 139#endif 140 141 //デバイスのタイプを定義 142 D3D_DRIVER_TYPE driverTypes[] = { 143 D3D_DRIVER_TYPE_HARDWARE, 144 D3D_DRIVER_TYPE_WARP, 145 D3D_DRIVER_TYPE_REFERENCE, 146 }; 147 UINT numDriverTypes = ARRAYSIZE(driverTypes); 148 149 //フューチャータイプを定義 150 D3D_FEATURE_LEVEL featureLevels[] = { 151 D3D_FEATURE_LEVEL_11_0, 152 D3D_FEATURE_LEVEL_10_1, 153 D3D_FEATURE_LEVEL_10_0, 154 }; 155 UINT numFeatureLevels = ARRAYSIZE(featureLevels); 156 157 //スワップチェインを作成 158 DXGI_SWAP_CHAIN_DESC sd; 159 ZeroMemory(&sd, sizeof(sd)); 160 sd.BufferCount = 1; 161 sd.BufferDesc.Width = width; 162 sd.BufferDesc.Height = height; 163 sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 164 sd.BufferDesc.RefreshRate.Numerator = 60; 165 sd.BufferDesc.RefreshRate.Denominator = 1; 166 sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 167 sd.OutputWindow = winHandle; 168 sd.SampleDesc.Count = 1; 169 sd.SampleDesc.Quality = 0; 170 sd.Windowed = true; 171 172 for (int i = 0; i < numDriverTypes; i++) 173 { 174 driverType = driverTypes[i]; 175 hr = D3D11CreateDeviceAndSwapChain(nullptr, driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels, 176 D3D11_SDK_VERSION, &sd, &swapChain, &device, &featureLevel, &immediateContext); 177 if (SUCCEEDED(hr)) 178 break; 179 } 180 if (FAILED(hr)) 181 return hr; 182 183 //描画ターゲットを作成 184 ID3D11Texture2D* pBackBuffer = nullptr; 185 hr = swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer); 186 if (FAILED(hr)) 187 return hr; 188 189 hr = device->CreateRenderTargetView(pBackBuffer, nullptr, &renderTargetView); 190 pBackBuffer->Release(); 191 if (FAILED(hr)) 192 return hr; 193 194 immediateContext->OMSetRenderTargets(1, &renderTargetView, nullptr); 195 196 //ビューポートを設定 197 D3D11_VIEWPORT vp; 198 vp.Width = (FLOAT)width; 199 vp.Height = (FLOAT)height; 200 vp.MinDepth = 0.0f; 201 vp.MaxDepth = 1.0f; 202 vp.TopLeftX = 0; 203 vp.TopLeftY = 0; 204 immediateContext->RSSetViewports(1, &vp); 205 206 //頂点シェーダをコンパイルする 207 ID3DBlob* pVSBlob = nullptr; 208 hr = CompileShaderFromFile("vs.fx", "VS", "vs_4_0", &pVSBlob); 209 if (FAILED(hr)) 210 { 211 MessageBox(winHandle, "頂点シェーダをコンパイル出来ませんでした", "Error", MB_ICONSTOP); 212 return hr; 213 } 214 215 //頂点シェーダを生成 216 hr = device->CreateVertexShader(pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), nullptr, &vertexShader); 217 if (FAILED(hr)) 218 { 219 pVSBlob->Release(); 220 return hr; 221 } 222 223 // Define the input layout 224 D3D11_INPUT_ELEMENT_DESC layout[] = 225 { 226 { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 227 }; 228 UINT numElements = ARRAYSIZE(layout); 229 230 //インプットレイアウトを作成 231 hr = device->CreateInputLayout(layout, numElements, pVSBlob->GetBufferPointer(), 232 pVSBlob->GetBufferSize(), &vertexLayout); 233 pVSBlob->Release(); 234 if (FAILED(hr)) 235 return hr; 236 237 //インプットレイアウトを設定 238 immediateContext->IASetInputLayout(vertexLayout); 239 240 //ピクセルシェーダをコンパイルする 241 ID3DBlob* pPSBlob = nullptr; 242 hr = CompileShaderFromFile("ps.fx", "PS", "ps_4_0", &pPSBlob); 243 if (FAILED(hr)) 244 { 245 MessageBox(winHandle, "ピクセルシェーダをコンパイル出来ませんでした", "Error", MB_ICONSTOP); 246 return hr; 247 } 248 249 //ピクセルシェーダを生成 250 hr = device->CreatePixelShader(pPSBlob->GetBufferPointer(), pPSBlob->GetBufferSize(), nullptr, &pixelShader); 251 pPSBlob->Release(); 252 if (FAILED(hr)) 253 return hr; 254 255 //三角形ポリゴンを定義 256 vtx3 vertices[] = 257 { 258 XMFLOAT3(0.0f, 0.5f, 0.5f), 259 XMFLOAT3(0.5f, -0.5f, 0.5f), 260 XMFLOAT3(-0.5f, -0.5f, 0.5f), 261 }; 262 263 //頂点バッファを生成 264 D3D11_BUFFER_DESC bd; 265 ZeroMemory(&bd, sizeof(bd)); 266 bd.Usage = D3D11_USAGE_DEFAULT; 267 bd.ByteWidth = sizeof(vtx3) * 3; 268 bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 269 bd.CPUAccessFlags = 0; 270 D3D11_SUBRESOURCE_DATA InitData; 271 ZeroMemory(&InitData, sizeof(InitData)); 272 InitData.pSysMem = vertices; 273 hr = device->CreateBuffer(&bd, &InitData, &vertexBuffer); 274 if (FAILED(hr)) 275 return hr; 276 277 //頂点バッファを設定 278 UINT stride = sizeof(vtx3); 279 UINT offset = 0; 280 immediateContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); 281 282 //プリミティブを設定 283 immediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 284 285 return S_OK; 286} 287 288//デバイスのクリーンアップ 289void Application::CleanupDevice() 290{ 291#ifdef _DEBUG 292 //デバック時は終了処理を通過しているか確認するため 293 //ビープ音を鳴らす 294 MessageBeep(MB_OK); 295#endif 296 //すべてリリースする 297 if (immediateContext) immediateContext->ClearState(); 298 299 if (vertexBuffer) vertexBuffer->Release(); 300 if (vertexLayout) vertexLayout->Release(); 301 if (vertexShader) vertexShader->Release(); 302 if (pixelShader) pixelShader->Release(); 303 if (renderTargetView) renderTargetView->Release(); 304 if (swapChain) swapChain->Release(); 305 if (immediateContext) immediateContext->Release(); 306 if (device) device->Release(); 307} 308 309//ウィンドウメッセージの処理 310LRESULT CALLBACK Application::WndProc(HWND winHandle, UINT msg, WPARAM wParam, LPARAM lParam) 311{ 312 PAINTSTRUCT ps; 313 HDC hdc; 314 switch (msg) 315 { 316 case WM_PAINT: 317 hdc = BeginPaint(winHandle, &ps); 318 EndPaint(winHandle, &ps); 319 case WM_DESTROY: 320 PostQuitMessage(0); 321 break; 322 default: 323 return DefWindowProc(winHandle, msg, wParam, lParam); 324 } 325 return 0; 326} 327 328//シェーダファイルをコンパイルする 329HRESULT Application::CompileShaderFromFile(string fileName, LPCSTR entryPoint, LPCSTR shaderModel, ID3DBlob** blobOut) 330{ 331 HRESULT hr = S_OK; 332 333 DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS; 334#ifdef _DEBUG 335 shaderFlags |= D3DCOMPILE_DEBUG; 336#endif 337 338 //シェーダファイルをコンパイルする 339 ID3DBlob *errorBlob; 340 hr = D3DX11CompileFromFile(fileName.c_str(), nullptr, nullptr, entryPoint, shaderModel, shaderFlags, 0, nullptr, blobOut, &errorBlob, nullptr); 341 if (FAILED(hr)) 342 { 343 if (errorBlob != nullptr) 344 OutputDebugString((char *)errorBlob->GetBufferPointer()); 345 if (errorBlob)errorBlob->Release(); 346 MessageBox(winHandle, "頂点レイアウトが\n作成できませんでした。", "Error", MB_ICONSTOP); 347 return hr; 348 } 349 350 if (errorBlob)errorBlob->Release(); 351 352 return hr; 353}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

WM_PAINTのcaseブロックの最後にbreakを忘れているのでそのまま通過してPostQuitMessageで終了。
だと思います。

投稿2015/04/02 07:14

toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問