画面外に出た部分の描画内容の消滅
画面外に出た部分の描画内容の消滅
大変お久しぶりでございます。
現在C++でDirectXを使用しプログラミングを行っています。
ウィンドウを移動させて画面外に出た部分があるとその部分に描画されていたものが消えてしまうのを回避する方法を探していたのですがなかなか思うような情報が得られずにいます。
この現象(?)の回避する方法にはどのようなものがあるのでしょうか?
また、現象の名称をお願いします。
毎回初歩的な質問ばかりですみません。ご回答よろしくお願いします。
現在C++でDirectXを使用しプログラミングを行っています。
ウィンドウを移動させて画面外に出た部分があるとその部分に描画されていたものが消えてしまうのを回避する方法を探していたのですがなかなか思うような情報が得られずにいます。
この現象(?)の回避する方法にはどのようなものがあるのでしょうか?
また、現象の名称をお願いします。
毎回初歩的な質問ばかりですみません。ご回答よろしくお願いします。
Re: 画面外に出た部分の描画内容の消滅
[callback関数]WinProcのコードの提示をお願い致します。一般的には
"ウィンドウ全体、または一部を再描画したい"ときプログラム側で明示的に無効領域を作ることでWM_PAINTを生成する、つまり領域を描きなおすことができるようになります。[WM_PAINT が呼び出されるのは無効リージョンが存在する時です] みたいな”領域の再描画”の話だと思います。
"ウィンドウ全体、または一部を再描画したい"ときプログラム側で明示的に無効領域を作ることでWM_PAINTを生成する、つまり領域を描きなおすことができるようになります。[WM_PAINT が呼び出されるのは無効リージョンが存在する時です] みたいな”領域の再描画”の話だと思います。
Re: 画面外に出た部分の描画内容の消滅
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
//DeleteCriticalSection(&cs);
PostQuitMessage(0);
return 0;
case WM_LBUTTONDBLCLK:
dcflag[0]=1;
return 0;
case WM_RBUTTONDBLCLK:
dcflag[1]=1;
return 0;
case WM_MBUTTONDBLCLK:
dcflag[2]=1;
return 0;
}
return DefWindowProc (hWnd, msg, wParam, lParam);
}
クリティカルセクションの残骸があるのは調べていたら見つけたマルチスレッドで描画をして消えるのを防ぐという方法を試したためです。
とりあえず書いて頂いたWM_PAINTでの再描画の方法を試してみたいと思います。
Re: 画面外に出た部分の描画内容の消滅
メッセージループのコードの提示もお願い出来ますでしょうか。
(全体を1ファイルで動かせるように(テスト用に)出来ればお願い致します。)
(全体を1ファイルで動かせるように(テスト用に)出来ればお願い致します。)
Re: 画面外に出た部分の描画内容の消滅
#include <windows.h>
#include <stdio.h>
#include <d3dx9.h>
#include <shlobj.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#define APPNAME TEXT("3Dmodel")
#define MENUID TEXT("MENUBAR")
#include "../../directoryname/lib/libmain.h"
#include "dinput.h"
//#include "../../directoryname/lib/graphic.h"
//#include "../../directoryname/lib/input.h"
#include "../../directoryname/lib/string.h"
///////// メイン変数宣言
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HRESULT InitD3D(HWND,bool,int,int);
BOOL InitDirectInput(HWND);
void Inputkeyrerese();
HWND hWnd=NULL;
HWND hDeskwnd;
MSG msg;
HDC hdc;
LPPAINTSTRUCT lpaint;
//int flag;
HINSTANCE hInst;
WNDCLASSEX wc;
DWORD dwID;
LPDIRECT3D9 pD3d;
LPDIRECT3DDEVICE9 pDevice;
D3DPRESENT_PARAMETERS d3dpp;
LPDIRECTINPUT8 g_pDInput;
LPDIRECTINPUT8 g_pDMInput;
LPDIRECTINPUT8 g_pDGInput;
LPDIRECTINPUTDEVICE8 g_pDIDevice;
LPDIRECTINPUTDEVICE8 g_pDIMouse;
LPDIRECTINPUTDEVICE8 g_pDIGamepad;
BOOL CALLBACK EJCB(const DIDEVICEINSTANCE*,VOID*);
BOOL CALLBACK EACB(const DIDEVICEOBJECTINSTANCE*,VOID*);
DIDEVCAPS g_diDev;
int dcflag[3];
CRITICAL_SECTION cs;
DWORD WINAPI Rendsled(void);
////////////////////////////////////
class CustomVertex;
class Pos;
class Color;
//class Vertex;
class World;
class View;
class Proj;
//class RendTex;
class String;
//class Mouseinput;
//class Keyinuput;
//class Gamepadinout;
//extern Vertex modelmain[10000];
extern World mainworld;
extern View view2D;
extern Proj proja;
extern RendTex modelmonitex;
extern CustomVertex modelmoni[4];
extern VerBuff monivb;
extern String view3Dsta;
extern String Testst;
Keyinput Key;
Mouseinput Mouse;
Gamepadinput Pad;
void Render();
extern void Vertexset();
extern void Vertexreset();
extern void SetupMatrices();
void *pVertex;
extern void makemodelmoni();
extern void modelmonireset();
extern void modelmonidraw();
extern void MakestageView();
extern void SetstageView();
extern void teststatus();
Renderc rend;
RendTex rent;
Projection projection;
RECT rect;
RECT rectc;
RECT brect;
int WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow){
wc.cbSize =sizeof (wc);
wc.style =CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc =WndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInst;
wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName =MENUID;
wc.lpszClassName=APPNAME;
wc.hIconSm =LoadIcon(NULL,IDI_ASTERISK);
RegisterClassEx (&wc);
hWnd=CreateWindow(
APPNAME,
APPNAME,
WS_OVERLAPPEDWINDOW|WS_MAXIMIZE,
CW_USEDEFAULT,
CW_USEDEFAULT,
1382,
744,
NULL,
NULL,
hInst,
NULL);
/*manebutton(hWnd,hInst);*/
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(FAILED(InitD3D(hWnd,FALSE,rect.right-rect.left,rect.bottom-rect.top)))
{
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return 0;
}
if(FAILED(InitDirectInput(hWnd))){
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return 0;
}
ZeroMemory(&msg,sizeof(msg));
//hDeskwnd = GetDesktopWindow();
brect=rect;
Vertexset();
SetupMatrices();
makemodelmoni();
Testst.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
view3Dsta.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
MakestageView();
//CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Rendsled,NULL,0,&dwID);
//InitializeCriticalSection(&cs);
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(brect.bottom!=rectc.bottom ||brect.left!=rectc.left ||brect.right!=rectc.right ||brect.top!=rectc.top){
brect=rectc;
Vertexreset();
}
SetupMatrices();
modelmonireset();
Render();
dcflag[0]=0;
dcflag[1]=0;
dcflag[2]=0;
}
}
/*modelmoni.Texrelease();
modelmain[0].VbRelease();
modelmain[0].TexRelease();*/
Inputkeyrerese();
pDevice->Release();
pD3d->Release();
return (INT)msg.wParam;
}
/*DWORD WINAPI Rendsled(void){
EnterCriticalSection(&cs);
MSG msg={0};
int flag;
while(1){
Sleep(0);
Render();
}
LeaveCriticalSection(&cs);
return 0;
}*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
//DeleteCriticalSection(&cs);
PostQuitMessage(0);
return 0;
case WM_LBUTTONDBLCLK:
dcflag[0]=1;
return 0;
case WM_RBUTTONDBLCLK:
dcflag[1]=1;
return 0;
case WM_MBUTTONDBLCLK:
dcflag[2]=1;
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,lpaint);
if(pDevice!=0x00000000){
Render();
}
EndPaint(hWnd,lpaint);
return 0;
}
return DefWindowProc (hWnd, msg, wParam, lParam);
}
HRESULT InitD3D(HWND hWnd,bool fullScreen,int Hieght,int Width)
{
D3DDISPLAYMODE d3dMode;
if(NULL==(pD3d=Direct3DCreate9(D3D_SDK_VERSION)))
{
MessageBox(0,TEXT("Direct3Dの作成に失敗しました。"),NULL,MB_OK);
return E_FAIL;
}
if(FAILED(pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3dMode))){
return E_FAIL;
}
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferCount =1;
if(fullScreen){
d3dpp.Windowed=FALSE;
d3dpp.BackBufferHeight=Hieght;
d3dpp.BackBufferWidth=Width;
}else{
d3dpp.Windowed=TRUE;
}
d3dpp.BackBufferFormat =D3DFMT_UNKNOWN;
d3dpp.SwapEffect =D3DSWAPEFFECT_DISCARD;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
if(FAILED(pD3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,&pDevice)))
{
MessageBox(0,TEXT("HALモードでDIRECT3Dデバイスを作成できません\nREFモードで再試行します。"),NULL, MB_OK);
if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &pDevice ) ) )
{
if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &pDevice ) ) )
{
MessageBox(0,TEXT("DIRECT3Dデバイスの作成に失敗しました。"),NULL,MB_OK);
pD3d->Release();
return E_FAIL;
}
}
}
pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
return S_OK;
}
void Render(){
if(FAILED(pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(0,0,0,0),1.0f,0))){
return;
}
if(SUCCEEDED(pDevice->BeginScene())){
SetupMatrices();
modelmonidraw();
SetupMatrices();
rend.Rend(0,0,sizeof(CustomVertex),D3DFVF_CustomVertex,D3DPT_TRIANGLEFAN,0,2,modelmonitex.text.tex,monivb.vb);
/*pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
pDevice->SetTexture(0,modelmonitex.text.tex);
pDevice->SetStreamSource(0,monivb,0,sizeof(CustomVertex));
pDevice->SetFVF(D3DFVF_CustomVertex);
pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);*/
teststatus();
pDevice->EndScene();
}
//if(FAILED(pDevice->Present(NULL,NULL,hWnd,NULL))){
if(pDevice->Present(NULL,NULL,NULL,NULL)== D3DERR_DEVICELOST){
if(pDevice->TestCooperativeLevel()==D3DERR_DEVICENOTRESET){
pDevice->Reset(&d3dpp);
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(FAILED(InitD3D(hWnd,FALSE,rect.right-rect.left,rect.bottom-rect.top)))
{
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return;
}
ZeroMemory(&msg,sizeof(msg));
//hDeskwnd = GetDesktopWindow();
brect=rect;
Vertexset();
SetupMatrices();
makemodelmoni();
Testst.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
view3Dsta.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
MakestageView();
}
else
{
return;
}
}
//}
}
BOOL InitDirectInput(HWND hWnd)
{
HINSTANCE hInst;
HRESULT hr;
hInst = (HINSTANCE)GetWindowLong( hWnd , GWL_HINSTANCE );
hr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDInput , NULL );
if ( FAILED( hr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
hr = g_pDInput->CreateDevice( GUID_SysKeyboard , &g_pDIDevice , NULL );
if ( FAILED( hr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create DirectInput device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIDevice!=0x00000000){
hr = g_pDIDevice->SetDataFormat( &c_dfDIKeyboard );
if ( FAILED( hr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
Key.Makedevice(DISCL_FOREGROUND /*| DISCL_NONEXCLUSIVE*/);
}
HRESULT mhr;
mhr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDMInput , NULL );
if ( FAILED( mhr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
mhr = g_pDMInput->CreateDevice( GUID_SysMouse , &g_pDIMouse , NULL );
if ( FAILED( mhr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create DirectInput device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIMouse!=0x00000000){
mhr = g_pDIMouse->SetDataFormat( &c_dfDIMouse );
if ( FAILED( mhr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
/*g_pDIMouse->SetDataFormat( &c_dfDIMouse );
g_pDIMouse->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
Testmouse.diprop.diph.dwSize=sizeof(Testmouse.diprop);
Testmouse.diprop.diph.dwHeaderSize=sizeof(Testmouse.diprop.diph);
Testmouse.diprop.diph.dwObj=0;
Testmouse.diprop.diph.dwHow=DIPH_DEVICE;
Testmouse.diprop.dwData=DIPROPAXISMODE_REL;
g_pDIMouse->SetProperty(DIPROP_AXISMODE, &Testmouse.diprop.diph);
g_pDIMouse->Acquire();*/
Mouse.Makedevice(DISCL_FOREGROUND/* | DISCL_NONEXCLUSIVE*/,sizeof(Mouse.diprop),sizeof(Mouse.diprop.diph),0,DIPH_DEVICE,DIPROPAXISMODE_REL,0);
}
/*Testmouse.AcqMouse(DIPROP_AXISMODE);*/
HINSTANCE hInstg;
HRESULT ghr;
hInstg =(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
ghr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDGInput , NULL );
if ( FAILED( ghr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
ghr = g_pDGInput->EnumDevices(DI8DEVCLASS_GAMECTRL,EJCB,NULL,DIEDFL_ATTACHEDONLY);
if ( FAILED( ghr ) ){
MessageBox( hWnd , TEXT("Can't create Device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIGamepad!=0x00000000){
ghr = g_pDIGamepad->SetDataFormat( &c_dfDIJoystick );
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
Pad.Makedevice(DISCL_FOREGROUND);
g_diDev.dwSize=sizeof(DIDEVCAPS);
ghr =g_pDIGamepad->GetCapabilities(&g_diDev);
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create device capabilities.") , TEXT("Error"), MB_OK );
return FALSE;
}
ghr =g_pDIGamepad->EnumObjects(EACB,(void*)hWnd,DIDFT_AXIS);
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data property.") , TEXT("Error"), MB_OK );
return FALSE;
}
ghr = g_pDIGamepad->Poll();
if ( FAILED( ghr ) ){
ghr=g_pDIGamepad->Acquire();
while(ghr==DIERR_INPUTLOST){
ghr=g_pDIGamepad->Acquire();
}
}
}
return TRUE;
}
void Inputkeyrerese(){
g_pDIDevice->Unacquire();
if ( g_pDIDevice != NULL ){
g_pDIDevice->Release();}
g_pDIMouse->Unacquire();
if ( g_pDIMouse != NULL ){
g_pDIMouse->Release();}
if ( g_pDInput != NULL ){
g_pDInput->Release();
}
if ( g_pDMInput != NULL ){
g_pDMInput->Release();
}
};
BOOL CALLBACK EJCB(const DIDEVICEINSTANCE *pdidInstance,VOID *pContext){
HRESULT hr;
hr=g_pDGInput->CreateDevice( pdidInstance->guidInstance,&g_pDIGamepad,NULL);
if(FAILED(hr)) return DIENUM_CONTINUE;
return DIENUM_STOP;
}
BOOL CALLBACK EACB(const DIDEVICEOBJECTINSTANCE *pdidoi, VOID *pContext){
HRESULT hr;
DIPROPRANGE diprg;
diprg.diph.dwSize =sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize =sizeof(DIPROPHEADER);
diprg.diph.dwHow =DIPH_BYID;
diprg.diph.dwObj =pdidoi->dwType;
diprg.lMin =0-1000;
diprg.lMax =0+1000;
hr = g_pDIDevice->SetProperty(DIPROP_RANGE,&diprg.diph);
if(FAILED(hr)) return DIENUM_STOP;
return DIENUM_CONTINUE;
}
関数部分は名前から大体内容がわかるようにしてあるのでご自身の都合のよいように置き換えてください。おそらくそれで動くと思います。
色々試しながら組み立てているので非常に効率の悪い見づらいコードですが…。
WM_PAINTの方はやってみて成功はしましたが、ウィンドウを画面内に戻したときの再描画にラグがあるのが多少気になる感じでした。
ソースを丸投げしたみたいですみません。
Re: 画面外に出た部分の描画内容の消滅
#include <windows.h>
#include <stdio.h>
#include <d3dx9.h>
#include <shlobj.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#define APPNAME TEXT("3Dmodel")
#define MENUID TEXT("MENUBAR")
#include "../../directoryname/lib/libmain.h"
#include "dinput.h"
#include "../../directoryname/lib/string.h"
///////// メイン変数宣言
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HRESULT InitD3D(HWND,bool,int,int);
BOOL InitDirectInput(HWND);
void Inputkeyrerese();
HWND hWnd=NULL;
HWND hDeskwnd;
MSG msg;
HDC hdc;
LPPAINTSTRUCT lpaint;
//int flag;
HINSTANCE hInst;
WNDCLASSEX wc;
DWORD dwID;
LPDIRECT3D9 pD3d;
LPDIRECT3DDEVICE9 pDevice;
D3DPRESENT_PARAMETERS d3dpp;
LPDIRECTINPUT8 g_pDInput;
LPDIRECTINPUT8 g_pDMInput;
LPDIRECTINPUT8 g_pDGInput;
LPDIRECTINPUTDEVICE8 g_pDIDevice;
LPDIRECTINPUTDEVICE8 g_pDIMouse;
LPDIRECTINPUTDEVICE8 g_pDIGamepad;
BOOL CALLBACK EJCB(const DIDEVICEINSTANCE*,VOID*);
BOOL CALLBACK EACB(const DIDEVICEOBJECTINSTANCE*,VOID*);
DIDEVCAPS g_diDev;
int dcflag[3];
CRITICAL_SECTION cs;
DWORD WINAPI Rendsled(void);
////////////////////////////////////
Keyinput Key;
Mouseinput Mouse;
Gamepadinput Pad;
void Render();
void *pVertex;
Renderc rend;
RendTex rent;
Projection projection;
RECT rect;
RECT rectc;
RECT brect;
int WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow){
wc.cbSize =sizeof (wc);
wc.style =CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc =WndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInst;
wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName =MENUID;
wc.lpszClassName=APPNAME;
wc.hIconSm =LoadIcon(NULL,IDI_ASTERISK);
RegisterClassEx (&wc);
hWnd=CreateWindow(
APPNAME,
APPNAME,
WS_OVERLAPPEDWINDOW|WS_MAXIMIZE,
CW_USEDEFAULT,
CW_USEDEFAULT,
1382,
744,
NULL,
NULL,
hInst,
NULL);
/*manebutton(hWnd,hInst);*/
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(FAILED(InitD3D(hWnd,FALSE,rect.right-rect.left,rect.bottom-rect.top)))
{
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return 0;
}
if(FAILED(InitDirectInput(hWnd))){
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return 0;
}
ZeroMemory(&msg,sizeof(msg));
//hDeskwnd = GetDesktopWindow();
brect=rect;
Vertexset();
//SetupMatrices();
//makemodelmoni();
//Testst.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
//view3Dsta.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
//MakestageView();
//CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Rendsled,NULL,0,&dwID);
//InitializeCriticalSection(&cs);
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(brect.bottom!=rectc.bottom ||brect.left!=rectc.left ||brect.right!=rectc.right ||brect.top!=rectc.top){
brect=rectc;
//Vertexreset();
}
//SetupMatrices();
//modelmonireset();
Render();
dcflag[0]=0;
dcflag[1]=0;
dcflag[2]=0;
}
}
/*modelmoni.Texrelease();
modelmain[0].VbRelease();
modelmain[0].TexRelease();*/
Inputkeyrerese();
pDevice->Release();
pD3d->Release();
return (INT)msg.wParam;
}
/*DWORD WINAPI Rendsled(void){
EnterCriticalSection(&cs);
MSG msg={0};
int flag;
while(1){
Sleep(0);
Render();
}
LeaveCriticalSection(&cs);
return 0;
}*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
//DeleteCriticalSection(&cs);
PostQuitMessage(0);
return 0;
case WM_LBUTTONDBLCLK:
dcflag[0]=1;
return 0;
case WM_RBUTTONDBLCLK:
dcflag[1]=1;
return 0;
case WM_MBUTTONDBLCLK:
dcflag[2]=1;
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,lpaint);
if(pDevice!=0x00000000){
Render();
}
EndPaint(hWnd,lpaint);
return 0;
}
return DefWindowProc (hWnd, msg, wParam, lParam);
}
HRESULT InitD3D(HWND hWnd,bool fullScreen,int Hieght,int Width)
{
D3DDISPLAYMODE d3dMode;
if(NULL==(pD3d=Direct3DCreate9(D3D_SDK_VERSION)))
{
MessageBox(0,TEXT("Direct3Dの作成に失敗しました。"),NULL,MB_OK);
return E_FAIL;
}
if(FAILED(pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3dMode))){
return E_FAIL;
}
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferCount =1;
if(fullScreen){
d3dpp.Windowed=FALSE;
d3dpp.BackBufferHeight=Hieght;
d3dpp.BackBufferWidth=Width;
}else{
d3dpp.Windowed=TRUE;
}
d3dpp.BackBufferFormat =D3DFMT_UNKNOWN;
d3dpp.SwapEffect =D3DSWAPEFFECT_DISCARD;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
if(FAILED(pD3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,&pDevice)))
{
MessageBox(0,TEXT("HALモードでDIRECT3Dデバイスを作成できません\nREFモードで再試行します。"),NULL, MB_OK);
if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &pDevice ) ) )
{
if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &pDevice ) ) )
{
MessageBox(0,TEXT("DIRECT3Dデバイスの作成に失敗しました。"),NULL,MB_OK);
pD3d->Release();
return E_FAIL;
}
}
}
pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
return S_OK;
}
void Render(){
if(FAILED(pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(0,0,0,0),1.0f,0))){
return;
}
if(SUCCEEDED(pDevice->BeginScene())){
SetupMatrices();
modelmonidraw();
SetupMatrices();
rend.Rend(0,0,sizeof(CustomVertex),D3DFVF_CustomVertex,D3DPT_TRIANGLEFAN,0,2,modelmonitex.text.tex,monivb.vb);
//teststatus();
pDevice->EndScene();
}
//if(FAILED(pDevice->Present(NULL,NULL,hWnd,NULL))){
if(pDevice->Present(NULL,NULL,NULL,NULL)== D3DERR_DEVICELOST){
if(pDevice->TestCooperativeLevel()==D3DERR_DEVICENOTRESET){
pDevice->Reset(&d3dpp);
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(FAILED(InitD3D(hWnd,FALSE,rect.right-rect.left,rect.bottom-rect.top)))
{
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return;
}
ZeroMemory(&msg,sizeof(msg));
//hDeskwnd = GetDesktopWindow();
brect=rect;
Vertexset();
SetupMatrices();
makemodelmoni();
Testst.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
view3Dsta.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
MakestageView();
}
else
{
return;
}
}
//}
}
BOOL InitDirectInput(HWND hWnd)
{
HINSTANCE hInst;
HRESULT hr;
hInst = (HINSTANCE)GetWindowLong( hWnd , GWL_HINSTANCE );
hr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDInput , NULL );
if ( FAILED( hr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
hr = g_pDInput->CreateDevice( GUID_SysKeyboard , &g_pDIDevice , NULL );
if ( FAILED( hr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create DirectInput device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIDevice!=0x00000000){
hr = g_pDIDevice->SetDataFormat( &c_dfDIKeyboard );
if ( FAILED( hr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
Key.Makedevice(DISCL_FOREGROUND /*| DISCL_NONEXCLUSIVE*/);
}
HRESULT mhr;
mhr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDMInput , NULL );
if ( FAILED( mhr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
mhr = g_pDMInput->CreateDevice( GUID_SysMouse , &g_pDIMouse , NULL );
if ( FAILED( mhr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create DirectInput device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIMouse!=0x00000000){
mhr = g_pDIMouse->SetDataFormat( &c_dfDIMouse );
if ( FAILED( mhr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
Mouse.Makedevice(DISCL_FOREGROUND/* | DISCL_NONEXCLUSIVE*/,sizeof(Mouse.diprop),sizeof(Mouse.diprop.diph),0,DIPH_DEVICE,DIPROPAXISMODE_REL,0);
}
/*Testmouse.AcqMouse(DIPROP_AXISMODE);*/
HINSTANCE hInstg;
HRESULT ghr;
hInstg =(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
ghr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDGInput , NULL );
if ( FAILED( ghr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
ghr = g_pDGInput->EnumDevices(DI8DEVCLASS_GAMECTRL,EJCB,NULL,DIEDFL_ATTACHEDONLY);
if ( FAILED( ghr ) ){
MessageBox( hWnd , TEXT("Can't create Device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIGamepad!=0x00000000){
ghr = g_pDIGamepad->SetDataFormat( &c_dfDIJoystick );
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
Pad.Makedevice(DISCL_FOREGROUND);
g_diDev.dwSize=sizeof(DIDEVCAPS);
ghr =g_pDIGamepad->GetCapabilities(&g_diDev);
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create device capabilities.") , TEXT("Error"), MB_OK );
return FALSE;
}
ghr =g_pDIGamepad->EnumObjects(EACB,(void*)hWnd,DIDFT_AXIS);
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data property.") , TEXT("Error"), MB_OK );
return FALSE;
}
ghr = g_pDIGamepad->Poll();
if ( FAILED( ghr ) ){
ghr=g_pDIGamepad->Acquire();
while(ghr==DIERR_INPUTLOST){
ghr=g_pDIGamepad->Acquire();
}
}
}
return TRUE;
}
void Inputkeyrerese(){
g_pDIDevice->Unacquire();
if ( g_pDIDevice != NULL ){
g_pDIDevice->Release();}
g_pDIMouse->Unacquire();
if ( g_pDIMouse != NULL ){
g_pDIMouse->Release();}
if ( g_pDInput != NULL ){
g_pDInput->Release();
}
if ( g_pDMInput != NULL ){
g_pDMInput->Release();
}
};
BOOL CALLBACK EJCB(const DIDEVICEINSTANCE *pdidInstance,VOID *pContext){
HRESULT hr;
hr=g_pDGInput->CreateDevice( pdidInstance->guidInstance,&g_pDIGamepad,NULL);
if(FAILED(hr)) return DIENUM_CONTINUE;
return DIENUM_STOP;
}
BOOL CALLBACK EACB(const DIDEVICEOBJECTINSTANCE *pdidoi, VOID *pContext){
HRESULT hr;
DIPROPRANGE diprg;
diprg.diph.dwSize =sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize =sizeof(DIPROPHEADER);
diprg.diph.dwHow =DIPH_BYID;
diprg.diph.dwObj =pdidoi->dwType;
diprg.lMin =0-1000;
diprg.lMax =0+1000;
hr = g_pDIDevice->SetProperty(DIPROP_RANGE,&diprg.diph);
if(FAILED(hr)) return DIENUM_STOP;
return DIENUM_CONTINUE;
}
Re: 画面外に出た部分の描画内容の消滅
私の環境はhttp://dixq.net/forum/viewtopic.php?f=3&t=18717です。
PCとVisualStudioのスペックが違うのか
のせいか動かせない。Debug不可能でDirectXについては私は勉強中で貴殿のほうが詳しいと思います。詳しい方のアドバイスを待ちましょう。
(再描画のラグの件ですが
”BOOL InvalidateRect(HWND hWnd , CONST RECT *lpRect , BOOL bErase);
hWnd には、無効化の対象となるウィンドウのハンドルを指定します
NULL を指定した場合、全てのウィンドウを無効化します
lpRect には、無効化する長方形をあらわす RECT 構造体のポインタを指定します
この引数をNULLにするとクライアント領域全体が対象になります
bErase を TRUE にすると BeginPaint() が呼び出されたときに背景を消去します
FALSE を指定すれば、背景はそのまま残ります
戻り値は、成功すれば 0 以外、失敗すれば 0 が返ります”とあったのが気になる
かなと思います)
PCとVisualStudioのスペックが違うのか
#include "../../directoryname/lib/libmain.h"
#include "dinput.h"
#include "../../directoryname/lib/string.h"
(再描画のラグの件ですが
”BOOL InvalidateRect(HWND hWnd , CONST RECT *lpRect , BOOL bErase);
hWnd には、無効化の対象となるウィンドウのハンドルを指定します
NULL を指定した場合、全てのウィンドウを無効化します
lpRect には、無効化する長方形をあらわす RECT 構造体のポインタを指定します
この引数をNULLにするとクライアント領域全体が対象になります
bErase を TRUE にすると BeginPaint() が呼び出されたときに背景を消去します
FALSE を指定すれば、背景はそのまま残ります
戻り値は、成功すれば 0 以外、失敗すれば 0 が返ります”とあったのが気になる
かなと思います)
Re: 画面外に出た部分の描画内容の消滅
すみません。リンクを間違えました。http://dixq.net/forum/viewtopic.php?f=3&t=18709
Re: 画面外に出た部分の描画内容の消滅
あ、すみませんそのヘッダーファイルは自作の物なのでインクルード宣言は削除してください。消し忘れていました。
InvalidateRectですか…調べて検証してみますね。
詳しく解説ありがとうございます。
InvalidateRectですか…調べて検証してみますね。
詳しく解説ありがとうございます。
Re: 画面外に出た部分の描画内容の消滅
VS2008では動かない。.hが足りてないかなんとかの”依存症”みたいです。(VS2015はDirectX11を使っていて設定したくないのでごめん)詳しい方のアドバイスをお待ちください。
Re: 画面外に出た部分の描画内容の消滅
リンク先見ましたがVS2008の方はDirectX9で設定してあるんですよね?だったら動くはずなのですが…
…VS2010で書いたコードだから動かないのか…?
取り敢えず試せること試しながら詳しい人のアドバイス待ちますね。本当にありがとうございます。
…VS2010で書いたコードだから動かないのか…?
取り敢えず試せること試しながら詳しい人のアドバイス待ちますね。本当にありがとうございます。
Re: 画面外に出た部分の描画内容の消滅
リンク先見ましたがVS2008の方はDirectX9で設定してあるんですよね?だったら動くはずなのですが…
…VS2010で書いたコードだから動かないのか…?
取り敢えず試せること試しながら詳しい人のアドバイス待ちますね。本当にありがとうございます。
…VS2010で書いたコードだから動かないのか…?
取り敢えず試せること試しながら詳しい人のアドバイス待ちますね。本当にありがとうございます。
Re: 画面外に出た部分の描画内容の消滅
#include <windows.h>
#include <stdio.h>
#include <d3dx9.h>
#include <shlobj.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#define APPNAME TEXT("3Dmodel")
#define MENUID TEXT("MENUBAR")
#include "../../directoryname/lib/libmain.h"
#include "dinput.h"
#include "../../directoryname/lib/string.h"
///////// メイン変数宣言
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HRESULT InitD3D(HWND,bool,int,int);
BOOL InitDirectInput(HWND);
void Inputkeyrerese();
HWND hWnd=NULL;
HWND hDeskwnd;
MSG msg;
HDC hdc;
LPPAINTSTRUCT lpaint;
//int flag;
HINSTANCE hInst;
WNDCLASSEX wc;
DWORD dwID;
LPDIRECT3D9 pD3d;
LPDIRECT3DDEVICE9 pDevice;
D3DPRESENT_PARAMETERS d3dpp;
LPDIRECTINPUT8 g_pDInput;
LPDIRECTINPUT8 g_pDMInput;
LPDIRECTINPUT8 g_pDGInput;
LPDIRECTINPUTDEVICE8 g_pDIDevice;
LPDIRECTINPUTDEVICE8 g_pDIMouse;
LPDIRECTINPUTDEVICE8 g_pDIGamepad;
BOOL CALLBACK EJCB(const DIDEVICEINSTANCE*,VOID*);
BOOL CALLBACK EACB(const DIDEVICEOBJECTINSTANCE*,VOID*);
DIDEVCAPS g_diDev;
int dcflag[3];
CRITICAL_SECTION cs;
DWORD WINAPI Rendsled(void);
////////////////////////////////////
Keyinput Key;
Mouseinput Mouse;
Gamepadinput Pad;
void Render();
void *pVertex;
Renderc rend;
RendTex rent;
Projection projection;
RECT rect;
RECT rectc;
RECT brect;
int WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow){
wc.cbSize =sizeof (wc);
wc.style =CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc =WndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInst;
wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName =MENUID;
wc.lpszClassName=APPNAME;
wc.hIconSm =LoadIcon(NULL,IDI_ASTERISK);
RegisterClassEx (&wc);
hWnd=CreateWindow(
APPNAME,
APPNAME,
WS_OVERLAPPEDWINDOW|WS_MAXIMIZE,
CW_USEDEFAULT,
CW_USEDEFAULT,
1382,
744,
NULL,
NULL,
hInst,
NULL);
/*manebutton(hWnd,hInst);*/
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(FAILED(InitD3D(hWnd,FALSE,rect.right-rect.left,rect.bottom-rect.top)))
{
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return 0;
}
if(FAILED(InitDirectInput(hWnd))){
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return 0;
}
ZeroMemory(&msg,sizeof(msg));
//hDeskwnd = GetDesktopWindow();
brect=rect;
//Vertexset();
//SetupMatrices();
//makemodelmoni();
//Testst.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
//view3Dsta.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
//MakestageView();
//CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Rendsled,NULL,0,&dwID);
//InitializeCriticalSection(&cs);
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(brect.bottom!=rectc.bottom ||brect.left!=rectc.left ||brect.right!=rectc.right ||brect.top!=rectc.top){
brect=rectc;
//Vertexreset();
}
//SetupMatrices();
//modelmonireset();
Render();
dcflag[0]=0;
dcflag[1]=0;
dcflag[2]=0;
}
}
/*modelmoni.Texrelease();
modelmain[0].VbRelease();
modelmain[0].TexRelease();*/
Inputkeyrerese();
pDevice->Release();
pD3d->Release();
return (INT)msg.wParam;
}
/*DWORD WINAPI Rendsled(void){
EnterCriticalSection(&cs);
MSG msg={0};
int flag;
while(1){
Sleep(0);
Render();
}
LeaveCriticalSection(&cs);
return 0;
}*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
//DeleteCriticalSection(&cs);
PostQuitMessage(0);
return 0;
case WM_LBUTTONDBLCLK:
dcflag[0]=1;
return 0;
case WM_RBUTTONDBLCLK:
dcflag[1]=1;
return 0;
case WM_MBUTTONDBLCLK:
dcflag[2]=1;
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,lpaint);
if(pDevice!=0x00000000){
Render();
}
EndPaint(hWnd,lpaint);
return 0;
}
return DefWindowProc (hWnd, msg, wParam, lParam);
}
HRESULT InitD3D(HWND hWnd,bool fullScreen,int Hieght,int Width)
{
D3DDISPLAYMODE d3dMode;
if(NULL==(pD3d=Direct3DCreate9(D3D_SDK_VERSION)))
{
MessageBox(0,TEXT("Direct3Dの作成に失敗しました。"),NULL,MB_OK);
return E_FAIL;
}
if(FAILED(pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3dMode))){
return E_FAIL;
}
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferCount =1;
if(fullScreen){
d3dpp.Windowed=FALSE;
d3dpp.BackBufferHeight=Hieght;
d3dpp.BackBufferWidth=Width;
}else{
d3dpp.Windowed=TRUE;
}
d3dpp.BackBufferFormat =D3DFMT_UNKNOWN;
d3dpp.SwapEffect =D3DSWAPEFFECT_DISCARD;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
if(FAILED(pD3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,&pDevice)))
{
MessageBox(0,TEXT("HALモードでDIRECT3Dデバイスを作成できません\nREFモードで再試行します。"),NULL, MB_OK);
if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &pDevice ) ) )
{
if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &pDevice ) ) )
{
MessageBox(0,TEXT("DIRECT3Dデバイスの作成に失敗しました。"),NULL,MB_OK);
pD3d->Release();
return E_FAIL;
}
}
}
pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
return S_OK;
}
void Render(){
if(FAILED(pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(0,0,0,0),1.0f,0))){
return;
}
if(SUCCEEDED(pDevice->BeginScene())){
//SetupMatrices();
//modelmonidraw();
//SetupMatrices();
//teststatus();
pDevice->EndScene();
}
//if(FAILED(pDevice->Present(NULL,NULL,hWnd,NULL))){
if(pDevice->Present(NULL,NULL,NULL,NULL)== D3DERR_DEVICELOST){
if(pDevice->TestCooperativeLevel()==D3DERR_DEVICENOTRESET){
pDevice->Reset(&d3dpp);
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(FAILED(InitD3D(hWnd,FALSE,rect.right-rect.left,rect.bottom-rect.top)))
{
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return;
}
ZeroMemory(&msg,sizeof(msg));
//hDeskwnd = GetDesktopWindow();
brect=rect;
//Vertexset();
//SetupMatrices();
//makemodelmoni();
//MakestageView();
}
else
{
return;
}
}
//}
}
BOOL InitDirectInput(HWND hWnd)
{
HINSTANCE hInst;
HRESULT hr;
hInst = (HINSTANCE)GetWindowLong( hWnd , GWL_HINSTANCE );
hr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDInput , NULL );
if ( FAILED( hr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
hr = g_pDInput->CreateDevice( GUID_SysKeyboard , &g_pDIDevice , NULL );
if ( FAILED( hr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create DirectInput device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIDevice!=0x00000000){
hr = g_pDIDevice->SetDataFormat( &c_dfDIKeyboard );
if ( FAILED( hr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK);
return FALSE;
}
HRESULT mhr;
mhr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDMInput , NULL );
if ( FAILED( mhr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
mhr = g_pDMInput->CreateDevice( GUID_SysMouse , &g_pDIMouse , NULL );
if ( FAILED( mhr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create DirectInput device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIMouse!=0x00000000){
mhr = g_pDIMouse->SetDataFormat( &c_dfDIMouse );
if ( FAILED( mhr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
}
HINSTANCE hInstg;
HRESULT ghr;
hInstg =(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
ghr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDGInput , NULL );
if ( FAILED( ghr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
ghr = g_pDGInput->EnumDevices(DI8DEVCLASS_GAMECTRL,EJCB,NULL,DIEDFL_ATTACHEDONLY);
if ( FAILED( ghr ) ){
MessageBox( hWnd , TEXT("Can't create Device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIGamepad!=0x00000000){
ghr = g_pDIGamepad->SetDataFormat( &c_dfDIJoystick );
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
g_diDev.dwSize=sizeof(DIDEVCAPS);
ghr =g_pDIGamepad->GetCapabilities(&g_diDev);
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create device capabilities.") , TEXT("Error"), MB_OK );
return FALSE;
}
ghr =g_pDIGamepad->EnumObjects(EACB,(void*)hWnd,DIDFT_AXIS);
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data property.") , TEXT("Error"), MB_OK );
return FALSE;
}
ghr = g_pDIGamepad->Poll();
if ( FAILED( ghr ) ){
ghr=g_pDIGamepad->Acquire();
while(ghr==DIERR_INPUTLOST){
ghr=g_pDIGamepad->Acquire();
}
}
}
return TRUE;
}
void Inputkeyrerese(){
g_pDIDevice->Unacquire();
if ( g_pDIDevice != NULL ){
g_pDIDevice->Release();}
g_pDIMouse->Unacquire();
if ( g_pDIMouse != NULL ){
g_pDIMouse->Release();}
if ( g_pDInput != NULL ){
g_pDInput->Release();
}
if ( g_pDMInput != NULL ){
g_pDMInput->Release();
}
};
BOOL CALLBACK EJCB(const DIDEVICEINSTANCE *pdidInstance,VOID *pContext){
HRESULT hr;
hr=g_pDGInput->CreateDevice( pdidInstance->guidInstance,&g_pDIGamepad,NULL);
if(FAILED(hr)) return DIENUM_CONTINUE;
return DIENUM_STOP;
}
BOOL CALLBACK EACB(const DIDEVICEOBJECTINSTANCE *pdidoi, VOID *pContext){
HRESULT hr;
DIPROPRANGE diprg;
diprg.diph.dwSize =sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize =sizeof(DIPROPHEADER);
diprg.diph.dwHow =DIPH_BYID;
diprg.diph.dwObj =pdidoi->dwType;
diprg.lMin =0-1000;
diprg.lMax =0+1000;
hr = g_pDIDevice->SetProperty(DIPROP_RANGE,&diprg.diph);
if(FAILED(hr)) return DIENUM_STOP;
return DIENUM_CONTINUE;
}
Re: 画面外に出た部分の描画内容の消滅
#include <windows.h>
#include <stdio.h>
#include <d3dx9.h>
#include <shlobj.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
///////// メイン変数宣言
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HRESULT InitD3D(HWND,bool,int,int);
BOOL InitDirectInput(HWND);
void Inputkeyrerese();
HWND hWnd=NULL;
HWND hDeskwnd;
MSG msg;
HDC hdc;
LPPAINTSTRUCT lpaint;
//int flag;
HINSTANCE hInst;
WNDCLASSEX wc;
DWORD dwID;
LPDIRECT3D9 pD3d;
LPDIRECT3DDEVICE9 pDevice;
D3DPRESENT_PARAMETERS d3dpp;
LPDIRECTINPUT8 g_pDInput;
LPDIRECTINPUT8 g_pDMInput;
LPDIRECTINPUT8 g_pDGInput;
LPDIRECTINPUTDEVICE8 g_pDIDevice;
LPDIRECTINPUTDEVICE8 g_pDIMouse;
LPDIRECTINPUTDEVICE8 g_pDIGamepad;
BOOL CALLBACK EJCB(const DIDEVICEINSTANCE*,VOID*);
BOOL CALLBACK EACB(const DIDEVICEOBJECTINSTANCE*,VOID*);
DIDEVCAPS g_diDev;
int dcflag[3];
CRITICAL_SECTION cs;
DWORD WINAPI Rendsled(void);
////////////////////////////////////
Keyinput Key;
Mouseinput Mouse;
Gamepadinput Pad;
void Render();
void *pVertex;
Renderc rend;
RendTex rent;
Projection projection;
RECT rect;
RECT rectc;
RECT brect;
int WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow){
wc.cbSize =sizeof (wc);
wc.style =CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc =WndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInst;
wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName =MENUID;
wc.lpszClassName=APPNAME;
wc.hIconSm =LoadIcon(NULL,IDI_ASTERISK);
RegisterClassEx (&wc);
hWnd=CreateWindow(
APPNAME,
APPNAME,
WS_OVERLAPPEDWINDOW|WS_MAXIMIZE,
CW_USEDEFAULT,
CW_USEDEFAULT,
1382,
744,
NULL,
NULL,
hInst,
NULL);
/*manebutton(hWnd,hInst);*/
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(FAILED(InitD3D(hWnd,FALSE,rect.right-rect.left,rect.bottom-rect.top)))
{
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return 0;
}
if(FAILED(InitDirectInput(hWnd))){
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return 0;
}
ZeroMemory(&msg,sizeof(msg));
//hDeskwnd = GetDesktopWindow();
brect=rect;
//Vertexset();
//SetupMatrices();
//makemodelmoni();
//Testst.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
//view3Dsta.Makefont(14 ,7 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,TEXT("Times New Roman"));
//MakestageView();
//CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Rendsled,NULL,0,&dwID);
//InitializeCriticalSection(&cs);
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(brect.bottom!=rectc.bottom ||brect.left!=rectc.left ||brect.right!=rectc.right ||brect.top!=rectc.top){
brect=rectc;
//Vertexreset();
}
//SetupMatrices();
//modelmonireset();
Render();
dcflag[0]=0;
dcflag[1]=0;
dcflag[2]=0;
}
}
/*modelmoni.Texrelease();
modelmain[0].VbRelease();
modelmain[0].TexRelease();*/
Inputkeyrerese();
pDevice->Release();
pD3d->Release();
return (INT)msg.wParam;
}
/*DWORD WINAPI Rendsled(void){
EnterCriticalSection(&cs);
MSG msg={0};
int flag;
while(1){
Sleep(0);
Render();
}
LeaveCriticalSection(&cs);
return 0;
}*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
//DeleteCriticalSection(&cs);
PostQuitMessage(0);
return 0;
case WM_LBUTTONDBLCLK:
dcflag[0]=1;
return 0;
case WM_RBUTTONDBLCLK:
dcflag[1]=1;
return 0;
case WM_MBUTTONDBLCLK:
dcflag[2]=1;
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,lpaint);
if(pDevice!=0x00000000){
Render();
}
EndPaint(hWnd,lpaint);
return 0;
}
return DefWindowProc (hWnd, msg, wParam, lParam);
}
HRESULT InitD3D(HWND hWnd,bool fullScreen,int Hieght,int Width)
{
D3DDISPLAYMODE d3dMode;
if(NULL==(pD3d=Direct3DCreate9(D3D_SDK_VERSION)))
{
MessageBox(0,TEXT("Direct3Dの作成に失敗しました。"),NULL,MB_OK);
return E_FAIL;
}
if(FAILED(pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3dMode))){
return E_FAIL;
}
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferCount =1;
if(fullScreen){
d3dpp.Windowed=FALSE;
d3dpp.BackBufferHeight=Hieght;
d3dpp.BackBufferWidth=Width;
}else{
d3dpp.Windowed=TRUE;
}
d3dpp.BackBufferFormat =D3DFMT_UNKNOWN;
d3dpp.SwapEffect =D3DSWAPEFFECT_DISCARD;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
if(FAILED(pD3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,&pDevice)))
{
MessageBox(0,TEXT("HALモードでDIRECT3Dデバイスを作成できません\nREFモードで再試行します。"),NULL, MB_OK);
if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &pDevice ) ) )
{
if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &pDevice ) ) )
{
MessageBox(0,TEXT("DIRECT3Dデバイスの作成に失敗しました。"),NULL,MB_OK);
pD3d->Release();
return E_FAIL;
}
}
}
pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
return S_OK;
}
void Render(){
if(FAILED(pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(0,0,0,0),1.0f,0))){
return;
}
if(SUCCEEDED(pDevice->BeginScene())){
//SetupMatrices();
//modelmonidraw();
//SetupMatrices();
//teststatus();
pDevice->EndScene();
}
//if(FAILED(pDevice->Present(NULL,NULL,hWnd,NULL))){
if(pDevice->Present(NULL,NULL,NULL,NULL)== D3DERR_DEVICELOST){
if(pDevice->TestCooperativeLevel()==D3DERR_DEVICENOTRESET){
pDevice->Reset(&d3dpp);
GetWindowRect( hWnd, &rect );
GetClientRect( hWnd, &rectc );
if(FAILED(InitD3D(hWnd,FALSE,rect.right-rect.left,rect.bottom-rect.top)))
{
MessageBox(0,TEXT("DirectXの初期化に失敗しました。"),NULL,MB_OK);
return;
}
ZeroMemory(&msg,sizeof(msg));
//hDeskwnd = GetDesktopWindow();
brect=rect;
//Vertexset();
//SetupMatrices();
//makemodelmoni();
//MakestageView();
}
else
{
return;
}
}
//}
}
BOOL InitDirectInput(HWND hWnd)
{
HINSTANCE hInst;
HRESULT hr;
hInst = (HINSTANCE)GetWindowLong( hWnd , GWL_HINSTANCE );
hr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDInput , NULL );
if ( FAILED( hr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
hr = g_pDInput->CreateDevice( GUID_SysKeyboard , &g_pDIDevice , NULL );
if ( FAILED( hr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create DirectInput device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIDevice!=0x00000000){
hr = g_pDIDevice->SetDataFormat( &c_dfDIKeyboard );
if ( FAILED( hr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK);
return FALSE;
}
HRESULT mhr;
mhr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDMInput , NULL );
if ( FAILED( mhr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
mhr = g_pDMInput->CreateDevice( GUID_SysMouse , &g_pDIMouse , NULL );
if ( FAILED( mhr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create DirectInput device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIMouse!=0x00000000){
mhr = g_pDIMouse->SetDataFormat( &c_dfDIMouse );
if ( FAILED( mhr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
}
HINSTANCE hInstg;
HRESULT ghr;
hInstg =(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
ghr = DirectInput8Create( hInst , DIRECTINPUT_VERSION , IID_IDirectInput8 ,
(void**)&g_pDGInput , NULL );
if ( FAILED( ghr ) ){
MessageBox( hWnd , TEXT("Can't create DirectInput object.") , TEXT("Error") , MB_OK );
return FALSE;
}
ghr = g_pDGInput->EnumDevices(DI8DEVCLASS_GAMECTRL,EJCB,NULL,DIEDFL_ATTACHEDONLY);
if ( FAILED( ghr ) ){
MessageBox( hWnd , TEXT("Can't create Device.") , TEXT("Error") , MB_OK );
return FALSE;
}
if(g_pDIGamepad!=0x00000000){
ghr = g_pDIGamepad->SetDataFormat( &c_dfDIJoystick );
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data format.") , TEXT("Error"), MB_OK );
return FALSE;
}
g_diDev.dwSize=sizeof(DIDEVCAPS);
ghr =g_pDIGamepad->GetCapabilities(&g_diDev);
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't create device capabilities.") , TEXT("Error"), MB_OK );
return FALSE;
}
ghr =g_pDIGamepad->EnumObjects(EACB,(void*)hWnd,DIDFT_AXIS);
if ( FAILED( ghr ) ){
Inputkeyrerese();
MessageBox( hWnd , TEXT("Can't set data property.") , TEXT("Error"), MB_OK );
return FALSE;
}
ghr = g_pDIGamepad->Poll();
if ( FAILED( ghr ) ){
ghr=g_pDIGamepad->Acquire();
while(ghr==DIERR_INPUTLOST){
ghr=g_pDIGamepad->Acquire();
}
}
}
return TRUE;
}
void Inputkeyrerese(){
g_pDIDevice->Unacquire();
if ( g_pDIDevice != NULL ){
g_pDIDevice->Release();}
g_pDIMouse->Unacquire();
if ( g_pDIMouse != NULL ){
g_pDIMouse->Release();}
if ( g_pDInput != NULL ){
g_pDInput->Release();
}
if ( g_pDMInput != NULL ){
g_pDMInput->Release();
}
};
BOOL CALLBACK EJCB(const DIDEVICEINSTANCE *pdidInstance,VOID *pContext){
HRESULT hr;
hr=g_pDGInput->CreateDevice( pdidInstance->guidInstance,&g_pDIGamepad,NULL);
if(FAILED(hr)) return DIENUM_CONTINUE;
return DIENUM_STOP;
}
BOOL CALLBACK EACB(const DIDEVICEOBJECTINSTANCE *pdidoi, VOID *pContext){
HRESULT hr;
DIPROPRANGE diprg;
diprg.diph.dwSize =sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize =sizeof(DIPROPHEADER);
diprg.diph.dwHow =DIPH_BYID;
diprg.diph.dwObj =pdidoi->dwType;
diprg.lMin =0-1000;
diprg.lMax =0+1000;
hr = g_pDIDevice->SetProperty(DIPROP_RANGE,&diprg.diph);
if(FAILED(hr)) return DIENUM_STOP;
return DIENUM_CONTINUE;
}
Re: 画面外に出た部分の描画内容の消滅
試してみましょう。
[リンク先のVS2008のDirectX9のコードは全く.hは使わないコードで作ってあります。VS2010は.Net4.0系で2015互換ですがVS2008は.Net3.5系でVS2015非互換です。(それとやはり.hが要るような気がします]。ところでDXライブラリは併用されてますか?
[リンク先のVS2008のDirectX9のコードは全く.hは使わないコードで作ってあります。VS2010は.Net4.0系で2015互換ですがVS2008は.Net3.5系でVS2015非互換です。(それとやはり.hが要るような気がします]。ところでDXライブラリは併用されてますか?
Re: 画面外に出た部分の描画内容の消滅
やはり動きませんね。自作.hが要るのかも?。私はC#からC/C++にきたので.hファイルのないプログラム(.hは基本的にはなくて大丈夫です)を書きます。「C++/CLIは逆。.hに全てを書きcppはMainだけ」
いまDirectX9でクウォータニオンのサンプルが動きいました。これから習うつもりだけどさっぱり分かりません。まあ丸暗記するしかないのでひと通り動かしてOKにします。DirectX9には少し”くせ”がありますね。GPU(Graphic.BD)依存?かも知れません。
いまDirectX9でクウォータニオンのサンプルが動きいました。これから習うつもりだけどさっぱり分かりません。まあ丸暗記するしかないのでひと通り動かしてOKにします。DirectX9には少し”くせ”がありますね。GPU(Graphic.BD)依存?かも知れません。
Re: 画面外に出た部分の描画内容の消滅
InvalidateRect試してみました。
bEraseをTRUEにすると画面外に出て消えた部分の再描画に対してのラグは無くなりましたがウィンドウを移動したときに描画タイミングがずれているのかわかりませんがクライアントエリアの描画物が点滅するようになりました。
FALSEにすると移動時の点滅はありませんがやはり消えた部分の再描画時にラグがありました。
とりあえずに今これを書きながら思いついたのは再描画をWM_PAINT内でbEraseをTRUEのものとFALSEのものを二回行うことですかね。
ちょっと試してみます。
bEraseをTRUEにすると画面外に出て消えた部分の再描画に対してのラグは無くなりましたがウィンドウを移動したときに描画タイミングがずれているのかわかりませんがクライアントエリアの描画物が点滅するようになりました。
FALSEにすると移動時の点滅はありませんがやはり消えた部分の再描画時にラグがありました。
とりあえずに今これを書きながら思いついたのは再描画をWM_PAINT内でbEraseをTRUEのものとFALSEのものを二回行うことですかね。
ちょっと試してみます。
Re: 画面外に出た部分の描画内容の消滅
再描画を二回やる方法試してみました。
TRUEでの描画を先に、FALSEでの描画を後にやるとTRUEで描画したときの移動中の点滅のみが残り、
FALSEでの描画を先に、TRUEでの描画を後にやると両方の欠点が同時に起こる感じでした…
どうすればいいんでしょうね…?
TRUEでフレームレートが合うようにSleepでも入れればいいのでしょうか…
TRUEでの描画を先に、FALSEでの描画を後にやるとTRUEで描画したときの移動中の点滅のみが残り、
FALSEでの描画を先に、TRUEでの描画を後にやると両方の欠点が同時に起こる感じでした…
どうすればいいんでしょうね…?
TRUEでフレームレートが合うようにSleepでも入れればいいのでしょうか…
Re: 画面外に出た部分の描画内容の消滅
この件については私は状況の把握がまったくできてません。たの方もこうゆう状況になったことがないのかもしれません。
話は一般的(Win32)なプログラムについてですがメッセージクラッカーはご存知ですか。
話は一般的(Win32)なプログラムについてですがメッセージクラッカーはご存知ですか。
Re: 画面外に出た部分の描画内容の消滅
いえ、メッセージクラッカーは初めて聞きました。
今少し調べて見たのですがswitchの中身がHANDLE_MSGに変わっていますね。
http://keicode.com/windows/win02.php
の解説には
「毎回毎回 lParam をLPCREATESTRUCT にキャストするような煩雑さが消えます。」とありますが、
毎回のデータ型の変換を省くことができるという解釈でよろしいでしょうか?
メッセージクラッカーを使うことでコードの処理の効率化も測れるのでしょうか?
DXlibを使ってからDirectXに移行してきたためWin32API側のプログラミングや仕様には疎いもので…
今少し調べて見たのですがswitchの中身がHANDLE_MSGに変わっていますね。
http://keicode.com/windows/win02.php
の解説には
「毎回毎回 lParam をLPCREATESTRUCT にキャストするような煩雑さが消えます。」とありますが、
毎回のデータ型の変換を省くことができるという解釈でよろしいでしょうか?
メッセージクラッカーを使うことでコードの処理の効率化も測れるのでしょうか?
DXlibを使ってからDirectXに移行してきたためWin32API側のプログラミングや仕様には疎いもので…
Re: 画面外に出た部分の描画内容の消滅
ここhttp://www.kumei.ne.jp/c_lang/sdk/sdk_35.htmがわかりやすいでと思います。void My_OnPaint(HWND hwnd)
のように使います。
のように使います。
Re: 画面外に出た部分の描画内容の消滅
言われたリンク先を読んでメッセージクラッカーを実装して試してみましたが再描画時の結果はどちらも変わりませんでした…
(一日遅れですが明けましておめでとうございます)
(一日遅れですが明けましておめでとうございます)
Re: 画面外に出た部分の描画内容の消滅
基本的に書き方が変わるだけでそういう効果はないでしょうね。う~ん、どうしてそんなことになるのか全く思いつかないです。私が読んでるDirectXのサイトでもそういう事が見当たらないです。私には”何の事”か根本的な意味がわかりません...。
Re: 画面外に出た部分の描画内容の消滅
スクショによる図解が必要そうですね…Math さんが書きました:基本的に書き方が変わるだけでそういう効果はないでしょうね。う~ん、どうしてそんなことになるのか全く思いつかないです。私が読んでるDirectXのサイトでもそういう事が見当たらないです。私には”何の事”か根本的な意味がわかりません...。
私の配慮不足です。すみません。
Re: 画面外に出た部分の描画内容の消滅
Windows7以降(富士通のパソコンをある仕事の必要からVista,7,8.1,10を複数使っています。通常私は10しか使いません)動画キャプチャーアプリが付属していてそれで動画の説明書ができます。それをもとにスクショを作りExcelに取り込んで解説をいれます。そうすると分かりやすいですよ。
Re: 画面外に出た部分の描画内容の消滅
拡張子が対応して無かったのでzipで添付してあります。(中身はmp4です)
画面上にどのようなソースコードの状態で実行したかを書いています。
最初以外はすべてWM_PAINTをメッセージクラッカーを使用して受け取って再描画しています。
Re: 画面外に出た部分の描画内容の消滅
普通にマウスで移動してるだけです。
編集時に見切れてしまったようですすみません。
元々は一番初めの検証の現象を起こらないようにする方法を探していて見つけられずに質問したのですが、方法を提示してもらい試したところラグに気づき相談したところInvalidateRectのフラグに関して教えていただいたので色々検証してこうなりました。
やはり不思議なことをしているように見えますよね(笑)
この過程で思いつきで同じくDirectXを使っている東方原作でウィンドウを画面に入れたり出したりしましたがこのような事は起こりませんでした。(まぁ東方がどの様なソースでどの様に処理をしているのかわからないので試したところで何も参考にならないのですが…)
編集時に見切れてしまったようですすみません。
元々は一番初めの検証の現象を起こらないようにする方法を探していて見つけられずに質問したのですが、方法を提示してもらい試したところラグに気づき相談したところInvalidateRectのフラグに関して教えていただいたので色々検証してこうなりました。
やはり不思議なことをしているように見えますよね(笑)
この過程で思いつきで同じくDirectXを使っている東方原作でウィンドウを画面に入れたり出したりしましたがこのような事は起こりませんでした。(まぁ東方がどの様なソースでどの様に処理をしているのかわからないので試したところで何も参考にならないのですが…)
Re: 画面外に出た部分の描画内容の消滅
分かりました。Game作りとは直接に関係ない事なので不思議に思っただけです。普通そんな事までしませんよね。自作アプリではそこまで考慮した事が有りません。(これは一般的に起こる現象だと思います。市販アプリには多分我々の知らないいろんなノウハウが使われているのでしょう。)取り敢えずDirectX9に特有の現象ではありません。あまりこだわることではないと思います。
Re: 画面外に出た部分の描画内容の消滅
C#,VBでGameをつくるときは考えなくてもいいので気がつかなかったのですがC/C++では”再描画”は必要なようです。
http://wisdom.sakura.ne.jp/system/winap ... index.htmlに私が勉強したC言語のページがあります。http://wisdom.sakura.ne.jp/system/winap ... win35.htmlの内容とhttp://wisdom.sakura.ne.jp/system/winap ... win34.htmlの内容は必須と思われます。
C言語の私のホームページのメモを読んで気づきました。
http://wisdom.sakura.ne.jp/system/winap ... index.htmlに私が勉強したC言語のページがあります。http://wisdom.sakura.ne.jp/system/winap ... win35.htmlの内容とhttp://wisdom.sakura.ne.jp/system/winap ... win34.htmlの内容は必須と思われます。
C言語の私のホームページのメモを読んで気づきました。
Re: 画面外に出た部分の描画内容の消滅
ありがとうございます。
じっくり読み解いてみますね
今作っているのはゲームというよりは3Dモデルのモデリングツールみたいな感じでしょうか。
なので全画面モードで起動した事はないです。
ただゲームを見越して汎用性を高く組んでいる(つもり)なのでゲームを作るのにソースは使用すると思います。
じっくり読み解いてみますね
今作っているのはゲームというよりは3Dモデルのモデリングツールみたいな感じでしょうか。
なので全画面モードで起動した事はないです。
ただゲームを見越して汎用性を高く組んでいる(つもり)なのでゲームを作るのにソースは使用すると思います。
Re: 画面外に出た部分の描画内容の消滅
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
の行をコメントアウトしたらどうなります?ついでにWndProcのWM_PAINTを処理しているところも省いて。
色々コードを取り除いた時の弊害かもしれませんが、インデントがめちゃくちゃだったり
WinMainが__stdcallになっていなかったり、ブロックの対応関係がとれていなかったり
DirectInputのヘッダとリンクが行われていなかったりでこのままのコード動きませんね。
動いても何も描画はされない状態・・・。
の行をコメントアウトしたらどうなります?ついでにWndProcのWM_PAINTを処理しているところも省いて。
色々コードを取り除いた時の弊害かもしれませんが、インデントがめちゃくちゃだったり
WinMainが__stdcallになっていなかったり、ブロックの対応関係がとれていなかったり
DirectInputのヘッダとリンクが行われていなかったりでこのままのコード動きませんね。
動いても何も描画はされない状態・・・。
Re: 画面外に出た部分の描画内容の消滅
ありがとうございます!wc.hdrBackgroundの行をコメントアウトしたら解決しました!シェーダ美味しい さんが書きました:wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
の行をコメントアウトしたらどうなります?ついでにWndProcのWM_PAINTを処理しているところも省いて。
色々コードを取り除いた時の弊害かもしれませんが、インデントがめちゃくちゃだったり
WinMainが__stdcallになっていなかったり、ブロックの対応関係がとれていなかったり
DirectInputのヘッダとリンクが行われていなかったりでこのままのコード動きませんね。
動いても何も描画はされない状態・・・。
WinMainに関してはWINAPIを書かなきゃいけないということをすっかり忘れていました。DXライブラリでもやったはずなんですけどね…(苦笑)
インデンがめちゃくちゃで読みづらいのはもともとです。
もっと読みやすいコードを意識しなければいけませんね…
DirectInputのヘッダとのリンクはそれに関したクラスを作って書いたヘッダでリンクさせてあるせいですね。コードをここにあげる際にリンクをさせる事を忘れていました。というか存在を忘れていました…
Re: 画面外に出た部分の描画内容の消滅
解決したようでよかったです。その方針で良いのか分かりませんが。
個人的には、DirectXを用いる際には(そのウィンドウに対しては)Win32APIを下手に混在させない事を意識しています。
それぞれが競合しあって、分かりやすいところでは先ほどの点滅が起こるというような事になってしまうので、WndProcでは最低限の事のみ、後はゲームロジックとしてループ内で記述する形ですね。
ツールを作成するということなので、見た目を表示する部分(今回の部分?)、操作を受け付ける部分(3D空間の操作等があるかもしれませんが)、データを操作する部分など、適切に切り分けて設計出来ると良いですね。応援しております。
個人的には、DirectXを用いる際には(そのウィンドウに対しては)Win32APIを下手に混在させない事を意識しています。
それぞれが競合しあって、分かりやすいところでは先ほどの点滅が起こるというような事になってしまうので、WndProcでは最低限の事のみ、後はゲームロジックとしてループ内で記述する形ですね。
ツールを作成するということなので、見た目を表示する部分(今回の部分?)、操作を受け付ける部分(3D空間の操作等があるかもしれませんが)、データを操作する部分など、適切に切り分けて設計出来ると良いですね。応援しております。
Re: 画面外に出た部分の描画内容の消滅
オフトピック
1. WM_ERASEBKGNDで何もせず1を返す
2. WM_PAINTで何もせずBeginPaintとEndPaintだけを呼び出す
をテンプレにしておくとよいと思います。
1.は背景消去処理そのものを無効化します。
2.はWM_PAINTメッセージが連投されないように無効領域を解消します。
2. WM_PAINTで何もせずBeginPaintとEndPaintだけを呼び出す
をテンプレにしておくとよいと思います。
1.は背景消去処理そのものを無効化します。
2.はWM_PAINTメッセージが連投されないように無効領域を解消します。
Re: 画面外に出た部分の描画内容の消滅
分かりました。アドバイスありがとうございます!ISLe さんが書きました:オフトピック1. WM_ERASEBKGNDで何もせず1を返す
2. WM_PAINTで何もせずBeginPaintとEndPaintだけを呼び出す
をテンプレにしておくとよいと思います。
1.は背景消去処理そのものを無効化します。
2.はWM_PAINTメッセージが連投されないように無効領域を解消します。