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

17.08.2006, 14:33

Anfänger Problem mit Code

Hi an Alle,

habe ein paar Probleme mit meinem Code:

[list]Das Programm lägt meinen PC lam[/list][list]Es ist immer, wenn es erzeugt wird inaktiv[/list][list]Es macht einen Sound wenn es erzeugt wird[/list]
Also ich weiß überhaupt nicht warum mein Programm den ganzen PC lam legt, aber ich hoffe ihr könnt mir dabei helfen.

Aber eines denke ich zu wissen und zwar den 2 und 3 punkt in meiner Liste. Diese hängen glaube ich mit dem Parameter WS_VISIBLE zusammen den ich bei der Fenstergeneration angeben muss (weil ansonten nichts gezeichnet wird). könnt ihr mir bitte dabei helfen!!!

Hier ist der Code:

Quellcode

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
#include <windows.h>
#include <string.h>
#include <D3D9.h>
#include <D3DX9.h>

//Diese Funktion initalisiert Direct3D
BOOL InitDirect3D(HWND hWnd);           //Initialisiert den Device
HWND CreateMainWindow(HINSTANCE hInstance);         //Füllt eine WindowClass, Registriert diese und Kreiert ein Extended Window
LRESULT CALLBACK Message(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);    //MessageHandler
void CleanUpDirect3D(void);     //Gibt die Devices frei
void CreateD3DFont(void);       //Erstellt ein Schrift Objekt

//----------------------------------------------------------------------------------------------
//Globale Variablen erkennbar durch "g_"
LPDIRECT3D9 g_lpD3D;        //Globale Variable die auf DirectD3D zeigt
LPDIRECT3DDEVICE9 g_lpD3DDevice;        //Globale Variable die auf ein Device zeigt
LPD3DXFONT g_lpD3DFont;     //Globale Variable, die auf eine Schrift Objekt zeigt
//----------------------------------------------------------------------------------------------

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    HWND hWnd;
    MSG msg;

    if((hWnd = CreateMainWindow(hInstance)) == NULL)            //Generiert das Windowsfenster
    {
        MessageBox(NULL, L"Das Fenster konnte nicht erstellt werden!", L"Fehler", MB_OK|MB_ICONEXCLAMATION);
        return 1;
    }

    if(!InitDirect3D(hWnd))                         //Generiert den Direct3D Buffer und Device
    {
        MessageBox(NULL, L"Direct3D konnte nicht initalisiert werden!", L"Fehler", MB_OK|MB_ICONEXCLAMATION);
        return 1;
    }

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

    CleanUpDirect3D();                  //Gibt nach Beendigung des Programms die Direct3D Device frei
    return 0;
}

BOOL InitDirect3D(HWND hWnd)
{
    D3DPRESENT_PARAMETERS PParams;
    g_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);             //Vordefinierte Funktion von Direct3D zur Erstellung eines Devices

    if(g_lpD3D == NULL)         //Abfrage ob ein Device erstellt wurde oder nicht
    {
        MessageBox(NULL, L"Das Direct3D Objekt konnte nicht initalisiert werden!", L"Fehler", MB_OK|MB_ICONEXCLAMATION);
        return 1;
    }

    ZeroMemory(&PParams, sizeof(PParams));              //Legt einen Speicher für eine Variable an
    PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;         //PParams (der Buffer) bekommt alles zugewiesen
    PParams.hDeviceWindow = hWnd;                       //Ein handle auf das Fenster in dem der Inhalt des Buffers dargestellt wird
    PParams.Windowed = TRUE;                            //Ob er in Fullscreen ist oder nicht
    PParams.BackBufferWidth = 800;                      //Größe des Buffers
    PParams.BackBufferHeight = 600;                     //Größe des Buffers
    PParams.BackBufferFormat = D3DFMT_A8R8G8B8;         //Farbwert des Buffers

    if(FAILED(g_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &PParams, &g_lpD3DDevice)));
    {
        MessageBox(NULL, L"Das Direct3D Gerät konnte nicht angelegt werden", L"Fehler", MB_OK|MB_ICONEXCLAMATION);
        return 1;
    }

    return TRUE;
}

HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass = {
        sizeof(WNDCLASSEX),         //Größe für die Klasse angeben
        CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW,  //Standardstil angeben
        Message,
        0,
        0,
        hInstance,
        LoadIcon(NULL, IDI_WINLOGO),
        LoadCursor(NULL, IDC_ARROW),
        (HBRUSH)GetStockObject(WHITE_BRUSH),
        NULL,
        L"Window",
        LoadIcon(NULL, IDI_WINLOGO)
    };

    RegisterClassEx(&wndClass);
    
    return CreateWindowEx(
        NULL,
        L"Window",
        L"DirectX",
        WS_OVERLAPPED|WS_VISIBLE,
        10,
        10,
        800,
        600,
        NULL,
        NULL,
        hInstance,
        NULL);
}

LRESULT CALLBACK Message(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_KEYDOWN:
        switch(wParam)
        {
        case VK_ESCAPE:
            DestroyWindow(hWnd);
            return 0;
        }
    return 0;

    case WM_PAINT:
        D3DCOLOR TextColor = D3DCOLOR_XRGB(0xFF,0,0);               //Variable mit einer Direct3D Farbe
        RECT rect = {100, 100, 0, 0};                               //Werte für den Zeichenbereich
        CreateD3DFont();                                            //Generiert und lädt eine Schriftart in den Buffer

        g_lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET, RGB(0,0,0), 0, 0);    //Das Device wird neu gesetzt
        g_lpD3DDevice->BeginScene();                                    //Zeigt das man zu zeichnen beginnen will
    
        g_lpD3DFont->DrawText(NULL, L"DirectX 9.0", -1, &rect, DT_CALCRECT, TextColor);     //Gibt einen Text auf dem Bildschirm aus
            g_lpD3DFont->DrawText(NULL, L"DirectX 9.0", -1, &rect, DT_CENTER, TextColor);   //Man muss zuerst den Bereich berechnen lassen und dann kann man ihn erst ausgeben lassen.

        g_lpD3DDevice->EndScene();          //Zeigt dass das Zeichnen beendet ist
        g_lpD3DDevice->Present(0,0,0,0);    
        return 0;
    }

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

void CleanUpDirect3D(void)
{
    if(g_lpD3DDevice)
    {
        g_lpD3DDevice->Release();
        g_lpD3DDevice = NULL;
    }

    if(g_lpD3D)
    {
        g_lpD3D->Release();
        g_lpD3D = NULL;
    }
}

void CreateD3DFont(void)
{
    D3DXFONT_DESC FontDesc = {0};           
    wcscpy(FontDesc.FaceName, L"Calibri");      //Der Name der Schriftart wird gespeichert
    FontDesc.Width = 50;                        //Die schrifthöhe
    FontDesc.Height = 200;                      //Die schriftweite
    D3DXCreateFontIndirect(g_lpD3DDevice, &FontDesc, &g_lpD3DFont);         //Generiert die Schriftart mit allen Daten
}
[/list]

2

17.08.2006, 15:39

ruf mal ShowWindow(...) nach der fenstererstellung auf
nebenbei sieht deine mainloop etwas komisch aus...
WM_PAINT wird meines erachtens nur nach bedarf aufgerufen. Also wenn das fenster überdeckt wurde oder sowas....
musse ma WM_PAINT an dein fenster schicken (find ich persönlich aber neschlechte lösung..)

3

17.08.2006, 16:12

Du überprüfst garnicht, ob deine Grafikkarte deine Einstellungen verkraftet. Kann sein, dass deswegen dein PC abstürzt.
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

4

17.08.2006, 16:21

1) Wenn ich ShowWindow(hWnd, NULL) nach der Erstellung der Fensters aufrufe, bekomme ich immer einen Fehler bei dieser Methode (g_lpD3D->CreateDevice). Da ich diese Methode auf FAILED überprüfe bekomme ich immer die Fehlermeldung von mir.

2) Legt das Programm meinen PC nicht komplett lam, es geht alles nur sehr langsam. und Leggt total. Aber gehen tut noch alles.

3) Kann mir jemand sagen warum, ich WS_VISIBLE angeben muss, damit was gezeichnet wird??? Verstehe ich nähmlich nicht.

5

17.08.2006, 16:26

Zu 2): Drück mal Strg + Alt + Entf und dann Prozesse und schau ob du dort dein Programm findest. Dann wird es nämlich ausgefürt ist aber nicht sichtbar.

Zu 3): Du musst halt Styles festlegen, wie sich dein Fenster verhalten soll.
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

6

17.08.2006, 16:39

Du musst den Device und damit D3D auch nach der erstellung des Fensters aufrufen.

7

17.08.2006, 16:45

Zitat von »"yosh-summer"«

ShowWindow(hWnd, NULL)

warum null? versuch m,al SW_SHOW

8

17.08.2006, 17:34

OK, ich meine aber mit dem Parameter WS_VISIBLE nicht warum ich den angeben muss, ich weiß schon, dass man styles angeben muss. Ich habe aber jedoch das verständnis Problem, dass ich nur WS_VISIBLE angeben kann, aber nicht zum Beispiel WS_OVERLAPPEDWINDOW ohne WS_VISIBLE. Sobald ich WS_VISIBLE weglasse, wird directX nicht mehr ausgeführt. Das Fenster wird gezeichnet, aber nicht der Text den ich mit DirectX ausgeben will.

9

17.08.2006, 17:44

Habe ein weiteres Problem:

Habe meine Messageschleife folgendermaßen verändert:

Quellcode

1
2
3
4
5
6
7
8
9
10
while(g_run)
    {
        if(PeekMessage(&msg, hWnd, NULL, NULL, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
            Render();
    }


Und habe eine eigene Render Funktion geschrieben:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Render(void)
{
    D3DCOLOR TextColor = D3DCOLOR_XRGB(0xFF,0,0);               //Variable mit einer Direct3D Farbe
    RECT rect = {100, 100, 0, 0};                               //Werte für den Zeichenbereich
    CreateD3DFont();                                            //Generiert und lädt eine Schriftart in den Buffer

    g_lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET, RGB(0,0,0), 0, 0);    //Das Device wird neu gesetzt
    g_lpD3DDevice->BeginScene();                                    //Zeigt das man zu zeichnen beginnen will
    
    g_lpD3DFont->DrawText(NULL, L"DirectX 9.0", -1, &rect, DT_CALCRECT, TextColor);     //Gibt einen Text auf dem Bildschirm aus
    g_lpD3DFont->DrawText(NULL, L"DirectX 9.0", -1, &rect, DT_CENTER, TextColor);   //Man muss zuerst den Bereich berechnen lassen und dann kann man ihn erst ausgeben lassen.

    g_lpD3DDevice->EndScene();          //Zeigt dass das Zeichnen beendet ist
    g_lpD3DDevice->Present(0,0,0,0);
}


Jedoch wenn das Programm ausgeführt wird, wird nie etwas gezeichnet???


Warum ist das SO????

Eine meiner Lösungen wäre eben ich komme nie in den Else Zweig das habe ich überprüft. Jedoch warum nicht. was ist an meiner frage falsch?

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

10

17.08.2006, 18:04

verwendest du eigentlich den debugger?!
Wenn nicht, wirds höchste zeit... überprüf mal, ob alle Vars den erwarteten Wert haben...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige