TEdit mit neuem Layout
-
Hallo
ich möchte eine neue TEdit-Komponente programmieren, die ein etwas anderen Rahmen besitzt. Hat jemand eine Ahnung, wie ich da vorgehen könnte ?
Wenn ich von TEdit oder TCustomEdit ableite und mir eine neue Canvas mache, wird trotzdem immer der alte Rahmen gezeichnent ?!?!? bzw. es gibt ne Fehlermeldung.
Kennt jemand solch eine Komponente (möglichst in C) um mal zu sehen wie man so etwas realisieren kann ?
Pronto
PS. Auch eine TComboBox mit neuen Layout will ich noch machen, auch dazu bräuchte ich etwas Hilfe bei der Realisierung .... DANKE
-
Ich habe mal eine neue TEdit programmiert, gucke das, wenn ich zu hause bin, mal an und sende dann.
-
-
ich wäre daran auch sehr interessiert!
wäre evtl. nicht schlecht wenn du den code hier posten könntest, ansonsten melde dich einfach nochmal.ciao, cypoc
-
Hier ist grob beschrieben, wie ich das gemacht habe.
Das ist ein Abschnit aus meinem Code.
das ganze wird über winapi gemacht. wenn die komp neu gezeichnet werden soll, schickt windows eine botschaft WM_PAINT an die komp. diese nachricht wird empfangen BEGIN__MESSAGE_MAP... und verarbeitet WMNCPaintclass PACKAGE TGEdit : public TCustomMaskEdit { private: ... protected: HIDESBASE MESSAGE void _fastcall WMNCPaint (Messages::TMessage &Message); HIDESBASE MESSAGE void _fastcall RedrawBorder (const HRGN Clip); public: __fastcall TGEdit(TComponent* Owner); BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_PAINT, TMessage, WMNCPaint); END_MESSAGE_MAP(TCustomMaskEdit) }; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void _fastcall TGEdit::WMNCPaint (Messages::TMessage &Message) { TCustomMaskEdit::Dispatch((void*)&Message); RedrawBorder(HRGN(Message.WParam)); } //--------------------------------------------------------------------------- void _fastcall TGEdit::RedrawBorder (const HRGN Clip) { HDC DC; TRect R; HBRUSH BorderBrush, ColorBrush, HoverBrush; DC = GetWindowDC(Handle); try { GetWindowRect(Handle, &R); OffsetRect(&R, -R.Left, -R.Top); BorderBrush = CreateSolidBrush(ColorToRGB(FColorBorder)); ColorBrush = CreateSolidBrush(ColorToRGB(Color)); if (!ComponentState.Contains(csDesigning) && (Focused() || (FMouseInControl)))// && //(dynamic_cast <TGEdit*> (Screen->ActiveControl)==NULL)))) { // Focus HoverBrush = CreateSolidBrush(ColorToRGB(FColorHover)); if (Flat) { FrameRect(DC, &R, HoverBrush); InflateRect(&R, -1, -1); } FrameRect(DC, &R, ColorBrush); DeleteObject(HoverBrush); } else { // no Focus FrameRect(DC, &R, BorderBrush); InflateRect(&R, -1, -1); FrameRect(DC, &R, ColorBrush); } if (!Flat && (Focused() || FMouseInControl)) { TColor clColor = Color;//Color; double h, s, l; RGBtoHSLRange(clColor,h,s,l); if (l>15) l -= 15; else l = 0; clColor = HSLRangetoRGB(h, s, l); HPEN highPen = CreatePen(PS_SOLID, 1, ColorToRGB(clColor)); HPEN backPen = CreatePen(PS_SOLID, 1, ColorToRGB(clBlack/*Color*/)); clColor = ((TForm*)Parent)->Color; RGBtoHSLRange(clColor,h,s,l); if (l>70) l -= 70; else l = 0; clColor = HSLRangetoRGB(h, s, l); HPEN shadPen = CreatePen(PS_SOLID, 1, ColorToRGB(clColor)); TPoint lpPoint; SelectObject(DC, highPen); MoveToEx(DC, 0, Height-1, &lpPoint); LineTo(DC, Width-1, Height-1); LineTo(DC, Width-1, 0); /**/ // Paint edit (HighLight) SelectObject(DC, shadPen); MoveToEx(DC, Width-2, 0, &lpPoint); LineTo(DC, 0, 0); LineTo(DC, 0, Height-1); SelectObject(DC, backPen); MoveToEx(DC, 1, Height-2, &lpPoint); LineTo(DC, 1, 1); LineTo(DC, Width-2, 1); DeleteObject(highPen); DeleteObject(shadPen); } }__finally {ReleaseDC(Handle, DC);} DeleteObject(ColorBrush); DeleteObject(BorderBrush); }
Wenn du noch Fragen hast, melde dich einfach bei mir.
Ich hoffe, ich konnte dir helfen.
cu
Xqgene
-
im code sind ein paar unbekannte variablen und funktionen. ich habe die komponente zwar zum laufen gebracht, doch ich weiß nicht so recht, was die verschiedenen "color-variablen" bedeuten. die sache mit "Flat" und "FMouseInControl" verstehe ich auch nicht ganz.
aber auf jeden fall erst mal dankeschön!
ciao, cypoc