合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月28日(水) 22:00
No: 1
(OFFLINE)

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

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

Name: metaphor
[URL]
Date: 2016年12月28日(水) 23:44
No: 2
(OFFLINE)

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

[callback関数]WinProcのコードの提示をお願い致します。一般的には
"ウィンドウ全体、または一部を再描画したい"ときプログラム側で明示的に無効領域を作ることでWM_PAINTを生成する、つまり領域を描きなおすことができるようになります。[WM_PAINT が呼び出されるのは無効リージョンが存在する時です]
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        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;
    }

みたいな”領域の再描画”の話だと思います。

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月29日(木) 14:13
No: 3
(OFFLINE)

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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での再描画の方法を試してみたいと思います。

Name: metaphor
[URL]
Date: 2016年12月29日(木) 16:10
No: 4
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月29日(木) 16:48
No: 5
(OFFLINE)

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
#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の方はやってみて成功はしましたが、ウィンドウを画面内に戻したときの再描画にラグがあるのが多少気になる感じでした。
ソースを丸投げしたみたいですみません。

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月29日(木) 17:04
No: 6
(OFFLINE)

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
#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;
}

余計な部分を削り、関数に使っていた変数を削除し必要最低限のものだけ残しました。

Name: metaphor
[URL]
Date: 2016年12月29日(木) 17:49
No: 7
(OFFLINE)

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

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

Name: metaphor
[URL]
Date: 2016年12月29日(木) 20:13
No: 8
(OFFLINE)

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

私の環境はhttp://dixq.net/forum/viewtopic.php?f=3&t=18717です。
PCとVisualStudioのスペックが違うのか
コード[C++]: 全て選択
1
2
3
4
#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 が返ります”とあったのが気になる
かなと思います)

Name: metaphor
[URL]
Date: 2016年12月29日(木) 20:22
No: 9
(OFFLINE)

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月29日(木) 20:47
No: 10
(OFFLINE)

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

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

Name: metaphor
[URL]
Date: 2016年12月29日(木) 22:33
No: 11
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月30日(金) 08:20
No: 12
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月30日(金) 08:20
No: 13
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月30日(金) 08:52
No: 14
(OFFLINE)

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
#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;
}

何度もすみません。これで動きませんか?

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月30日(金) 08:53
No: 15
(OFFLINE)

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
#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;
}

何度もすみません。これで動きませんか?

Name: metaphor
[URL]
Date: 2016年12月30日(金) 09:03
No: 16
(OFFLINE)

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

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

Name: metaphor
[URL]
Date: 2016年12月30日(金) 10:04
No: 17
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月30日(金) 21:16
No: 18
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月30日(金) 21:28
No: 19
(OFFLINE)

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

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

Name: metaphor
[URL]
Date: 2016年12月31日(土) 08:33
No: 20
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2016年12月31日(土) 09:41
No: 21
(OFFLINE)

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

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

Name: metaphor
[URL]
Date: 2016年12月31日(土) 10:15
No: 22
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2017年1月02日(月) 22:03
No: 23
(OFFLINE)

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

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

Name: Math
[URL]
Date: 2017年1月02日(月) 22:24
No: 24
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2017年1月03日(火) 09:21
No: 25
(OFFLINE)

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

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

スクショによる図解が必要そうですね…
私の配慮不足です。すみません。

Name: Math
[URL]
Date: 2017年1月03日(火) 09:47
No: 26
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2017年1月03日(火) 21:41
No: 27
(OFFLINE)

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

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

Name: Math
[URL]
Date: 2017年1月03日(火) 22:11
No: 28
(OFFLINE)

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

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

Name: 夢猫。
[URL]
中級者(12,517 ポイント)
Date: 2017年1月03日(火) 22:42
No: 29
(OFFLINE)

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

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

Name: Math
[URL]
Date: 2017年1月03日(火) 23:10
No: 30
(OFFLINE)

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

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

次へ

Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: ハワルド & ゲスト[35人]