Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

23.05.2009, 12:01

Liegt wohl am Windowstyle WS_POPUP.
Würde ich nur für Fullscreen verwenden.

Ansonsten WS_OVERLAPPED, WS_OVERLAPPEDWINDOW

Last but not least, solltest du vielleicht die Windows-Messages für solche Ereignisse verarbeiten (WM_ACTIVATE, WM_SIZE usw.).
fka tm

22

23.05.2009, 12:06

ich benutze den style WS_OVERLAPPEDWINDOW, klappt aber nicht.
Wie muss ich den auf die beiden Nachrichten reagieren?

23

23.05.2009, 12:34

Achso, auf Seite 1 im Codeausschnitt steht noch WS_POPUP. :)

In deiner WinProc:

C-/C++-Quelltext

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
switch( msg )
{

// WM_ACTIVE: Fenster wird aktiviert oder deaktiviert

case WM_ACTIVATE:
if( LOWORD(wParam) == WA_INACTIVE )
    Pausieren = true;
else
    Pausieren = false;
return 0;


// WM_SIZE: Benutzer verändert die Größe des Fensters

case WM_SIZE:
if( Device )
{
    d3dPP.BackBufferWidth  = LOWORD(lParam);
    d3dPP.BackBufferHeight = HIWORD(lParam);
    //...


    if( wParam == SIZE_MINIMIZED )
    {
        Pausieren = true;
        minOrMaxed = true;
    }
    else if( wParam == SIZE_MAXIMIZED )
    {
        Pausieren  = false;
        minOrMaxed = true;
        onLostDevice();
        Device->Reset(&d3dPP);
        onResetDevice();
    }
    // Restored: Wiederherstellen

    else if( wParam == SIZE_RESTORED )
    {
        Pausieren = false;

        // Wiederherstellen aus Minimiert- oder Maximiert-Zustand

        // Nur für Fenstermodus

        if( minOrMaxed && d3dPP.Windowed )
        {
            onLostDevice();
            Device->Reset(&d3dPP);
            onResetDevice();
        }
        else
        {
            // Benutzer verändert die Fenstergröße durch Ziehen an den Rändern oder der Schaltfläche 

            // WM_SIZE wird nun laufend gesendet

            // Warten, bis der Benutzer fertig ist -> WM_EXITSIZEMOVE bearbeiten

        }
        minOrMaxed = false;
    }
}
return 0;


// WM_EXITSIZEMOVE: Benutzer ist fertig, Resize-Controls wurden losgelassen 

// Reset, was mit der neuen Fenstergröße zusammenhängt

case WM_EXITSIZEMOVE:

GetClientRect(hMainWnd, &clientRect);
d3dPP.BackBufferWidth  = clientRect.right;
d3dPP.BackBufferHeight = clientRect.bottom;
//...


onLostDevice();
Device->Reset(&d3dPP);
onResetDevice();
return 0;

// Weitere Nachrichten verarbeiten oder

return DefWindowProc(hMainWnd, msg, wParam, lParam);
}


Naja, so in etwa... ;)
Kannst dir ja stückweise Codefragmente rauspicken, für deine Zwecke anpassen und testen.
fka tm

24

23.05.2009, 13:06

ich hab aber eine fullscreen anwendung, man kann das fenster eigentlich nicht verändern, nur minimieren und maximieren (noch nicht mal). Eigentlich müsste DefWindowProc das Fenster auch wieder maximieren, es minimiert ja auch oder? Dein Code bezieht sich doch auf den Fenstermodus oder?

25

23.05.2009, 13:23

Fullscreenanwendung mit Minimieren, Maximieren und Messageboxes ist keine gute Idee.

Da dürfte die Bearbeitung von WM_ACTIVATE in Kombi mit Lost- und Resetdevice genügen.
Z.B. beim Taskwechsel, oder ein Popup-Fenster erscheint.

Also Anwendung pausieren wenn inaktiv (LostDevice), und entsprechende Maßnahmen wenn wieder aktiv (ResetDevice) durchführen.
fka tm

Werbeanzeige