Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Eigenes Eingabefeld von CustomEdit abgeleitet
LH_Freak - Di 27.09.05 00:08
Titel: Eigenes Eingabefeld von CustomEdit abgeleitet
Also, ich schreibe grad wieder meine eigenen GUI Komponenten, und hänge grad
an einem Eingabefeld. Jetzt:
wie kann ich da am besten so ein Eingabefeld wie das bei Ubuntu machen?
Also so ein Viereck mit den abgerundeten Ecken? Da ich ja nicht per Canvas
zeichnen kann, muss ich irgendne Funktion zum Linienzeichnen oder so finden.
Delete - Di 27.09.05 00:42
Was meinst du, wie Windows das macht? Das zeichent in der WndProc eines Edits auch nur auf den Canvas des Parentfensters. Du musst das Edit also Subclassen und es selberzeichnen.
Sprint - Di 27.09.05 01:00
Einfach von TCustomEdit ableiten und deiner neuen Komponente ein TCanvas verpassen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TMyEdit = class(TCustomEdit) private FCanvas: TCanvas; protected procedure WndProc(var Message: TMessage); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| constructor TMyEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); Ctl3D := False; ParentCtl3D := False; FCanvas := TControlCanvas.Create; TControlCanvas(FCanvas).Control := Self; FCanvas.Brush.Style := bsClear; FCanvas.Pen.Color := clRed; FCanvas.Pen.Style := psSolid; end;
destructor TMyEdit.Destroy; begin FCanvas.Free; inherited Destroy; end;
procedure TMyEdit.WndProc(var Message: TMessage); begin inherited WndProc(Message); if Message.Msg = WM_PAINT then FCanvas.Rectangle(0, 0, ClientWidth, ClientHeight); end; |
Delete - Di 27.09.05 01:24
Sprint hat folgendes geschrieben: |
Einfach von TCustomEdit ableiten und deiner neuen Komponente ein TCanvas verpassen. |
Spielverderber. Blöde VCL. :mrgreen:
LH_Freak - Di 27.09.05 15:00
gibt's da sowas ähnliches wie MoveTo und LineTo ???
Delete - Di 27.09.05 15:01
Guck doch einfach mal in der Hilfe nach den Methoden zu TCanvas.
LH_Freak - Di 27.09.05 15:13
sorry, das hab ich übersehen.
LH_Freak - Di 27.09.05 15:38
Irgendwie spinnt Delphi jetzt. Der meckert immer an dieser Zeile:
Delphi-Quelltext
1:
| FCanvas.LineTo(Width-3,height-1); |
Kommt immer die Fehlermeldung:
Quelltext
1:
| [Fehler] MUH_Edit.pas(117): Nicht genügend wirkliche Parameter |
Delete - Di 27.09.05 16:54
Na dann guck in der Hilfe noch mal nach den Parametern.
LH_Freak - Di 27.09.05 16:56
Delphi-Quelltext
1:
| TCanvas.LineTo(x: integer;,y: integer); |
Wenn ich das bei nem Image Zeichne geht's ja auch.
Moderiert von
Klabautermann: Delphi-Tags hinzugefügt.
LH_Freak - Di 27.09.05 23:06
also Zeichnen selber geht jetzt schon. Aber der Text klatscht jetzt oben in der Ecke, wie bringe ich den Schön in die Mitte?
Delete - Mi 28.09.05 00:35
Wie gibst du ihn denn aus? Mit
TextOut? Nimm die API Funktion
DRAWTEXT, damit hast du mehr Formatierungsmöglichkeiten. Als HDC nimmst du das Handle von deinem Canvas.
LH_Freak - Mi 28.09.05 13:29
ich zeig mal den kompletten Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164:
| unit MUH_Edit;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TMUH_Edit = class(TCustomEdit) private BorderCol: TColor; BorderCol2: TColor; Bckrnd: TColor; FCanvas: TCanvas; procedure SetBorderCol(Value:TColor); procedure SetBorderCol2(Value: TColor); procedure SetBckrnd(Value: TColor); procedure Paint; protected procedure WndProc(var Message: TMessage); override; public constructor Create (AOwner: TComponent); override; published property BackgroundColor: TColor read Bckrnd write SetBckrnd; property BorderColor: TColor read BorderCOl write SetBorderCol; property BorderColor_hell: TColor read BorderCol2 write SetBorderCol2;
property Align; property CharCase; property DragCursor; property DragMode; property Enabled; property Font; property HideSelection; property MaxLength; property OEMConvert; property ParentFont; property ParentShowHint; property PasswordChar; property PopupMenu; property ReadOnly; property ShowHint; property TabOrder; property TabStop; property Text; property Visible;
property OnChange; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnStartDrag; {$IFDEF D4CB4} property Anchors; property BiDiMode; property Constraints; property DragKind; property ParentBiDiMode; property OnEndDock; property OnStartDock; {$ENDIF} end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('MUH Messenger', [TMUH_EDIT]); end;
constructor TMUH_Edit.Create (AOwner: TComponent); begin inherited; ParentFont := True; BorderCol := $00849295; BorderCol2 := $00E7EBEF; Bckrnd := clWhite;
FCanvas := TControlCanvas.Create; TControlCanvas(FCanvas).Control := self;
AutoSize := False; Ctl3D := False; BorderStyle := bsNone; ControlStyle := ControlStyle - [csFramed]; SetBounds(0, 0, 121, 19); end;
procedure TMUH_Edit.Paint; var Points: array [0..8] of TPoint; begin FCanvas.Brush.Color := Bckrnd; FCanvas.Rectangle(Rect(0,0,Width,Height)); FCanvas.Brush.Color := BorderCol; FCanvas.FrameRect(Rect(0,0,Width,Height)); FCanvas.Pen.Color := BorderCol2; FCanvas.MoveTo(1,Height-2); FCanvas.LineTo(1,1); FCanvas.LineTo(Width-1,1); FCanvas.TextOut(4,Height div 2 - FCanvas.TextHeight(Text) div 2,Text);
end;
procedure TMUH_Edit.WndProc(var Message: TMessage); begin inherited WndProc(Message); if Message.Msg = WM_PAINT then Paint; end;
procedure TMUH_Edit.SetBorderCol(Value: TCOlor); begin BorderCol := Value; Paint; end;
procedure TMUH_Edit.SetBorderCol2(Value: TCOlor); begin BorderCol2 := Value; Paint; end;
procedure TMUH_Edit.SetBckrnd(Value: TCOlor); begin Bckrnd := Value; Paint; end;
end. |
Delete - Mi 28.09.05 13:33
Luckie hat folgendes geschrieben: |
Wie gibst du ihn denn aus? Mit TextOut? Nimm die API Funktion DRAWTEXT, damit hast du mehr Formatierungsmöglichkeiten. Als HDC nimmst du das Handle von deinem Canvas. |
LH_Freak - Mi 28.09.05 14:47
ja schon. aber der Text steht ja auch da, wenn ich's da lass. Nur eben so oben hingeklatscht
LH_Freak - Mi 28.09.05 17:45
Das liefert mir das selbe ergebnis:
sieht so aus (anhang)
Wie kann ich das Teil von der Selektion und so weiternach unten versetzen?
Delete - Fr 30.09.05 01:09
Hast du auch die Flags DT_VCENTER und DT_SINGLELINE gesetzt? Stimmt das Rect?
hansa - Fr 30.09.05 02:17
Luckie, das da hat so keinen Zweck. Habe vorhin in der DP noch was dazu geschrieben. Der soll sich mal zuerst überlegen, wo eine zusammenhängende Antwort zustande kommt. Das Stückwerk ist allerdings offensichtlich bereits eröffnet. 8)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!