Autor Beitrag
LH_Freak
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: Di 27.09.05 00:08 
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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Di 27.09.05 01:00 
Einfach von TCustomEdit ableiten und deiner neuen Komponente ein TCanvas verpassen.
ausblenden 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;

ausblenden 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;

_________________
Ciao, Sprint.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: Di 27.09.05 15:00 
gibt's da sowas ähnliches wie MoveTo und LineTo ???
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 27.09.05 15:01 
Guck doch einfach mal in der Hilfe nach den Methoden zu TCanvas.
LH_Freak Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: Di 27.09.05 15:13 
sorry, das hab ich übersehen.
LH_Freak Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: Di 27.09.05 15:38 
Irgendwie spinnt Delphi jetzt. Der meckert immer an dieser Zeile:

ausblenden Delphi-Quelltext
1:
FCanvas.LineTo(Width-3,height-1);					


Kommt immer die Fehlermeldung:

ausblenden Quelltext
1:
[Fehler] MUH_Edit.pas(117): Nicht genügend wirkliche Parameter					
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 27.09.05 16:54 
Na dann guck in der Hilfe noch mal nach den Parametern.
LH_Freak Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: Di 27.09.05 16:56 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: 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?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: Mi 28.09.05 13:29 
ich zeig mal den kompletten Quelltext:

ausblenden volle Höhe 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 385

Win XP
D7 PE, D2k5 Trial
BeitragVerfasst: 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?
Einloggen, um Attachments anzusehen!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 30.09.05 01:09 
Hast du auch die Flags DT_VCENTER und DT_SINGLELINE gesetzt? Stimmt das Rect?
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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)

_________________
Gruß
Hansa