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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

DirectX

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

Q&A

解決済

1回答

984閲覧

DirectX9頂点を動かせない

MZK_0104

総合スコア23

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

DirectX

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

0グッド

0クリップ

投稿2020/11/07 12:13

Direct9でポリゴンの頂点を動かすために、
メインループで頂点0のx軸を+1して自動的に動かすようにしたのですが、
クライアント領域でマウスが動いた際にだけしか動きません。
プロジェクトをつくり、DirectX9の初期化とポリゴン描画、そして頂点0のx軸を動かすプログラムを書いたのですが同じ症状です。
whileで何度もx軸の値が変わっているはずなのですが、原因がまったくわかりません。
どなたか教えてください。

DirectX

1#include<windows.h> 2#include<d3d9.h> 3#pragma comment( lib, "d3d9.lib" ) 4#pragma comment( lib, "d3dx9d.lib" ) 5#pragma comment( lib, "d3dx9.lib" ) 6#pragma comment( lib, "dxerr.lib" ) 7#define D3DFVF_TLVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1) 8 9float f = 0.0f; 10 11typedef struct _D3DTLVERTEX { 12 float x,y,z; 13 float rhw; 14 DWORD color; 15 float tu, tv; 16} 17//DirectGraphics 18D3DTLVERTEX, *LPD3DTLVERTEX; 19D3DTLVERTEX v[4]; 20 21LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { 22 switch (msg) { 23 case WM_DESTROY: 24 PostQuitMessage(0); 25 return 0; 26 case WM_ERASEBKGND: 27 return 0; 28 } 29 return DefWindowProc(hwnd, msg, wp, lp); 30} 31 32int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 33 PSTR lpCmdLine, int nCmdShow) { 34 HWND hwnd; 35 MSG msg; 36 WNDCLASS winc; 37 LPDIRECT3D9 m_pD3D = NULL; 38 D3DPRESENT_PARAMETERS m_D3DPP; 39 D3DDISPLAYMODE d3ddm; 40 LPDIRECT3DDEVICE9 m_pD3DDevice = NULL; 41 42 d3ddm.Width = 1280; 43 d3ddm.Height = 720; 44 d3ddm.Format = D3DFMT_A8R8G8B8; 45 d3ddm.RefreshRate = 60; 46 winc.style = CS_HREDRAW | CS_VREDRAW; 47 winc.lpfnWndProc = WndProc; 48 winc.cbClsExtra = winc.cbWndExtra = 0; 49 winc.hInstance = hInstance; 50 winc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 51 winc.hCursor = LoadCursor(NULL, IDC_ARROW); 52 winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 53 winc.lpszMenuName = NULL; 54 winc.lpszClassName = TEXT("WCN"); 55 56 if (!RegisterClass(&winc)) return 0; 57 58 hwnd = CreateWindow( 59 TEXT("WCN"), TEXT("TEST"), 60 WS_OVERLAPPEDWINDOW, 61 175, 50, 1280, 720, NULL, NULL, 62 hInstance, NULL 63 ); 64 65 if (hwnd == NULL) return 0; 66 BOOL isFullScreen = FALSE; 67 for (int i = 0; i < __argc; i++) { 68 if (_stricmp(__argv[i], "/f") == 0) { 69 isFullScreen = TRUE; 70 break; 71 } 72 } 73 74 75 if ((m_pD3D = ::Direct3DCreate9(D3D_SDK_VERSION)) == 0) { 76 return E_FAIL; 77 } 78 79 ZeroMemory(&m_D3DPP, sizeof(D3DPRESENT_PARAMETERS)); 80 81 m_D3DPP.BackBufferCount = 1; 82 if (isFullScreen) { 83 m_D3DPP.Windowed = FALSE; 84 m_D3DPP.BackBufferWidth = 1280; 85 m_D3DPP.BackBufferHeight = 720; 86 } 87 else { 88 m_D3DPP.Windowed = TRUE; 89 } 90 m_D3DPP.BackBufferFormat = d3ddm.Format; 91 m_D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD; 92 m_D3DPP.EnableAutoDepthStencil = TRUE; 93 m_D3DPP.AutoDepthStencilFormat = D3DFMT_D16; 94 95 if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 96 D3DDEVTYPE_HAL, 97 hwnd, 98 D3DCREATE_HARDWARE_VERTEXPROCESSING, 99 &m_D3DPP, &m_pD3DDevice))) { 100 if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 101 D3DDEVTYPE_HAL, 102 hwnd, 103 D3DCREATE_SOFTWARE_VERTEXPROCESSING, 104 &m_D3DPP, &m_pD3DDevice))) { 105 if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 106 D3DDEVTYPE_REF, 107 hwnd, 108 D3DCREATE_SOFTWARE_VERTEXPROCESSING, 109 &m_D3DPP, &m_pD3DDevice))) { 110 return E_FAIL; 111 } 112 } 113 } 114 115 v[0].x = f; 116 v[0].y = 0.0f; 117 v[0].z = 0.0f; 118 v[0].rhw = 1.0f; 119 v[0].color = D3DCOLOR_RGBA(255,255,1,255); 120 v[0].tu = 0.0f; 121 v[0].tv = 0.0f; 122 123 v[1].x = 1280.0f; 124 v[1].y = 0.0f; 125 v[1].z = 0.0f; 126 v[1].rhw = 1.0f; 127 v[1].color = D3DCOLOR_RGBA(1,255,255,255); 128 v[1].tu = 1.0f; 129 v[1].tv = 0.0f; 130 131 v[2].x = 0.0f; 132 v[2].y = 720.0f; 133 v[2].z = 0.0f; 134 v[2].rhw = 1.0f; 135 v[2].color = D3DCOLOR_RGBA(255,1,255,255); 136 v[2].tu = 0.0f; 137 v[2].tv = 1.0f; 138 139 v[3].x = 1280.0f; 140 v[3].y = 720.0f; 141 v[3].z = 0.0f; 142 v[3].rhw = 1.0f; 143 v[3].color = D3DCOLOR_RGBA(1,255,1,255); 144 v[3].tu = 1.0f; 145 v[3].tv = 1.0f; 146 147 m_pD3DDevice->SetFVF( D3DFVF_TLVERTEX ); 148 149 ShowWindow(hwnd, nCmdShow); 150 151 152 while (GetMessage(&msg, NULL, 0, 0)){ 153 if (FAILED(m_pD3DDevice->Clear(0, NULL, 154 D3DCLEAR_TARGET | 155 D3DCLEAR_ZBUFFER, 156 D3DCOLOR_XRGB(0, 0, 0), 157 1.0f, 158 0))) { 159 return 0; 160 } 161 162 if (FAILED(m_pD3DDevice->BeginScene())) { 163 return 0; 164 } 165 166 m_pD3DDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, v, sizeof(D3DTLVERTEX)); 167 168 f += 1.0f; 169 if(f < 1280.0f){ 170 f = 1280.0f; 171 } 172 173 v[0].x = f; 174 175 m_pD3DDevice->EndScene(); 176 177 if (FAILED(m_pD3DDevice->Present(0, 0, 0, 0))) { 178 m_pD3DDevice->Reset(&m_D3DPP); 179 } 180 181 DispatchMessage(&msg); 182 } 183 return msg.wParam; 184}

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

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

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

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

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

guest

回答1

0

自己解決

WM_PAINT:
return 0;
を追加することで解決しましたが、ウィンドウを動かすと表示が乱れます。

投稿2020/11/08 01:17

MZK_0104

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問