画面外に出た部分の描画内容の消滅

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

画面外に出た部分の描画内容の消滅

#1

投稿記事 by 夢猫。 » 7年前

大変お久しぶりでございます。
現在C++でDirectXを使用しプログラミングを行っています。
ウィンドウを移動させて画面外に出た部分があるとその部分に描画されていたものが消えてしまうのを回避する方法を探していたのですがなかなか思うような情報が得られずにいます。
この現象(?)の回避する方法にはどのようなものがあるのでしょうか?
また、現象の名称をお願いします。
毎回初歩的な質問ばかりですみません。ご回答よろしくお願いします。

metaphor

Re: 画面外に出た部分の描画内容の消滅

#2

投稿記事 by metaphor » 7年前

[callback関数]WinProcのコードの提示をお願い致します。一般的には
"ウィンドウ全体、または一部を再描画したい"ときプログラム側で明示的に無効領域を作ることでWM_PAINTを生成する、つまり領域を描きなおすことができるようになります。[WM_PAINT が呼び出されるのは無効リージョンが存在する時です]

コード:

		return 0;
	case WM_KEYDOWN:
		iCount++;
		InvalidateRect(hwnd , NULL , TRUE);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);

		wsprintf(strCount , "%d" , iCount);
		TextOut(hdc , 10 , 30 , strCount , lstrlen(strCount));

		EndPaint(hwnd , &ps);
		return 0;
	}
みたいな”領域の再描画”の話だと思います。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#3

投稿記事 by 夢猫。 » 7年前

コード:

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);	
}
今書いているWndProcの中身です。
クリティカルセクションの残骸があるのは調べていたら見つけたマルチスレッドで描画をして消えるのを防ぐという方法を試したためです。
とりあえず書いて頂いたWM_PAINTでの再描画の方法を試してみたいと思います。

metaphor

Re: 画面外に出た部分の描画内容の消滅

#4

投稿記事 by metaphor » 7年前

メッセージループのコードの提示もお願い出来ますでしょうか。
(全体を1ファイルで動かせるように(テスト用に)出来ればお願い致します。)

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#5

投稿記事 by 夢猫。 » 7年前

コード:

#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;
}
main.cppの中身です。
関数部分は名前から大体内容がわかるようにしてあるのでご自身の都合のよいように置き換えてください。おそらくそれで動くと思います。
色々試しながら組み立てているので非常に効率の悪い見づらいコードですが…。
WM_PAINTの方はやってみて成功はしましたが、ウィンドウを画面内に戻したときの再描画にラグがあるのが多少気になる感じでした。
ソースを丸投げしたみたいですみません。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#6

投稿記事 by 夢猫。 » 7年前

コード:

#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;
}
余計な部分を削り、関数に使っていた変数を削除し必要最低限のものだけ残しました。

metaphor

Re: 画面外に出た部分の描画内容の消滅

#7

投稿記事 by metaphor » 7年前

了解しました。調べてみます。でも詳しい人も多いのでアドバイスがあるでしょう。

metaphor

Re: 画面外に出た部分の描画内容の消滅

#8

投稿記事 by metaphor » 7年前

私の環境はhttp://dixq.net/forum/viewtopic.php?f=3&t=18717です。
PCとVisualStudioのスペックが違うのか

コード:

#include "../../directoryname/lib/libmain.h" 
#include "dinput.h"
 
#include "../../directoryname/lib/string.h"
のせいか動かせない。Debug不可能でDirectXについては私は勉強中で貴殿のほうが詳しいと思います。詳しい方のアドバイスを待ちましょう。
(再描画のラグの件ですが
”BOOL InvalidateRect(HWND hWnd , CONST RECT *lpRect , BOOL bErase);

hWnd には、無効化の対象となるウィンドウのハンドルを指定します
NULL を指定した場合、全てのウィンドウを無効化します

lpRect には、無効化する長方形をあらわす RECT 構造体のポインタを指定します
この引数をNULLにするとクライアント領域全体が対象になります

bErase を TRUE にすると BeginPaint() が呼び出されたときに背景を消去します
FALSE を指定すれば、背景はそのまま残ります
戻り値は、成功すれば 0 以外、失敗すれば 0 が返ります”とあったのが気になる
かなと思います)


夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#10

投稿記事 by 夢猫。 » 7年前

あ、すみませんそのヘッダーファイルは自作の物なのでインクルード宣言は削除してください。消し忘れていました。
InvalidateRectですか…調べて検証してみますね。
詳しく解説ありがとうございます。

metaphor

Re: 画面外に出た部分の描画内容の消滅

#11

投稿記事 by metaphor » 7年前

VS2008では動かない。.hが足りてないかなんとかの”依存症”みたいです。(VS2015はDirectX11を使っていて設定したくないのでごめん)詳しい方のアドバイスをお待ちください。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#12

投稿記事 by 夢猫。 » 7年前

リンク先見ましたがVS2008の方はDirectX9で設定してあるんですよね?だったら動くはずなのですが…
…VS2010で書いたコードだから動かないのか…?
取り敢えず試せること試しながら詳しい人のアドバイス待ちますね。本当にありがとうございます。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#13

投稿記事 by 夢猫。 » 7年前

リンク先見ましたがVS2008の方はDirectX9で設定してあるんですよね?だったら動くはずなのですが…
…VS2010で書いたコードだから動かないのか…?
取り敢えず試せること試しながら詳しい人のアドバイス待ちますね。本当にありがとうございます。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#14

投稿記事 by 夢猫。 » 7年前

コード:

#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;
}
何度もすみません。これで動きませんか?

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#15

投稿記事 by 夢猫。 » 7年前

コード:

#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;
}
何度もすみません。これで動きませんか?

metaphor

Re: 画面外に出た部分の描画内容の消滅

#16

投稿記事 by metaphor » 7年前

試してみましょう。
[リンク先のVS2008のDirectX9のコードは全く.hは使わないコードで作ってあります。VS2010は.Net4.0系で2015互換ですがVS2008は.Net3.5系でVS2015非互換です。(それとやはり.hが要るような気がします]。ところでDXライブラリは併用されてますか?

metaphor

Re: 画面外に出た部分の描画内容の消滅

#17

投稿記事 by metaphor » 7年前

やはり動きませんね。自作.hが要るのかも?。私はC#からC/C++にきたので.hファイルのないプログラム(.hは基本的にはなくて大丈夫です)を書きます。「C++/CLIは逆。.hに全てを書きcppはMainだけ」
いまDirectX9でクウォータニオンのサンプルが動きいました。これから習うつもりだけどさっぱり分かりません。まあ丸暗記するしかないのでひと通り動かしてOKにします。DirectX9には少し”くせ”がありますね。GPU(Graphic.BD)依存?かも知れません。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#18

投稿記事 by 夢猫。 » 7年前

InvalidateRect試してみました。
bEraseをTRUEにすると画面外に出て消えた部分の再描画に対してのラグは無くなりましたがウィンドウを移動したときに描画タイミングがずれているのかわかりませんがクライアントエリアの描画物が点滅するようになりました。
FALSEにすると移動時の点滅はありませんがやはり消えた部分の再描画時にラグがありました。
とりあえずに今これを書きながら思いついたのは再描画をWM_PAINT内でbEraseをTRUEのものとFALSEのものを二回行うことですかね。
ちょっと試してみます。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#19

投稿記事 by 夢猫。 » 7年前

再描画を二回やる方法試してみました。
TRUEでの描画を先に、FALSEでの描画を後にやるとTRUEで描画したときの移動中の点滅のみが残り、
FALSEでの描画を先に、TRUEでの描画を後にやると両方の欠点が同時に起こる感じでした…
どうすればいいんでしょうね…?
TRUEでフレームレートが合うようにSleepでも入れればいいのでしょうか…

metaphor

Re: 画面外に出た部分の描画内容の消滅

#20

投稿記事 by metaphor » 7年前

この件については私は状況の把握がまったくできてません。たの方もこうゆう状況になったことがないのかもしれません。
話は一般的(Win32)なプログラムについてですがメッセージクラッカーはご存知ですか。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#21

投稿記事 by 夢猫。 » 7年前

いえ、メッセージクラッカーは初めて聞きました。
今少し調べて見たのですがswitchの中身がHANDLE_MSGに変わっていますね。
http://keicode.com/windows/win02.php
の解説には
「毎回毎回 lParam をLPCREATESTRUCT にキャストするような煩雑さが消えます。」とありますが、
毎回のデータ型の変換を省くことができるという解釈でよろしいでしょうか?
メッセージクラッカーを使うことでコードの処理の効率化も測れるのでしょうか?
DXlibを使ってからDirectXに移行してきたためWin32API側のプログラミングや仕様には疎いもので…

metaphor

Re: 画面外に出た部分の描画内容の消滅

#22

投稿記事 by metaphor » 7年前

ここhttp://www.kumei.ne.jp/c_lang/sdk/sdk_35.htmがわかりやすいでと思います。void My_OnPaint(HWND hwnd)
のように使います。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#23

投稿記事 by 夢猫。 » 7年前

言われたリンク先を読んでメッセージクラッカーを実装して試してみましたが再描画時の結果はどちらも変わりませんでした…
(一日遅れですが明けましておめでとうございます)

Math

Re: 画面外に出た部分の描画内容の消滅

#24

投稿記事 by Math » 7年前

基本的に書き方が変わるだけでそういう効果はないでしょうね。う~ん、どうしてそんなことになるのか全く思いつかないです。私が読んでるDirectXのサイトでもそういう事が見当たらないです。私には”何の事”か根本的な意味がわかりません...。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#25

投稿記事 by 夢猫。 » 7年前

Math さんが書きました:基本的に書き方が変わるだけでそういう効果はないでしょうね。う~ん、どうしてそんなことになるのか全く思いつかないです。私が読んでるDirectXのサイトでもそういう事が見当たらないです。私には”何の事”か根本的な意味がわかりません...。
スクショによる図解が必要そうですね…
私の配慮不足です。すみません。

Math

Re: 画面外に出た部分の描画内容の消滅

#26

投稿記事 by Math » 7年前

Windows7以降(富士通のパソコンをある仕事の必要からVista,7,8.1,10を複数使っています。通常私は10しか使いません)動画キャプチャーアプリが付属していてそれで動画の説明書ができます。それをもとにスクショを作りExcelに取り込んで解説をいれます。そうすると分かりやすいですよ。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#27

投稿記事 by 夢猫。 » 7年前

再描画検証.zip
(5.76 MiB) ダウンロード数: 118 回
画像では分かりづらいと思ったので動画にしました。
拡張子が対応して無かったのでzipで添付してあります。(中身はmp4です)
画面上にどのようなソースコードの状態で実行したかを書いています。
最初以外はすべてWM_PAINTをメッセージクラッカーを使用して受け取って再描画しています。

Math

Re: 画面外に出た部分の描画内容の消滅

#28

投稿記事 by Math » 7年前

mp4見ました。全然想像した事と違いました。不思議なことをされていますね。どうやってWindowを動かしていますか?

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#29

投稿記事 by 夢猫。 » 7年前

普通にマウスで移動してるだけです。
編集時に見切れてしまったようですすみません。
元々は一番初めの検証の現象を起こらないようにする方法を探していて見つけられずに質問したのですが、方法を提示してもらい試したところラグに気づき相談したところInvalidateRectのフラグに関して教えていただいたので色々検証してこうなりました。
やはり不思議なことをしているように見えますよね(笑)
この過程で思いつきで同じくDirectXを使っている東方原作でウィンドウを画面に入れたり出したりしましたがこのような事は起こりませんでした。(まぁ東方がどの様なソースでどの様に処理をしているのかわからないので試したところで何も参考にならないのですが…)

Math

Re: 画面外に出た部分の描画内容の消滅

#30

投稿記事 by Math » 7年前

分かりました。Game作りとは直接に関係ない事なので不思議に思っただけです。普通そんな事までしませんよね。自作アプリではそこまで考慮した事が有りません。(これは一般的に起こる現象だと思います。市販アプリには多分我々の知らないいろんなノウハウが使われているのでしょう。)取り敢えずDirectX9に特有の現象ではありません。あまりこだわることではないと思います。

Math

Re: 画面外に出た部分の描画内容の消滅

#31

投稿記事 by Math » 7年前

普通にはGameは全画面モードがデフォルト設定だと思います。

Math

Re: 画面外に出た部分の描画内容の消滅

#32

投稿記事 by Math » 7年前

全画面モードでは問題がなく動作しますでしょうか?。

Math

Re: 画面外に出た部分の描画内容の消滅

#33

投稿記事 by Math » 7年前

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言語の私のホームページのメモを読んで気づきました。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#34

投稿記事 by 夢猫。 » 7年前

ありがとうございます。
じっくり読み解いてみますね

今作っているのはゲームというよりは3Dモデルのモデリングツールみたいな感じでしょうか。
なので全画面モードで起動した事はないです。
ただゲームを見越して汎用性を高く組んでいる(つもり)なのでゲームを作るのにソースは使用すると思います。

シェーダ美味しい

Re: 画面外に出た部分の描画内容の消滅

#35

投稿記事 by シェーダ美味しい » 7年前

wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
の行をコメントアウトしたらどうなります?ついでにWndProcのWM_PAINTを処理しているところも省いて。


色々コードを取り除いた時の弊害かもしれませんが、インデントがめちゃくちゃだったり
WinMainが__stdcallになっていなかったり、ブロックの対応関係がとれていなかったり
DirectInputのヘッダとリンクが行われていなかったりでこのままのコード動きませんね。
動いても何も描画はされない状態・・・。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#36

投稿記事 by 夢猫。 » 7年前

シェーダ美味しい さんが書きました:wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
の行をコメントアウトしたらどうなります?ついでにWndProcのWM_PAINTを処理しているところも省いて。


色々コードを取り除いた時の弊害かもしれませんが、インデントがめちゃくちゃだったり
WinMainが__stdcallになっていなかったり、ブロックの対応関係がとれていなかったり
DirectInputのヘッダとリンクが行われていなかったりでこのままのコード動きませんね。
動いても何も描画はされない状態・・・。
ありがとうございます!wc.hdrBackgroundの行をコメントアウトしたら解決しました!
WinMainに関してはWINAPIを書かなきゃいけないということをすっかり忘れていました。DXライブラリでもやったはずなんですけどね…(苦笑)
インデンがめちゃくちゃで読みづらいのはもともとです。
もっと読みやすいコードを意識しなければいけませんね…
DirectInputのヘッダとのリンクはそれに関したクラスを作って書いたヘッダでリンクさせてあるせいですね。コードをここにあげる際にリンクをさせる事を忘れていました。というか存在を忘れていました…

シェーダ美味しい

Re: 画面外に出た部分の描画内容の消滅

#37

投稿記事 by シェーダ美味しい » 7年前

解決したようでよかったです。その方針で良いのか分かりませんが。


個人的には、DirectXを用いる際には(そのウィンドウに対しては)Win32APIを下手に混在させない事を意識しています。
それぞれが競合しあって、分かりやすいところでは先ほどの点滅が起こるというような事になってしまうので、WndProcでは最低限の事のみ、後はゲームロジックとしてループ内で記述する形ですね。

ツールを作成するということなので、見た目を表示する部分(今回の部分?)、操作を受け付ける部分(3D空間の操作等があるかもしれませんが)、データを操作する部分など、適切に切り分けて設計出来ると良いですね。応援しております。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 画面外に出た部分の描画内容の消滅

#38

投稿記事 by ISLe » 7年前

オフトピック
1. WM_ERASEBKGNDで何もせず1を返す
2. WM_PAINTで何もせずBeginPaintとEndPaintだけを呼び出す
をテンプレにしておくとよいと思います。

1.は背景消去処理そのものを無効化します。
2.はWM_PAINTメッセージが連投されないように無効領域を解消します。

夢猫。
記事: 28
登録日時: 8年前

Re: 画面外に出た部分の描画内容の消滅

#39

投稿記事 by 夢猫。 » 7年前

ISLe さんが書きました:
オフトピック
1. WM_ERASEBKGNDで何もせず1を返す
2. WM_PAINTで何もせずBeginPaintとEndPaintだけを呼び出す
をテンプレにしておくとよいと思います。

1.は背景消去処理そのものを無効化します。
2.はWM_PAINTメッセージが連投されないように無効領域を解消します。
分かりました。アドバイスありがとうございます!

閉鎖

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