Entwickler-Ecke

Sonstiges (Delphi) - Caption einer Form


Cash - Mo 17.03.03 19:23
Titel: Caption einer Form
Hi@all

Ich möchte gern meiner Form eine bestimmte Caption geben, "Titel"
Dieser Titel soll genau in der Mitte der Formleiste angezeigt werden und nicht links. Kennt einer den dafür benötigten Code?

thx4all


Delete - Mo 17.03.03 19:31


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:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure WMACTIVATE(var Msg: TMessage); Message WM_ACTIVATE;
//    procedure WMNCHITTEST(var Msg: TWMNChittest); Message WM_NCHITTEST;
//    procedure WMNCLBUTTONDOWN(var Msg: TMessage); Message WM_NCLBUTTONDOWN;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

var
  bHit: Boolean;

//procedure TForm1.WMNCHITTEST(var Msg: TWMNChittest);
//var
//  x,y: SmallInt;
//  dc: HDC;
//  rect: TRect;
//begin
//  DefaultHandler(Msg);
//  x := Msg.XPos-Left;
//  y := Msg.YPos-Top;
//  GetWindowRect(Handle, rect);
//  if (x <= width) and (x >= width-21)
//    and (y >= 0) and
//    (y <= GetSystemmetrics(SM_CYEDGE)+14) then
//  begin
//    bHit := TRUE;
//  end
//  else
//    bHit := FALSE;
//end;
//
//procedure TForm1.WMNCLBUTTONDOWN(var Msg: TMessage);
//begin
//  if bHit = TRUE then Close
//  else
//    inherited;
//end;

procedure TForm1.WMACTIVATE(var Msg: TMessage);
var
  rgn: HRGN;
  rect, btnrect: TRect;
  dc: HDC;
  szBuffer: array[0..255] of Char;
  bmp: TBITMAP;
  brush : HBRUSH;
begin
  if Msg.Msg = WM_ACTIVATE then
  begin
    dc := GetWindowDC(Handle);
    rect.Left := GetSystemmetrics(SM_CXEDGE);
    rect.Top := GetSystemmetrics(SM_CYEDGE);
    rect.Right := Form1.Width-GetSystemmetrics(SM_CYEDGE);
    rect.Bottom := Getsystemmetrics(SM_CYCAPTION)+GetSystemmetrics(SM_CYFRAME);
    try
//      bmp := TBITMAP.Create;
//      bmp.loadfromfile('.\MyButton.bmp');
//      btnrect.Left := Width-21;
//      btnrect.Top := rect.Top+1;
//      brush := CreateSolidBrush(RGB(255,0,0));
//      SelectObject(dc, brush);
//      Rectangle(dc, rect.Left, rect.Top, rect.Right, rect.Bottom);
//      StretchBlt(dc, btnrect.Left, btnrect.Top+2, bmp.Width, bmp.Height,
//        bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, SRCCOPY);
      lstrcpy(szBuffer, 'Meine Fenstercaption');
      SetBkMode(dc, TRANSPARENT);
      SetTextColor(dc, RGB(255,255,255));
      DrawText(dc, szBuffer, lstrlen(szBuffer), rect, DT_CENTER or DT_VCENTER);
    finally
//      bmp.Free;
    end;
      ReleaseDC(Handle, dc);
  end
  else
    Inherited;
  ReleaseDc(Handle, dc);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PostMessage(Handle, WM_ACTIVATE, 0, 0);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  SendMessage(handle, WM_ACTIVATE, 0 , 0);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  SendMessage(handle, WM_ACTIVATE, 0 , 0);
end;

Das, was du nicht brauchst, habe ich auskommentiert.


Cash - Mo 17.03.03 19:50

[Error] Unit1.pas(65): Statement expected but 'PROCEDURE' found

das zeigt mir Delphi an wenn ich es laufen lassen möchte. Markiert wird die Zeile bzw. die Procedure...

Quelltext
1:
procedure TFrmWillkommen.WMACTIVATE(var Msg: TMessage);                    


Wieso?

Des WEiteren mekert er mir folgendes an (rot markiert):


Quelltext
1:
2:
3:
4:
5:
procedure 
FrmWillkommen.FormCreate(Sender: TObject);
begin
  PostMessage([color=red]handle[/color], WM_ACTIVATE, 0, 0);
end;


Und folgende Fehlermeldung:

[Error] mWillkommen.pas(107): Undeclared identifier: 'handle'

Hoffe einer weiß was damit anzufangen :)


Cash - Di 18.03.03 16:45

GEHT ES DENN NICHT EINFACHER? DAS IST DOCH VIEL ZU VIEL CODE........es muss doch einfacher gehen....


Delete - Di 18.03.03 16:51

Was ist daran viel Code:

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:
type 
  TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure FormPaint(Sender: TObject); 
    procedure FormResize(Sender: TObject); 
  private 
    { Private-Deklarationen } 
    procedure WMACTIVATE(var Msg: TMessage); Message WM_ACTIVATE; 
  public 
    { Public-Deklarationen } 
  end; 

var 
  Form1: TForm1; 

implementation 

{$R *.DFM} 

procedure TForm1.WMACTIVATE(var Msg: TMessage); 
var 
  rgn: HRGN; 
  rect, btnrect: TRect; 
  dc: HDC; 
  szBuffer: array[0..255] of Char; 
begin 
  if Msg.Msg = WM_ACTIVATE then 
  begin 
    dc := GetWindowDC(Handle); 
    rect.Left := GetSystemmetrics(SM_CXEDGE); 
    rect.Top := GetSystemmetrics(SM_CYEDGE); 
    rect.Right := Form1.Width-GetSystemmetrics(SM_CYEDGE); 
    rect.Bottom := Getsystemmetrics(SM_CYCAPTION)+GetSystemmetrics(SM_CYFRAME); 
    lstrcpy(szBuffer, 'Meine Fenstercaption'); 
    SetBkMode(dc, TRANSPARENT); 
    SetTextColor(dc, RGB(255,255,255)); 
    DrawText(dc, szBuffer, lstrlen(szBuffer), rect, DT_CENTER or DT_VCENTER); 
    ReleaseDC(Handle, dc); 
  end 
  else 
    Inherited; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  PostMessage(Handle, WM_ACTIVATE, 0, 0); 
end; 

procedure TForm1.FormPaint(Sender: TObject); 
begin 
  SendMessage(handle, WM_ACTIVATE, 0 , 0); 
end; 

procedure TForm1.FormResize(Sender: TObject); 
begin 
  SendMessage(handle, WM_ACTIVATE, 0 , 0); 
end;

Du mußt es eben selber zeichnen und das geht heben nur so. Wenn dir das zu viel Code ist, dann laß es bleiben. Extravaganz hat eben seinen Preis.