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(00, ClientWidth, ClientHeight);
end;


Delete - Di 27.09.05 01:24

user profile iconSprint 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 user profile iconKlabautermann: 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 Suche im MSDN 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(0012119);
end;

procedure TMUH_Edit.Paint;
var
Points: array [0..8of 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);
{FCanvas.FillRect(Rect(0,0,Width,Height));
FCanvas.Brush.Color := Bckrnd;
FCanvas.FillRect(Rect(1,1,ClientWidth-1,ClientHeight-1));
FCanvas.Pen.Color := BorderCol;

FCanvas.Pen.Color := BorderCol;
FCanvas.MoveTo(2,0);
FCanvas.LineTo(0,2);
FCanvas.LineTo(0,height-3);
FCanvas.LineTo(2,Height-1);
FCanvas.LineTo(Width-3,height-1);
FCanvas.LineTo(Width-1,Height-3);
FCanvas.LineTo(Width-1,2);
FCanvas.LineTo(Width-3,0);
FCanvas.LineTo(2,0);

FCanvas.Pen.Color := BorderCol2;
FCanvas.MoveTo(2,1);
FCanvas.LineTo(Width-2,1);
FCanvas.MoveTo(1,2);
FCanvas.LineTo(Height-2); }

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

user profile iconLuckie hat folgendes geschrieben:
Wie gibst du ihn denn aus? Mit TextOut? Nimm die API Funktion Suche im MSDN 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)