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

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

新規登録して質問してみよう
ただいま回答率
85.50%
DirectX

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

Q&A

解決済

1回答

809閲覧

ウィンドウの最小化で白くなる

MZK_0104

総合スコア23

DirectX

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

0グッド

0クリップ

投稿2020/05/14 13:45

最近、DirectX9にて画像を描画できるようになったのですが、
ウィンドウを最小化すると、ウィンドウが白くなりました。
前回は、ウィンドウを画面買いに出すと白くなるということについて質問しましたが、
その場合は、CALLBACK関数にちょっとだけコードを足すだけで行けました。

コードは以下の通りです。

#include<windows.h> #include<d3d9.h> #include<d3dx9.h> #pragma comment( lib, "d3d9.lib" ) #pragma comment( lib, "d3dx9d.lib" ) #pragma comment( lib, "d3dx9.lib" ) #pragma comment( lib, "dxerr.lib" ) LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_ERASEBKGND: return E_FAIL; } return DefWindowProc(hwnd, msg, wp, lp); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS winc; LPDIRECT3D9 m_pD3D = NULL; D3DPRESENT_PARAMETERS m_D3DPP; D3DDISPLAYMODE d3ddm; LPDIRECT3DDEVICE9 m_pD3DDevice = NULL; LPDIRECT3DTEXTURE9 g_pTexture = NULL; LPD3DXSPRITE g_pSprite = NULL; HRESULT Draw; RECT rc; D3DXVECTOR3 center, position; d3ddm.Width = 1920; d3ddm.Height = 1080; d3ddm.Format = D3DFMT_A8R8G8B8; d3ddm.RefreshRate = 60; winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInstance; winc.hIcon = LoadIcon(NULL, IDI_APPLICATION); winc.hCursor = LoadCursor(NULL, IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("WCN"); if (!RegisterClass(&winc)) return 0; hwnd = CreateWindow( TEXT("WCN"), TEXT("TEST"), WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, 175, 50, 1280, 720, NULL, NULL, hInstance, NULL ); if (hwnd == NULL) return 0; BOOL isFullScreen = FALSE; for (int i = 0; i < __argc; i++) { if (_stricmp(__argv[i], "/f") == 0) { isFullScreen = TRUE; break; } } if ((m_pD3D = ::Direct3DCreate9(D3D_SDK_VERSION)) == 0) { return E_FAIL; } ZeroMemory(&m_D3DPP, sizeof(D3DPRESENT_PARAMETERS)); m_D3DPP.BackBufferCount = 1; if (isFullScreen) { m_D3DPP.Windowed = FALSE; m_D3DPP.BackBufferWidth = 1280; m_D3DPP.BackBufferHeight = 720; } else { m_D3DPP.Windowed = TRUE; } m_D3DPP.BackBufferFormat = d3ddm.Format; m_D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD; m_D3DPP.EnableAutoDepthStencil = TRUE; m_D3DPP.AutoDepthStencilFormat = D3DFMT_D16; if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_D3DPP, &m_pD3DDevice))) { if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_D3DPP, &m_pD3DDevice))) { if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_D3DPP, &m_pD3DDevice))) { return E_FAIL; } } } D3DXCreateTextureFromFile(m_pD3DDevice, TEXT("BG01.png"), &g_pTexture); D3DXCreateSprite(m_pD3DDevice, &g_pSprite); if (FAILED(m_pD3DDevice->BeginScene())) { return 0; } if (FAILED(m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0))) { return 0; } g_pSprite->Begin(NULL); rc.left = 0; rc.top = 0; rc.right = 1280; rc.bottom = 720; center.x = 0; center.y = 0; position.x = 0; position.y = 0; g_pSprite->Draw(g_pTexture, &rc, &center, &position, 0xFFFFFFFF); // スプライトの描画処理 g_pSprite->End(); m_pD3DDevice->EndScene(); ShowWindow(hwnd, nCmdShow); if (FAILED(m_pD3DDevice->Present(0, 0, 0, 0))) { m_pD3DDevice->Reset(&m_D3DPP); } while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg); g_pTexture->Release(); g_pSprite->Release(); return msg.wParam; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

メッセージループの前に一度Presentを行っているだけの為、それ以降はDWMが保持している描画内容が表示されています。
おそらく最小化によりDWMが保持している描画内容がクリアされたのでしょう。

C++

1 while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg);

をやめて

C++

1 while (msg.message != WM_QUIT) 2 { 3 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 4 { 5 TranslateMessage(&msg); 6 DispatchMessage(&msg); 7 continue; 8 } 9 10 m_pD3DDevice->BeginScene(); 11 12 // ここに描画コード 13 14 m_pD3DDevice->EndScene(); 15 m_pD3DDevice->Present(NULL, NULL, NULL, NULL); 16 }

のようにメッセージループ内でPresentしてみてください。


最小化ができなくなりました...

最小化をしようとしたら、ウィンドウが再表示されます

以下のコードで最小化も復元後の再表示も問題なくできています。

C++

1 while (msg.message != WM_QUIT) 2 { 3 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 4 { 5 TranslateMessage(&msg); 6 DispatchMessage(&msg); 7 continue; 8 } 9 10 m_pD3DDevice->BeginScene(); 11 12 // ここに描画コード 13 m_pD3DDevice->Clear(0, NULL, 14 D3DCLEAR_TARGET | 15 D3DCLEAR_ZBUFFER, 16 D3DCOLOR_XRGB(0, 0, 0), 17 1.0f, 18 0); 19 g_pSprite->Begin(0); 20 g_pSprite->Draw(g_pTexture, &rc, &center, &position, 0xFFFFFFFF); 21 g_pSprite->End(); 22 23 m_pD3DDevice->EndScene(); 24 m_pD3DDevice->Present(NULL, NULL, NULL, NULL); 25 }

投稿2020/05/14 13:53

編集2020/05/15 09:45
SHOMI

総合スコア4079

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

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

MZK_0104

2020/05/15 09:31

やってみたら、 最小化ができなくなりました... 最小化をしようとしたら、ウィンドウが再表示されます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問