Cursor im Menü anzeigen lassen?!



  • Hallo,

    ich benutze folgendes um einen Cursor anzuzeigen:

    http://web.archive.org/web/20041214013511/bcbdev.com/faqs/faq24.htm

    Der wird halt nur nicht im MainMenu angezeigt. Wie kann ich dies ändern?

    Lg,
    drummi



  • Hi,

    das TMainMenu gehört zur Non Client Area des Formulares.
    Dafür wird beim MouseMove-Event in diesem Bereich eine Message geschickt (WM_NCMOUSEMOVE).

    Die mappen wir und setzen einen Cursor.

    *.h-Datei:

    public:
    
       // Cursor im MainMenu
       HCURSOR hMenuCursor;  // Resourcen-Cursor
       HCURSOR h_IDC_CROSS;  // Windows-Cursor
    
       virtual void  __fastcall NC_MouseMove(TMessage& Msg);
    
    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_NCMOUSEMOVE,TMessage, NC_MouseMove)
    END_MESSAGE_MAP(TForm)
    

    *.cpp-Datei:

    __fastcall TForm1::TForm1(TComponent* Owner)  : TForm(Owner)
    {
       hMenuCursor = (HCURSOR)LoadCursor(HInstance, "CURSOR_1" );
       h_IDC_CROSS = (HCURSOR)LoadCursor(NULL, IDC_CROSS );
    }
    
    void  __fastcall TForm1::NC_MouseMove(TMessage& Msg)
    {
       ::SetCursor( hMenuCursor );
    }
    

    "CURSOR_1" ist hier ein Cursor in der *.res-Datei des Projektes (Bearb. m. BildEditor), die BCB-Cursors bekommst du
    auch geladen (s. winuser.h).

    edit:
    Beispiel:

    ::SetCursor(  h_IDC_CROSS  ));
    

    edit2: LoadCursor in den Konstruktor geschrieben 😉

    mfg
    kpeter



  • danke für deine schnelle Antwort. Werde ich ausprobieren.



  • ja danke, es funktioniert. Allerdings nur bei den MenuItems in der 1. Zeile. Die Buttons die darunter dann "aufklappen", haben immer noch den ganz gewöhnlichen Windows Cursor (crDefault).

    weißt du dafür auch eine Lösung?



  • Sorry, hab ich was unterschlagen ? 😃

    Füge Code für die Message WM_ENTERIDLE ein.

    // *.h in der MESSAGE_MAP einfügen
       MESSAGE_HANDLER(WM_ENTERIDLE  ,TMessage, WM_EnterIdle)
    

    Und schreib ne analoge Funktion wie oben... 😉

    mfg
    kpeter



  • hey danke!!! Funktioniert prima.
    Mir ist gerade noch eine Frage darauf eingefallen. Die Cursoränderung war ja nur in Bezug auf das Menü. Das heißt, dass bei den MessageBoxen ja noch der Windows standard angezeigt wird, weil das ja sicherlich vom System ist, oder?

    Gibt es da eigtl. auch eine Möglichkeit den Cursor für die Application->MessageBox umzustellen? Ich hab da zwar schon google gefragt, aber der konnte mir keine passenden antwrten geben.



  • drummi schrieb:

    ...eine Möglichkeit den Cursor für die Application->MessageBox...

    Ja, ist aber etwas aufwändig. Zuerst das Fensterhandle der Box ermitteln und dann mit SetClassLong den neuen Cursor setzen.
    Das auch für die Buttons der Box, da sich über denen der Cursor sofort wieder ändert.
    Um an das Handle dieser Buttons ranzukommen, muss man die Child's der MessageBox herausfinden... Merkst du was? 😉

    mfg
    kpeter

    edit:
    Link



  • so, endlich wieder halbwegs gesund...
    ich merke, dass es viele zu aufwendig ist. hast recht. na dann lass ich dass eben sein, ich hab ja meinen cursor für den rest! (viell. setz' ich mich da i-wann mal dran.)

    trotzdem danke.

    lg,
    drummi


Anmelden zum Antworten