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

1

02.12.2007, 01:28

Problem mit Vista und Direct3D

Habe da folgendes Problem:

Ich lerne grad DirectX.

Ich habe jetzt Direct3D im FullScreen-Modus initialisiert, aber seltsamerweise wird immer noch ein FensterRamen angezeigt.

Hier habt ihr den Code:

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
76
77
78
79
80
81
82
83
#include <d3d9.h>
#include <windows.h>

LPDIRECT3D9 lpD3D = NULL;
LPDIRECT3DDEVICE9 lpD3DDevice = NULL;
D3DPRESENT_PARAMETERS D3DPParams;

LRESULT CALLBACK Callback(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char*Cmd, int CmdShow)
{
    MSG msg;
    HWND hWnd;
    HWND hExitButton;
    WNDCLASSEX wc;
    const char* className = "Direct3D";
    const char* windowName = "Direct3D";

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.cbClsExtra = NULL;
    wc.cbWndExtra = NULL;
    wc.hbrBackground = (HBRUSH) COLOR_WINDOW + 1;
    wc.hCursor = LoadCursor(hInst, IDC_ARROW);
    wc.hIcon = LoadIcon(hInst, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(hInst, IDI_APPLICATION);
    wc.hInstance = hInst;
    wc.lpfnWndProc = Callback;
    wc.lpszClassName = className;
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL, className, windowName, WS_VISIBLE | WS_OVERLAPPEDWINDOW,
        0, 0, 500, 500, NULL, NULL, hInst, NULL);

    lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

    ZeroMemory(&D3DPParams, sizeof(D3DPParams));

    D3DPParams.BackBufferCount = 1;
    D3DPParams.BackBufferFormat = D3DFMT_X8R8G8B8;
    D3DPParams.BackBufferHeight = 768;
    D3DPParams.BackBufferWidth = 1024;
    D3DPParams.Windowed = FALSE;
    D3DPParams.FullScreen_RefreshRateInHz = 60;
    D3DPParams.hDeviceWindow = hWnd;
    D3DPParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
    D3DPParams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    D3DPParams.MultiSampleType = D3DMULTISAMPLE_NONE;
    D3DPParams.MultiSampleQuality = 0;
    D3DPParams.AutoDepthStencilFormat = D3DFMT_D16;

    lpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, hWnd, 
        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPParams, &lpD3DDevice);

    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

LRESULT CALLBACK Callback(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
        break;
    case WM_KEYDOWN:
        switch(wParam)
        {
        case VK_ESCAPE:
            PostQuitMessage(0);
            return 0;
            break;
        }
        break;
    }
    return(DefWindowProc(hWnd, msg, wParam, lParam));
}


liegt es am Betriebssystem (Windows Vista Home Premium), oder ist im Code ein Fehler?

Wenn ich eine Einstellung am Betriebssystem vornehmen muss, bitte eine genaue Beschreibung, hab Vista noch nicht langeund kenn mich noch nicht so gut aus

2

02.12.2007, 02:05

hab jetzt mal ein 3eck hinzugefügt und jetzt klappts...

seltsam

3

02.12.2007, 10:01

Nöh, nicht seltsam. Dein Code macht ja nichts weiter als DirectX und den Adapter/Device zu initialisieren. Das Fenster bleibt so, wie du es erstellt hast: 500x500 und WS_VISIBLE | WS_OVERLAPPEDWINDOW. Also sichtbar und eine veränderbare Fenstergröße. Runterfahren (Release) von DirectX/Device nicht vergessen! Last but not least, würde ich PeekMessage statt GetMessage verwenden.

4

03.12.2007, 10:30

GetMessage -> da wartet die funktion auf eine nachricht, sei es nun mausbewegen, knopfdruck oder sonstiges und wenn nichts kommt wird gewartet (sprich das programm tut nichts). da man aber will, dass das programm ja nebenbei weiterläuft solltest du wie gesagt PeekMessage verwenden.

du kannst das z.b. mal testen, wenn du bei deinem dreieck die farbe dauernd änderst.

bei peekmessage ändert sie die farbe ständig und bei getmessage nur, wenn du z.b. die maus hin und her bewegst, ansonsten bleibt die farbe gleich.

und nach der while schleife (also wenn das programm beendet, sei es durch fehler oder gewollt) eine DoShutdown funktion aufrufen, in der du alle wichtigen d3d/dx sachen schließt und andere globale objekte, die du vl später noch verwendest.

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

5

28.01.2008, 20:43

Ich bin per Zufall hierüber gestolpert und wollte nur erwähnen (falls es noch jemanden interressiert) das du solange im Fullscreenmodus einen Rahmen siehst, bis du in jeder Szene eine Zeichenaktion z. B. leeren des Backbuffers mit anschließendem Present() ausführst. Da du in deinem Beispiel weder den Backbuffer leerst, noch den Backbufferinhalt sichtbar machst siehst du also einen Rahmen. Das liegt daran, das Windows auch bei PeekMessage() die Nachricht WM_PAINT zu sehen bekommt und dort den Fensterinhalt zeichnet. Da beim erstellen diese nachricht ausgelöst wird siehst du also den Fensterrahmen und (wenn vorhanden) den Fenterinhalt. Das das nur bei Vista so sein soll ist allerdings merkwürdig. Ich wage die Behauptung aufzustellen, dass das auf anderen (Windows-)Beriebssystemen auch so ist, es nur noch keiner hier mitgekriegt hat.
Signaturen werden überbewertet

Werbeanzeige