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

23.12.2007, 00:03

Problem mit CreateDevice

Hi,
also folgendes:
ich habe ein Fenster erstellt und mit CreateDevice in den Vollbildmodus umgeschaltet, was auch klappt, der Vollbildmodus erscheint. Doch kann ich mein Programm nur durch alt F4 beenden. Meine Tasten werden nicht verarbeitet. Weiterhin bleibt der Prozess dann im Task manager weiterhin bestehen.
Ich hab schon viel ausprobiert, aber komme nicht mehr weiter. Wahrscheinlich ist es ein ganz minimaler Fehler, aber ich programmier noch nicht solang mit DirectX^^
Hier der 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
84
85
86
87
88
#include <d3d9.h>
#include <windows.h>

LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = 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);

    g_pD3D = 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;
    
    g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, hWnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPParams, &g_pD3DDevice);
    ShowCursor(FALSE);
    while(GetMessage(&msg, hWnd,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    g_pD3D->Release();
    g_pD3DDevice->Release();
    return (int) msg.wParam;
}

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;
default:
    return(DefWindowProc(hWnd, msg, wParam, lParam));
    }
    return 0;
} 

ich bin für jede Hilfe dankbar
MFG

2

23.12.2007, 00:41

Müsste man DefWindowProc nicht immer zurückgeben?
Übrigens reicht es, wenn du nur break; oder return 0; schreibst ;)

3

23.12.2007, 00:51

Gib mal bei GetMessage statt hWnd beim zweiten Parameter 0 an.

4

23.12.2007, 00:55

@Kalero:

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
LRESULT CALLBACK Callback(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_DESTROY:
        {
            PostQuitMessage(0);
        } break;
        case WM_KEYDOWN:
        {
            switch(wParam)
            {
                case VK_ESCAPE:
                {
                    PostQuitMessage(0);
                } break;
            }
        } break;
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }

    return 0;
}
ist schon korrekt ^^
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

5

23.12.2007, 01:01

danke leute jetz gehts^^

6

23.12.2007, 01:30

@Deviloper:
Dann etschuldige ich mich mal für die falsche Vermutung. ^_^
Wäre es so wie ich das gesagt habe denn nachteilig?
habs bisher immer so gemacht und hat auch funktioniert.

7

23.12.2007, 10:58

Hmm ... naja es wird halt doppelt abgehandelt ... ist nicht wirklich sinnvoll und nach http://msdn2.microsoft.com/en-us/library/ms632620.aspx soll bsw. WM_DESTROY zero zurück geben, wenn du die Nachricht behandelt hast ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

8

23.12.2007, 11:05

@Deviloper:
Danke, wieder bisschen schlauer geworden ^_^

Werbeanzeige