Focus Message für TGraphicControl
-
Hallo
ich möchte das meine TGraphicControl Komponente auch den Focus bekommen kann.
Problem: Der Hintergund des Textes einer TCunstomControl Komponente kann man ja nicht transparent machen, deshalb muß ich eine TGraphicControl Komponente nehmen. Aber diese Komponente soll auch den Focus bekommen können !
Was muß ich machen, damit meine Komponente auch den Focus bekommt ?Pronto451
[ Dieser Beitrag wurde am 28.06.2003 um 21:28 Uhr von Pronto451 editiert. ]
-
setze im CreateParams deiner kompo den Stil WS_TABSTOP.
-
Hallo Sunday,
So tief bin ich noch nicht in der Komponentenentwicklung, deshalb weiß ich noch nicht was du mit "CreateParams" meinst bzw. was das ist,
aber ich schaue mir gerade deine Kompos an und werde es rausfinden.Das funktioniert irgendwie nicht, ich hab das so wie in deiner Kompo gemacht, aber bei der Zeile
inherited::CreateParams(Params);
bekomme ich den Fehler: E2451 Undefiniertes Symbol 'CreateParams'
In der Borland Hilfe steht auch nicht, das es bei TGraphicControl eine CreateParams gibt !??! Muß ich da noch was includen oder ?
Pronto451
[ Dieser Beitrag wurde am 29.06.2003 um 21:56 Uhr von Pronto451 editiert. ]
-
hm laut hilfe kann ein TGraphicControl keinen fokus erhalten, stattdessen soll man TCustomControl nehmen... was willst du denn für einen komponente erstellen?
da du auch kein Handle hast, kannst du die eigenschaft auch nicht per SetWindowLong setzen...
-
Hallo Sunday,
ich habe eine CheckBox-Komponente zu erst mit TGraphicControl programmiert, wollte aber die Tab-Funktionalität haben. Deshalb habe ich dann eine CheckBox mit TCustomControl programmiert. Diese möchte ich jetzt jedoch auf einem Image platzieren, wobei der Hintergrund der CheckBox jedoch nicht transparent gemacht werden kann (Hat jedenfalls hier im Forum gestanden).
Wenn ich jetzt die Tab-Funktionalität nicht in eine TGraphicControl Komponente rein kriege. bleiben mir nur 2 Möglichkeiten:
a.) ich Benutze 2 Komponenten (eine Box und ein Label)
b.) ich programmiere eine Komponente die aus einer TCustomControl und einer TGraphicControl besteht.Pronto451
PS. Gibt es zu b.) igendwo nen Beispiel, denn das hab ich auch noch nicht gemacht
-
naja eine checkbox ist nichts anderes als ein button. leite also von TCheckBox eine neue kompo ab und überschreib dort CreateParams und setzte den Style BS_OWNERDRAW (ownerdraw-style für buttons), eventuell auch BS_3STATE. danach musst du die message CN_DRAWITEM abfangen und bist ab sofort selbstverantwortlich für das aussehen deiner checkbox, d.h. du musst alles selber zeichnen...
text zeichnen mit SetBkMode(FCanvas->Handle, TRANSPARENT); und dann DrawText. gugg dir mal meinen TColorButton an.
mit DrawFrameControl kannst du dir allerdings eine standard checkbox zeichnen lassen. die dann aber natürlich wieder keinen transparenten background hat.
-
Hallo Sunday,
ich werde wohl Möglichkeit a.) benutzen. (Ne ist auch Sch...)
Durch die WinAPI deiner Kompos steige ich einfach nicht durchJedenfalls kommt bei mir nix dabei raus, weil ich einfach nicht weiß was welche Funktion macht, bzw. was ich für meinen Button anpassen muß.
Das verarbeiten von Messages per z.B "MESSAGE_HANDLER(WM_SETFOCUS, TMessage, WMSetFocus)" krieg ich ja hin, aber das sieht bei dir ja wieder ganz anders aus.
Pronto451
PS Hier mal meine Kompo :
.cpp//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "CLCheckBox.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // Mit ValidCtrCheck wird sichergestellt, daß die erzeugten Komponenten // keine rein virtuellen Funktionen besitzen. // static inline void ValidCtrCheck(TCLCheckBox *) { new TCLCheckBox(NULL); } //--------------------------------------------------------------------------- __fastcall TCLCheckBox::TCLCheckBox(TComponent* Owner) : TCustomControl(Owner) { Height = 13; Width = 90; Caption = "TCLCheckBox"; Cursor = crHandPoint; // ---- Interne Variablen ---- FMouseIn = false; FMousePressed = false; FChecked = false; FAutoSize = true; FEnabled = true; TabStop = true; FBgColor = (TColor)RGB(184,209,255); // Blue FBgColorFocus = (TColor)RGB(255,196,184); // Red FBgColorMOver = (TColor)RGB(255,253,206); // Yellow FFontMOver = new TFont(); } //--------------------------------------------------------------------------- __fastcall TCLCheckBox::~TCLCheckBox(void) { delete FFontMOver; } //--------------------------------------------------------------------------- namespace Clcheckbox { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TCLCheckBox)}; RegisterComponents("CLKomponenten", classes, 0); } } //----------------------- Button zeichnen ----------------------------------- void __fastcall TCLCheckBox::Paint(void) { // ---- Außenrahmen zeichnen ---- Canvas->Pen->Color = clGray; Canvas->MoveTo(0, 12); Canvas->LineTo(0, 0); Canvas->LineTo(12, 0); Canvas->Pen->Color = clWhite; Canvas->MoveTo(12, 1); Canvas->LineTo(12, 12); Canvas->LineTo(0, 12); // ---- Hintergrundfarbe zeichnen ---- if (FEnabled) { if (FMousePressed) { Canvas->Pen->Color = BgColorFocus; Canvas->Brush->Color = BgColorFocus; } else if (FMouseIn) { Canvas->Pen->Color = BgColorMOver; Canvas->Brush->Color = BgColorMOver; Canvas->Font = FontMOver; } else if (FFocus) { Canvas->Pen->Color = BgColorFocus; Canvas->Brush->Color = BgColorFocus; Canvas->Font = Font; } else { Canvas->Pen->Color = BgColor; Canvas->Brush->Color = BgColor; Canvas->Font = Font; } Canvas->Rectangle(1, 1, 12, 12); // ---- Text zeichnen ---- Canvas->Brush->Style = bsClear; Canvas->TextOut(16,0,Caption); } else { // ---- Text Disabled ausgeben ---- Canvas->Brush->Style = bsClear; Canvas->Font->Color = clWhite; Canvas->TextOut(17,1,Caption); Canvas->Font->Color = clGray; Canvas->TextOut(16,0,Caption); Canvas->Font->Color = clBlack; } // ---- Haken zeichnen ---- if (FChecked) { Canvas->Pen->Color = clBlack; Canvas->Brush->Color = clBlack; Canvas->MoveTo(3,7); Canvas->LineTo(3,4); Canvas->MoveTo(4,8); Canvas->LineTo(4,5); Canvas->MoveTo(5,9); Canvas->LineTo(5,6); Canvas->MoveTo(6,8); Canvas->LineTo(6,5); Canvas->MoveTo(7,7); Canvas->LineTo(7,4); Canvas->MoveTo(8,6); Canvas->LineTo(8,3); Canvas->MoveTo(9,5); Canvas->LineTo(9,2); } } //--------------------------------------------------------------------------- void __fastcall TCLCheckBox::Click(void) { if (FEnabled) { FChecked = !FChecked; SetFocus(); Invalidate(); } inherited::Click(); } //--------------------------------------------------------------------------- void __fastcall TCLCheckBox::DblClick(void) { Click(); } //------------------------- Checked setzen ---------------------------------- void __fastcall TCLCheckBox::SetChecked(bool Status) { FChecked = Status; Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TCLCheckBox::WMKillFocus(TMessage& Msg) { FFocus = false; Invalidate(); inherited::Dispatch(&Msg); } //--------------------------------------------------------------------------- void __fastcall TCLCheckBox::WMSetFocus(TMessage& Msg) { FFocus = true; Invalidate(); inherited::Dispatch(&Msg); } //-------------------- Hintergrundfarbe angeben ----------------------------- void __fastcall TCLCheckBox::SetBgColor(TColor color) { FBgColor = color; Invalidate(); } //-------------------- Hintergrundfarbe angeben ----------------------------- void __fastcall TCLCheckBox::SetBgColorFocus(TColor color) { FBgColorFocus = color; } //-------------------- Hintergrundfarbe angeben ----------------------------- void __fastcall TCLCheckBox::SetBgColorMOver(TColor color) { FBgColorMOver = color; } // ------------------------- Mouse Move -------------------------------------- void __fastcall TCLCheckBox::WMMouseMove(TMessage &Msg) { if ( !MouseCapture ) // Alle Mouse Events an Komponente SetCaptureControl(this); GetCursorPos(&FMPosScreen); // Mausposition zum Screen 0-Punkt FMPosButton = ScreenToClient(FMPosScreen);// Mausposition zum Button umrechnen if ( FMPosButton.x < 0 || // Maus außerhalb Button ? FMPosButton.x >= Width || FMPosButton.y < 0 || FMPosButton.y >= Height ) { FMouseIn = false; // Maus außerhalb ! if ( !FMousePressed ) { SetCaptureControl(NULL); Invalidate(); // Butten neu zeichnen (NoBorder) } } else { if ( !FMouseIn ) { FMouseIn = true; // Maus auf Button ! Invalidate(); } } inherited::Dispatch(&Msg); } //--------------------------------------------------------------------------- void __fastcall TCLCheckBox::MouseDown (TMouseButton Button, Classes::TShiftState Shift, int X, int Y) { if ( Button == mbLeft ) { FMousePressed = true; Invalidate(); } TCustomControl::MouseDown (Button, Shift, X, Y); } //--------------------------------------------------------------------------- void __fastcall TCLCheckBox::MouseUp (TMouseButton Button, Classes::TShiftState Shift, int X, int Y) { if ( Button == mbLeft ) { FMousePressed = false; FMouseIn = false; Invalidate(); } TCustomControl::MouseUp (Button, Shift, X, Y); } //--------------------------------------------------------------------------- void __fastcall TCLCheckBox::KeyDown(unsigned short &Key, Classes::TShiftState Shift) { if ( Key == VK_SPACE ) Click(); if ( Key == VK_RETURN ) keybd_event((BYTE)(VK_TAB),(BYTE)MapVirtualKey(VK_TAB,0),0l, 0l); } //------------------------- Caption angeben --------------------------------- void __fastcall TCLCheckBox::SetCaption(AnsiString Text) { FCaption = Text; if ( FAutoSize ) Width = Canvas->TextWidth(Caption)+18; Invalidate(); } //------------------------- AutoSize festlegen ------------------------------ void __fastcall TCLCheckBox::SetAutoSize(bool var) { FAutoSize = var; if ( FAutoSize ) Width = Canvas->TextWidth(Caption)+18; Invalidate(); } //---------------------- Font Mous über Buttom ------------------------------ void __fastcall TCLCheckBox::SetFontMOver(TFont *font) { FFontMOver->Assign(font); } //------------------------- Enabled festlegen ------------------------------- void __fastcall TCLCheckBox::SetCustomEnabled(bool Value) { FEnabled = Value; Invalidate(); TControl::Enabled = Value; } .hpp
//--------------------------------------------------------------------------- #ifndef CLCheckBoxH #define CLCheckBoxH //--------------------------------------------------------------------------- #include <SysUtils.hpp> #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> //--------------------------------------------------------------------------- class PACKAGE TCLCheckBox : public TCustomControl { private: bool FChecked; // Checked Status bool FMouseIn; // Maus im Button ? bool FMousePressed; // Maus-Taste gedrückt ? bool FFocus; bool FAutoSize; bool FEnabled; TPoint FMPosButton; // Mausposition im Button TPoint FMPosScreen; // Mausposition auf dem Screen AnsiString FCaption; TColor FBgColor; TColor FBgColorFocus; TColor FBgColorMOver; TFont *FFontMOver; // TextFont wenn Maus über Button protected: void __fastcall SetChecked(bool Status); void __fastcall DrawBorder(void); void __fastcall SetAutoSize(bool); void __fastcall SetFontMOver(TFont*); // Schriftart wenn Maus über Button void __fastcall SetBgColor(TColor color); void __fastcall SetBgColorFocus(TColor color); void __fastcall SetBgColorMOver(TColor color); void __fastcall SetCaption(AnsiString Text); void __fastcall Paint(void); void __fastcall SetCustomEnabled(bool); DYNAMIC void __fastcall Click(void); DYNAMIC void __fastcall DblClick(void); DYNAMIC void __fastcall KeyDown(unsigned short &Key, Classes::TShiftState Shift); DYNAMIC void __fastcall MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y); DYNAMIC void __fastcall MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y); void __fastcall WMKillFocus(TMessage&); void __fastcall WMSetFocus(TMessage&); void __fastcall WMMouseMove(TMessage &Message); // Maus Move Event verarbeiten // ---- System Events ---- BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_MOUSEMOVE, TMessage, WMMouseMove) MESSAGE_HANDLER(WM_KILLFOCUS, TMessage, WMKillFocus) MESSAGE_HANDLER(WM_SETFOCUS, TMessage, WMSetFocus) END_MESSAGE_MAP(TCustomControl) public: __fastcall TCLCheckBox(TComponent* Owner); __fastcall ~TCLCheckBox(void); __published: __property bool Checked = { read = FChecked, write = SetChecked, default=false }; __property TColor BgColor = { read = FBgColor, write = SetBgColor}; __property TColor BgColorFocus = { read = FBgColorFocus, write = SetBgColorFocus}; __property TColor BgColorMOver = {read = FBgColorMOver, write = SetBgColorMOver}; __property AnsiString Caption = { read = FCaption, write = SetCaption}; __property TFont* FontMOver = { read = FFontMOver, write = SetFontMOver }; __property bool AutoSize = {read = FAutoSize, write = SetAutoSize, default=true}; __property bool Enabled = {read = FEnabled, write = SetCustomEnabled, default=true}; __property TabStop; __property Font; __property TabOrder; __property ParentFont; __property Hint; __property ShowHint; __property Visible; __property Cursor; __property OnClick; __property OnEnter; __property OnExit; __property OnKeyDown; __property OnKeyPress; __property OnKeyUp; __property OnMouseDown; __property OnMouseMove; __property OnMouseUp; }; //--------------------------------------------------------------------------- #endif
[ Dieser Beitrag wurde am 30.06.2003 um 11:55 Uhr von Pronto451 editiert. ]
-
naja ich habe einfach die WndProc() überschrieben statt mit dem message_handler zu arbeiten...
-
Hallo Sunday,
ich zeichne doch meinen Button schon komplett selbst, ich brauche doch nur einen Transparenten Hintergrund auf den ich zeichne ?!?!
Geht das nicht einfacher ?
Pronto451
-
Hallo,
kann ich nicht eine TCustomControl Komponente mit einer TGraphicControl Komponente verbinden ?
Dann hätte ich doch die Möglichkeit den Text transparent darzustellen.Pronto451
PS. Gibt es dazu irgendwo ein einfaches Beispiel, wie man so etwas macht ?