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

28.03.2010, 12:10

HINSTANCE unused?

hallo,

ich schreibe eine ganz normale anwendung zum testen von ein paar gui klassen, sieht so aus:

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
#include "global.h"

int WINAPI WinMain( HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int nShowCmd)
{
    CWindow window("test", 800, 600, hInstance);
    CButton button("button", 50, 50, 200, 100);

    window.AddControlElement(&button);

    while(true)
    {
        if(!window.Closed()) window.DoMessageLoop();

        if(button.Pressed()) break;

        Sleep(1);
    }

    window.Destroy();

    return 0;
}


jetzt debugge ich das programm und der debugger sagt mir, dass hInstance so aussieht: unused | 9460301. wie kann das sein? windows muss mir doch meine Instanz geben :?

2

28.03.2010, 12:13

Das ist normal. Ist alles richtig. Läuft denn alles so wie es soll?

3

28.03.2010, 12:38

ne, läuft nicht alles...

wenn ich auf den button klicke, schließt sich das programm nicht.

die window callback sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_DESTROY:
        {
            CWindow::windows[hWnd]->closed = true;
        }
        case WM_COMMAND:
        {
            CWindow::windows[hWnd]->controlElements[(HWND)lParam]->SetEvent(HIWORD(wParam));
        }
    }

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


hier wird die anweisung bei WM_COMMAND auch ausgeführt, anscheinend stimmt ein fenster handle nicht, das SetEvent nicht aufgerufen wird, zumindest nicht für das richtige fenster. achja, windows und controlElements sind maps <HWND, CWindow*> bzw <HWND, CControlElement*>.

4

28.03.2010, 12:47

Wie Wäre es mit PostQuitMessage(0); ?

C-/C++-Quelltext

1
windows[hWnd]


Das sieht auch merkwürdig aus. Normal musst du die Position angeben und nicht ein Handle übergeben.

5

28.03.2010, 12:56

ds ist aber eine map. da geht das mit windows[hWnd]. das problem ist nicht das beeden^^ ich will nur wissen ob auf den button geklickt wurde.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

28.03.2010, 12:59

Was passiert denn in SetEvent vom Button und was liefert Pressed? Übrigens ist deine Window Prozedur fehlerhaft.

7

28.03.2010, 13:03

Zitat von »"David_pb"«

Übrigens ist deine Window Prozedur fehlerhaft.


:lol: Kleiner Wink mit'm Zaunpfahl.
(return ?)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

28.03.2010, 13:08

Zitat von »"TrikkieMikkie"«


:lol: Kleiner Wink mit'm Zaunpfahl.
(return ?)


...und break. :)

9

28.03.2010, 13:08

die beiden funktionen sehen so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CButton::SetEvent(int pEvent)
{
    if(pEvent == BM_CLICK) pressed = true;
}

bool CButton::Pressed()
{
    if(pressed) 
    {
        pressed = false;
        return true;
    }
    else return false;
}


was ist denn falsch an meiner callback? ich sehe nichts falsches :oops:

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

28.03.2010, 13:13

Versuchs mal mit BN_CLICKED. Bei deiner Window Proc fehlen in der switch Anweisung bei jedem case das break. Außerdem liefert die Funktion immer den Wert von DefWindowProc zurück obwohl du einige Nachrichten behandelst.

Werbeanzeige