Problem mit SpeedButton und Shape
-
Habe einen Custom TSpeedButton für Skin
TTeSpeedButton = class(TTeGraphicControl)
Ich möchte gern einen Fontfarbe-Button darstellen. Dazu habe ich ein Image genommen mit A und in dem SpeedButton über Glyph eingefügt. Nun nahm ich ein TShape und legte einen 5px hohen Balken unterhalb des "A" und dieses TShape soll mir die aktuell gewählte Farbe anzeigen.
Klappt alles super, nur wenn ich mit der Maus über den TShape stehe, dann wird der TSpeedButton nicht markiert. Wenn man mit der Maus über dem TSpeedButton steht, wird dieser Button mit einem Hover Effekt belegt.
Sowas klappt nicht, da TTeGraphicControl kein Handle kennt, auch SetFocus() klappt nicht.
void __fastcall TForm1::FontColorShapeMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { SendMessage(nFontColor->Handle, WM_MOUSEMOVE, X,Y); }
Kann wer helfen und sagen wie ich den Hover-Effekt auf den SPeedButton legen kann, wenn Maus noch über dem TShape liegt? Ich vermute mal gar nicht.
-
Hi,
void __fastcall TForm1::FontColorShapeMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { TShiftState ssNone; SpeedButton1MouseMove(this, ssNone, X, Y); } //--------------------------------------------------------------------------- void __fastcall TForm1::SpeedButton1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { SpeedButton1->Caption = ";)"; } //---------------------------------------------------------------------------
mfg
kpeter
-
Danke, aber das ist leider nicht die Lösung. Es geht ja darum das der SpeedButton blau wird, wenn die Maus drüber liegt und nun ein TShape noch über dem SpeedButton liegt und das MouseMove an den SpeedButton weitergeben müsste, so das der SpeedButton auch dort blau wird.
-
Ich hab keine Ahnung, was deine zugekauften Komponenten so können. Aber frag doch mal den Hersteller.
Du könntest den farbigen Balken auch direkt aufs Glyph malen, und so das Shape vermeiden.
-
Hi,
du kannst auch eine Message Perform senden, in der Art:
void __fastcall TForm1::FontColorShapeMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { SpeedButton1->Perform(WM_LBUTTONDOWN, true, 0); . . SpeedButton1->Perform(WM_LBUTTONUP, true, 0); }
Schau mal in der WinAPI nach, wie das Message Processing abläuft.
mfg
kpeter
-
Danke für den Hinweis!
void __fastcall TForm1::FontColorShapeMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { SpeedButton1->Perform(WM_MOUSEMOVE, 0, LOWORD(X) & HIWORD(Y)); // bewirkt leider nichts SpeedButton1->Perform(WM_MOUSEMOVE, 0, 1); // bewirkt leider nichts }
Ich brauch ja WM_MOUSEMOVE, aber wie muss LPARAM ausschauen? Denn dort soll in ein Integer sowohl X als auch Y rein. So passiert jedenfalls leider noch nichts.
-
Welcher Code steht denn bei dir für das Speedbutton( also zB. SpeedButton1MouseMove).
Wenn es kein Event gibt, passiert nix.
mfg
kpeter
-
Habe es nun mit CM_MOUSEENTER hinbekommen
Danke für die Hilfe!