Mauszeiger wird zum Wait-Cursor



  • Hallo,

    ich habe den Anfang eines 2D-Spiels (Vollbild) vor mir.
    Das Programm funkt soweit, nur verwandelt sich der Cursor - beim Start - zur Sanduhr, obwohl ich

    wcx.hCursor       = LoadCursor( hInst, IDC_ARROW);
    

    angegeben habe.
    Ich denke es liegt an der Endlosschleife, doch wie kann ich das ändern??



  • Normalerweise geht der Warte-Cursor weg sobald man Nachrichten verarbeitet.
    Du brauchst also eine Nachrichten-Schleife.
    Wenn du jetzt keine hast... sieht das üblicherweise so aus:

    void MeinSpieleLoop()
    {
        while(1)
        {
            TuIrgendwas();
    
            // Nachrichtenschleife:
            {
                MSG msg;
                while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
                {
                    ::TranslateMessage(&msg);
                    ::DispatchMessage(&msg);
                }
            }
        }
    }
    


  • Die Nachrichtenschleife hab ich schon. Das bringt bei mir nichts.
    Ich habe auch schon versucht den oben genannten Code in die Schleife einzusetzen, aber das war es auch nicht. 😞

    Kennt denn niemand das Problem?? Oder ist das zu simpel?? 😕



  • Also bei mir ist das auch, aber sobald ich den Mauszeiger ein bisschen über dem Fenster bewege, wird er zum normalen Cursor.

    EDIT:
    Hat vielleicht was mit der redraw eigenschaft der WNDCLASS zu tun?...



  • Ich kann mich nichtmehr genau erinnern, ist schon zu lange her. Es gab da einige Eigenheiten...
    Versucht mal
    * WM_SETCURSOR zu überschreiben
    * gleich nach dem öffnen des Fensters selbst ein ::SetCursor aufzurufen



  • Ich glaube aber, du musst HREDRAW | VREDRAW setzen.



  • @ceplusplus: was soll das genau sein? 😕

    @hustbaer: Ja, mit ::SetCursor in der Schleife läufts

    wie kann ich eigentlich einen eigenen Cursor mit einbinden (ohne andere Dateien) ?

    Bei meinem Versuch

    wcx.hCursor = LoadCursor( hInst, "cursor.cur");
    

    wird gar kein Cursor angezeigt.

    thx,
    XCoder++



  • zu 1: Lies dir mal ein Buch über die Winapi durch, das sind Fenstereigenschaften
    zu 2: Ressourcen? Welcher Comnpiler?/Buch schon gelesen... 😉 😃



  • langeweile schrieb:

    zu 1: Lies dir mal ein Buch über die Winapi durch, das sind Fenstereigenschaften

    Ok, werd ich demnächst machen... :p - wenn ich eins habe 😃

    langeweile schrieb:

    zu 2: Ressourcen? Welcher Comnpiler?/Buch schon gelesen...

    Was willst du mir damit sagen?
    Kann man Cursor nur mit *.rc Dateien einbinden?
    Ich hab den VC++ Compiler und folgende Bücher:
    *C/C++: Die Referenz | ISBN: 9783827242273 (C/C++ Die Referenz, Louis)
    *Spieleprogrammierung mit DirectX und C++ | ISBN: 9783898428279 (Spieleprogrammierung mit DirectX und C++, Kaiser & Lensing)



  • XCoder++ schrieb:

    @hustbaer: Ja, mit ::SetCursor in der Schleife läufts

    Ja, klar dass es mit ::SetCursor in der Schleife läuft, das sollte aber eigentlich nicht notwendig sein.
    Ich meinte ein einmaliges ::SetCursor.



  • XCoder++ schrieb:

    langeweile schrieb:

    zu 2: Ressourcen? Welcher Comnpiler?/Buch schon gelesen...

    Was willst du mir damit sagen?
    Kann man Cursor nur mit *.rc Dateien einbinden?

    Ja, in der rc steht der Pfad zur cur-Datei, hab aber grad kein Beispiel...

    €: jetzt schon:

    rc:

    #include <windows.h>
    ...
    maus CURSOR maus.cur
    ...
    
    wc.hCursor	= LoadCursor(hInstance, "maus");
    


  • Danke für alle Antworten! 👍

    Übrigens:
    Der Fehler mit dem Warte-Cursor war dumm von mir. Es müsste richtig heißen:

    wcx.hCursor = LoadCursor( NULL, IDC_ARROW);

    Dann braucht man gar kein ::SetCursor ... 🙄

    MfG,
    XCoder++



  • Hehe, ja.
    Ich sagte ja ich kann mich nichtmehr genau erinnern.
    Ich glaube das seltsame Verhalten was ich mal hatte war wenn man dem Fenster beim Erstellen 0 als Cursor mitgiebt - dann muss man IIRC WM_SETCURSOR selbst behandeln.


Anmelden zum Antworten