Mauszeigerbild ändern

EriFo

Erfahrenes Mitglied
Ich hab mir von der Klasse CStatic ein Neues Steuerelement abgeleitet, welches dann nach meinen wüschen tanzt.
Nun würde ich gerne den Mauszeiger ändern wenn der Benutzer mit der Maus darüber geht.
Das Zeichnen des Controls und das reagieren auf Nachrichten klappt alles super aber es will einfach nicht den Mauszeiger ändern.

In einen Dialog hatte das schonmal mit
Code:
SetCursor( LoadCursor(NULL, IDC_HAND) )
geklappt aber das will jetzt nicht mehr. °-_-

M.f.G. Erik
 
Du musst bei jedem WM_SETCURSOR, dass an deine Klasse kommt, ein SetCursor aufrufen und TRUE zurückgeben, NICHT an die Basisklasse oder DefWindowProc weiterleiten!
 
Aha - danke.
Mal sehen ob ich das hinbekomme ^_^

~*~

Anscheinend nicht ... °-_-
Ich habe meiner Klasse PreTranslateMessage()
hinzugefügt, aber die bekommt nie die Nachricht WM_SETCURSOR.

M.f.G. Erik
 
Zuletzt bearbeitet:
Hmm, das sollte eigentlich immer direkt an die Proc gesendet werden; obwohl PreTranslateMessage ja eigentlich alle Messages vorher bekommen sollte.
Hast du bei der Klassen-Definition für den Cursor NULL angegeben? Wenn der Cursor im WINDOWCLASS nicht auf NULL steht, dann wird WM_SETCURSOR nicht gesendet.
 
... WINDOWCLASS ... hmm
Die musst ich benutzen, um ein anderes Steuerelement, welches ich von einem "generic" CWnd abgeleitet hab, zu registrieren.

Ich bin jetzt ins Grübeln geraten, aber ich dachte, da ich ja dieses Steuerelement von CStatic abgeleitet habe, bräuchte ich das diesmal nicht.

Also im Klartext - ich hab in meiner Klasse "CStaticUrl" nichts mit WINDOWCLASS oder RegisterWindowClass() gemacht - sollte ich das ? °^__^
 
Ach so, in dem Fall nimmt er die Klasse von CStatic. STATIC sollte da eigentlich einen Cursor setzen. Allerdings fällt mir ein, dass Statics so vordefiniert sind, dass die keine Mousebewegung usw. abfragen (es kommt z.Bsp. kein WM_MOUSEMOVE). Evtl. hängt da WM_SETCURSOR mit dran.

Probier mal, in deiner Klasse auf WM_GETDLGCODE hin ein return DLGC_WANTALLKEYS. Dann bearbeitet die Static auch Maus-Messages und sollte, wenn ich mit der Vermutung richtig liege, auch WM_SETCURSOR senden.
 
Also :

In PreTranslateMessage(...) kommt weder eine Nachricht WM_SETCURSOR noch WM_GETDLGCODE.

In WindowProc bekomm ich beide aber wenn ich dich richtig verstanden habe ist's da eh' sinnlos weils schon zu "spät" ist.

Wenn ich aber mal pauschal immer in PreTranslateMessage(...) SetCursur(...) aufrufe,
wird überhaupt kein Mauszeiger mehr angezeigt - aber auch nur wenn SetCursor(..) mit den 2 Doppelpunkten dafor - also ::SetCursor(...) aufgerufen wird. (ich dächt das war der Globale Namespace)

Ich benutze aber bei OnMouseMove(...) SetCapture(...) und RelaeseCapture(...)
könnte das einen "Fehler" dieses Typs verursachen !?

~+~

Hab das Set- und ReleasCapture(...) mal auskommentiert - geht trotzalledem nicht. >_<
Ich bekommen auch WM_MOUSEMOVE und CO. - muss man bei CStatic aber erst im Resourceneditor "anknipsen".

M.f.G. Erik
 
Zuletzt bearbeitet:
Äh, Moment, gerade in der WindowProc ist es richtig. Genau da drauf reagieren, und return TRUE zurückgeben. Mit nicht die Basisklasse bzw. DefWindowProc aufrufen meinte ich, dass das return die WindowProc direkt beendet und die Basisklasse die Nachricht gar nicht erst sieht.
 
Das mit "return TRUE;" und nicht weiterleiten ist schon klar ^_^
Also meine WindowProc(...) sieht so aus :

Code:
LRESULT CStaticUrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_GETDLGCODE:
		lParam =  DLGC_WANTALLKEYS;
		break;
	case WM_SETCURSOR:
		Beep(1000, 20);
		SetCursor(LoadCursor(NULL,IDC_WAIT));
		return TRUE;
	case WM_MOUSEMOVE:
		Beep(1000, 20);
		SetCursor(LoadCursor(NULL,IDC_WAIT));
		return TRUE;
	}

	return CStatic::WindowProc(message, wParam, lParam);
}
(das Piepen zeigt mir nur was er alles macht oder nich)

und auch nach der bewährten "Ich-find-den-Fehler-nich-also-probier-ich-alles-sinnlos-scheinende-durch" - Methode klappt es nicht °-___-

Naja - bringt mich auch nicht um - werd ich schon noch irgendwann rausbekommen.
Ich dank dir aber für deine Hilfe bisher.

M.f.G. Erik
 
Zuletzt bearbeitet:
Schade, ich seh nur einen Fehler, aber die anderen Auswertungen sind richtig.

Ändere das:

case WM_GETDLGCODE:
return DLGC_WANTALLKEYS;

Der Rückgabewert muss wirklich mit return zurückgegeben werden.
 

Neue Beiträge

Zurück