![]() |
TEdit mit Rahmen
Wie kann ich ein TEdit mit Rand machen, der angezeigt wird, sobald ich reinklicke, und wieder verschwindet, wenn ich ein anderes Control aktiviere, z.B. auf nen Button klicke? Ich meine von der Idee wie dieses Suchfeld links oben im
![]() Geht das mit Delphi (gut)? Habe sowohl 7 als auch 2007. Danke schonmal! |
Re: TEdit mit Rand
Theming-Komponenten wie z.B. das ElPack wären ein Möglichkeit welche die Anwendung unabhängig vom eingestellten Windows-Themen darstellen lassen können.
|
Re: TEdit mit Rand
Oder Du benutzt eine Fremdkomponente.
Gehst Du nach ![]() |
Re: TEdit mit Rand
@Bernhard Geyer: Mit diesen Theming-Packs habe ich schlechte Erfahrungen gemacht, die treiben meistens die Größe der EXEs und der Sourcen enorm in die Höhe. Ich hab sie auch mal ne Weile verwendet, dann aber wieder weggelasssen, weil sie so Resourcenfressend sind (--> Performance).
Aber bei Torry guck ich mal. Danke! [EDIT] Gab nix passendes [/EDIT] Aber geht das auch mit Delphi-internen Mittel? |
Re: TEdit mit Rand
Zitat:
WM_NCPAINT, WM_NCCALCSIZE, OnEnter, OnExit behandeln. |
Re: TEdit mit Rand
so, hab's jetzt mal probiert. allerdings funzt das mit dem OnEnter / OnExit noch nicht. Könntet ihr mir da helfen, was ich da machen muss?
Habe bisher einfach nur einen 1px roten Rahmen zeichnen lassen. So sieht die Unit aus:
Delphi-Quellcode:
unit SEdit;
interface uses Windows, SysUtils, Classes, Controls, StdCtrls, Messages, graphics; type TSEdit = class(TEdit) private procedure WMNCCalcSize(var Msg: TWMNCCALCSIZE); message WM_NCCALCSIZE; procedure WMNCPAINT(var Msg: TWMNCPaint); message WM_NCPaint; procedure unmark; protected { Protected-Deklarationen } public procedure RePaint; override; published procedure DoEnter; procedure DoExit; { Published-Deklarationen } end; procedure Register; var h: TWMNCPAINT; dc: hDc; Pen: hPen; OldPen: hPen; OldBrush: hBrush; sel: boolean=true; implementation procedure Register; begin RegisterComponents('Zusätzlich', [TSEdit]); end; procedure TSEdit.RePaint; begin WMNCPAINT(h); end; procedure TSedit.WMNCCalcSize(var Msg: TWMNCCalcSize); begin exit; end; procedure TSEdit.WMNCPAINT(var Msg: TWMNCPAINT); begin inherited; if not sel then unmark; dc := GetWindowDC(Handle); Msg.Result := 1; //Change the RGB value to change the color Pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); OldPen := SelectObject(dc, Pen); OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH)); Rectangle(dc, 0, 0, Width, Height); SelectObject(dc, OldBrush); SelectObject(dc, OldPen); DeleteObject(Pen); ReleaseDC(Handle, Handle); end; procedure TSEdit.DoEnter; begin sel := true; end; procedure TSEdit.DoExit; begin sel := false; end; procedure TSEdit.unmark; begin inherited; dc := GetWindowDC(Handle); //Change the RGB value to change the color Pen := CreatePen(PS_SOLID, 1, color); OldPen := SelectObject(dc, Pen); OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH)); Rectangle(dc, 0, 0, Width, Height); SelectObject(dc, OldBrush); SelectObject(dc, OldPen); DeleteObject(Pen); ReleaseDC(Handle, Handle); end; end. |
Re: TEdit mit Rahmen
Hallo, hier mal eine kleine Weiterentwicklung.
PS: Ist nur mal ein Anfang und ist noch nicht perfekt!
Delphi-Quellcode:
unit SEdit;
interface uses Windows, SysUtils, Classes, Controls, StdCtrls, Messages, Graphics; type TSEdit = class(TEdit) private Fh: TWMNCPAINT; Fdc: hDc; FPen: hPen; FOldPen: hPen; FOldBrush: hBrush; FSelected: boolean; procedure WMNCCalcSize(var Msg: TWMNCCALCSIZE); message WM_NCCALCSIZE; procedure WMNCPAINT(var Msg: TWMNCPaint); message WM_NCPAINT; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS; procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS; procedure RedrawBorder; protected { Protected-Deklarationen } public procedure RePaint; override; constructor Create(AOwner: TComponent); override; published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Additional', [TSEdit]); end; constructor TSedit.Create(AOwner: TComponent); begin inherited; ParentFont := True; FSelected := False; end; procedure TSEdit.RePaint; begin WMNCPAINT(Fh); end; procedure TSedit.WMNCCalcSize(var Msg: TWMNCCalcSize); begin inherited; InflateRect(Msg.CalcSize_Params^.rgrc[0], -1, -1); end; procedure TSEdit.WMNCPAINT(var Msg: TWMNCPAINT); begin inherited; RedrawBorder; end; procedure TSedit.WMSetFocus(var Message: TWMSetFocus); var Msg: TWMNCPAINT; begin inherited; if not (csDesigning in ComponentState) then begin FSelected := True; RedrawBorder; end; end; procedure TSedit.WMKillFocus(var Message: TWMKillFocus); begin inherited; if not (csDesigning in ComponentState) then begin FSelected := False; RedrawBorder; end; end; procedure TSedit.CMMouseEnter(var Message: TMessage); begin inherited; if (GetActiveWindow <> 0) then begin RedrawBorder(); end; end; procedure TSedit.CMMouseLeave(var Message: TMessage); begin inherited; RedrawBorder(); end; procedure TSEdit.RedrawBorder; begin inherited; if FSelected then begin Fdc := GetWindowDC(Handle); //Change the RGB value to change the color FPen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); FOldPen := SelectObject(Fdc, FPen); FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH)); Rectangle(Fdc, 0, 0, Width, Height); SelectObject(Fdc, FOldBrush); SelectObject(Fdc, FOldPen); DeleteObject(FPen); ReleaseDC(Handle, Handle); end else begin Fdc := GetWindowDC(Handle); //Change the RGB value to change the color FPen := CreatePen(PS_SOLID, 1, color); FOldPen := SelectObject(Fdc, FPen); FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH)); Rectangle(Fdc, 0, 0, Width, Height); SelectObject(Fdc, FOldBrush); SelectObject(Fdc, FOldPen); DeleteObject(FPen); ReleaseDC(Handle, Handle); end; end; end. |
Re: TEdit mit Rahmen
Liste der Anhänge anzeigen (Anzahl: 2)
um das ganze gleich wieder weiterzuentwickeln:
die farben können jetzt im objektinspektor eingestellt werden, ausserdem werden jetzt abgerundete rechtecke verwendet. ich hängs's auch gleich mal dran. was mich im moment noch stört, ist wie das ganze zur entwicklungszeit auf dem formular aussieht (beispiel siehe anhang)
Delphi-Quellcode:
unit SEdit;
interface uses Windows, SysUtils, Classes, Controls, StdCtrls, Messages, Graphics; type TSEdit = class(TEdit) private Fh: TWMNCPAINT; Fdc: hDc; FPen: hPen; FOldPen: hPen; FOldBrush: hBrush; FSelected: boolean; rcolorfocused, rcolornotfocused: tcolor; procedure WMNCCalcSize(var Msg: TWMNCCALCSIZE); message WM_NCCALCSIZE; procedure WMNCPAINT(var Msg: TWMNCPaint); message WM_NCPAINT; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS; procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS; procedure RedrawBorder; protected { Protected-Deklarationen } public procedure RePaint; override; constructor Create(AOwner: TComponent); override; published property ColorFocused: TColor read rColorFocused write rcolorFocused; property ColorNotFocused: TColor read rcolornotfocused write rColorNotFocused; end; procedure Register; implementation procedure Register; begin RegisterComponents('Zusätzlich', [TSEdit]); end; constructor TSedit.Create(AOwner: TComponent); begin inherited; ParentFont := True; FSelected := False; end; procedure TSEdit.RePaint; begin WMNCPAINT(Fh); end; procedure TSedit.WMNCCalcSize(var Msg: TWMNCCalcSize); begin inherited; InflateRect(Msg.CalcSize_Params^.rgrc[0], -1, -1); end; procedure TSEdit.WMNCPAINT(var Msg: TWMNCPAINT); begin inherited; RedrawBorder; end; procedure TSedit.WMSetFocus(var Message: TWMSetFocus); begin inherited; if not (csDesigning in ComponentState) then begin FSelected := True; RedrawBorder; end; end; procedure TSedit.WMKillFocus(var Message: TWMKillFocus); begin inherited; if not (csDesigning in ComponentState) then begin FSelected := False; RedrawBorder; end; end; procedure TSedit.CMMouseEnter(var Message: TMessage); begin inherited; if (GetActiveWindow <> 0) then begin RedrawBorder(); end; end; procedure TSedit.CMMouseLeave(var Message: TMessage); begin inherited; RedrawBorder(); end; procedure TSEdit.RedrawBorder; begin inherited; if FSelected then begin Fdc := GetWindowDC(Handle); //Change the RGB value to change the color FPen := CreatePen(PS_SOLID, 1, rColorFocused); FOldPen := SelectObject(Fdc, FPen); FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH)); RoundRect(Fdc, 0, 0, Width, Height, 3, 3); SelectObject(Fdc, FOldBrush); SelectObject(Fdc, FOldPen); DeleteObject(FPen); ReleaseDC(Handle, Handle); end else begin Fdc := GetWindowDC(Handle); //Change the RGB value to change the color FPen := CreatePen(PS_SOLID, 1, rColorNotFocused); FOldPen := SelectObject(Fdc, FPen); FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH)); RoundRect(Fdc, 0, 0, Width, Height, 3, 3); SelectObject(Fdc, FOldBrush); SelectObject(Fdc, FOldPen); DeleteObject(FPen); ReleaseDC(Handle, Handle); end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz