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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

05.12.2007, 17:38

directdraw fenstermodus wechseln

hallo leute.

meine frage wäre, wie ich ein ddraw7 fenster, dass im fullscreen modus läuft, minimieren kann, bzw. während der laufzeit in den fenstermodus wechseln kann.

ich hab da schon was darüber gelesen, mit clipping usw, aber leider nichts anständiges..

kann mir da jemand helfen?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

2

09.12.2007, 22:35

Das ist nicht so einfach zu machen. Du müsstest danach alle Oberflächen neu erstellen und die Grafiken neu laden. Also gehört einiges an Vorarbeit dazu.

Aber hier ein Codeabschnitt aus meiner 2D Engine für den Fenstermodus.

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
    HRESULT ddrval;
    RECT    rc;

    SetRect(&rc,0,0,m_xoffset,m_yoffset);
    AdjustWindowRect(&rc,WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_OVERLAPPED,TRUE);

    MoveWindow (m_hwnd, 
                GetSystemMetrics(SM_CXSCREEN)/2-m_xoffset/2,
                GetSystemMetrics(SM_CYSCREEN)/2-m_yoffset/2,
                (rc.right-rc.left),(rc.bottom-rc.top),true);

    SetWindowLong(m_hwnd,GWL_STYLE,WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_OVERLAPPED);
    ShowWindow    (m_hwnd, SW_SHOWNORMAL); 
    UpdateWindow  (m_hwnd); 

    // Direct Draw vorbereiten

    ddrval = DirectDrawCreateEx(NULL, (VOID **)&m_lpDD, IID_IDirectDraw7, NULL); 
    if(ddrval != DD_OK) 
        return 1;

    ddrval =m_lpDD->SetCooperativeLevel(m_hwnd, DDSCL_NORMAL );
    if(ddrval != DD_OK) 
        return 2;
    
    DDSURFACEDESC2          ddsd;
    ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd); 
    ddsd.dwFlags = DDSD_CAPS; 
    ddsd.ddsCaps.dwCaps = DDSCAPS_3DDEVICE|DDSCAPS_PRIMARYSURFACE |DDSCAPS_VIDEOMEMORY;
    ddrval = m_lpDD->CreateSurface(&ddsd, &m_lpDDSPrimary, NULL);
    if(ddrval != DD_OK) 
        return 4;

    ddrval=m_lpDD->CreateClipper(0,&m_lpDClip, NULL);
    if(ddrval != DD_OK) 
        return 7;

    ddrval=m_lpDClip->SetHWnd(0, m_hwnd);
    if(ddrval != DD_OK) 
        return 8;

    ddrval=m_lpDDSPrimary->SetClipper(m_lpDClip);
    if(ddrval != DD_OK) 
        return 9;

    if(m_lpDClip != NULL)
    {
        m_lpDClip->Release();
        m_lpDClip = NULL;
    }

    ZeroMemory(&ddsd,sizeof(ddsd)) ; 
    ddsd.dwSize         = sizeof(DDSURFACEDESC2) ; 
    ddsd.dwFlags        = DDSD_CAPS| DDSD_WIDTH | DDSD_HEIGHT ;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE |DDSCAPS_VIDEOMEMORY;
    ddsd.dwWidth        = m_xoffset ; 
    ddsd.dwHeight       = m_yoffset ;
    
    ddrval=m_lpDD->CreateSurface(&ddsd, &m_lpDDSBack,NULL); 
    if (ddrval!=DD_OK) 
        return 5;

    // Farbmaske

    ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize=sizeof(ddsd);
    ddrval = m_lpDD->GetDisplayMode(&ddsd);
    if(ddrval != DD_OK)
        return 6;

    m_MaskRed   = ddsd.ddpfPixelFormat.dwRBitMask;
    m_MaskGreen = ddsd.ddpfPixelFormat.dwGBitMask;
    m_MaskBlue  = ddsd.ddpfPixelFormat.dwBBitMask;