Autor Beitrag
BigSnake
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 01.06.03 19:31 
Um das zu erreichen hab ich versucht die Original Titelleiste in einem Bitmap zu speichern und über die Titelleiste dann immer drüber zu schreiben.
Das funktionierte auch einwandfrei solange, bis ich dann Menü und Statusleiste hinzugefügt habe. Danach liefert mir GetWindowDC immer die Fehlermeldung "Falsches Fenster Handle"

Hier ist mein Code

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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDeactivate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  bmp:TBitmap;
  cn:TCanvas;
  hnd:HWND;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnDeactivate:=OnDeactivate;
  bmp:=TBitmap.create;
  cn:=TCanvas.create;
  hnd:=GetWindowDC(handle);
  cn.handle:=hnd;
end;

procedure TForm1.FormDeactivate(Sender: TObject);
begin
  cn.draw(0,0,bmp);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bmp.free;
  cn.Free;
  releasedc(handle,hnd);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  cn.draw(0,0,bmp);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  bmp.width:=width;
  bmp.height:=GetSystemMetrics(SM_CYFRAME)*2+GetSystemMetrics(SM_CYCAPTION);
  bmp.Canvas.copyrect(bmp.canvas.cliprect,cn,bmp.canvas.cliprect);
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  form2.show;
  cn.draw(0,0,bmp);
end;

end.


Hat jemand vieleicht eine Lösung für das Problem ?


Moderiert von user profile icontommie-lie: Code- durch Delphi-Tags ersetzt

_________________
Jede Zeile Code ist eine zuviel...
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Do 05.06.03 14:10 
statt
..
hnd:=GetWindowDC(handle);
cn.handle:=hnd;
..

versuch mal

hnd:= self.canvas.handle; // self = form1
cn.handle:=hnd;

_________________
mfg
Tana´Ri
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 05.06.03 14:19 
Über das Canvas-Objekt der Form kann man nur auf den Client-Bereich der Form zugreifen... um in die Titelleiste einer Form malen zu können braucht man aber ein DC-Handle für die gesamte Form und das bekommt man nur mit GetWindowDC.

@BigSnake: ich hab mir eine Form geschrieben bei der man den Farbverlauf der Titelleiste beliebig gestalten kann (zu sehen bei meinem X-Spy). Ich werd diese Form vermutlich irgendwann in nächster Zeit auf www.x-spy.net/personal veröffentlichen...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
BigSnake Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 08.06.03 19:00 
Nachdem ich ein neues Projekt aufgemacht habe und den gleichen Code verwendet habe funktionierte es wider Erwarten. Ehrlich gesagt kann ich mir das nicht wirklich erklären, aber was solls 8)

_________________
Jede Zeile Code ist eine zuviel...