Comment dessiner sur la barre de titre (w95, 98, NT, et 2000)
Télécharger le <a href="http://www.darkskull.net/fichiers/tips/bartitle.zip">programme exemple</a> (4.54 ko)
Il est parfois judicieux de placer un petit dessin dans la barre de titre pour personnaliser son application, voire réaliser une animation dans la barre de titre, ou même tout simplement centrer le texte dans la barre de titre.
<center>

</center>
Pour dessiner dans la barre de titre, il faut d'abord obtenir un DC sur la fenêtre à l'aide de GetWindowDC, puis obtenir les dimensions de la barre de titre à l'aide de GetSystemMetrics, puis dessiner dans un Bitmap et enfin afficher ce bitmap sur la barre de titre à l'aide de BitBlt :
Dessiner sur la barre de titres
var
Bitmap: TBitmap;
Offset: integer;
XC: integer; //coin en haut et à gauche
YC: integer; //de la zone de titre perso
procedure TForm1.FormCreate(Sender: TObject);
begin
YC := GetSystemMetrics(SM_CYSIZEFRAME);
XC := 2 * GetSystemMetrics(SM_CXSIZEFRAME) + GetSystemMetrics(SM_CXSMICON);
Offset := 0;
Bitmap := TBitmap.Create;
Bitmap.Canvas.Font.Handle := GetStockObject(SYSTEM_FONT);
Bitmap.Canvas.Font.Color := clCaptionText;
FormResize(Sender);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
// définition des dimensions du bitmap
Bitmap.Height := GetSystemMetrics(SM_CYCAPTION) - 1;
Bitmap.Width := Round(Width
- 3 * GetSystemMetrics(SM_CXSMSIZE)
- 3.5 * GetSystemMetrics(SM_CXSMSIZE));
end;
procedure TForm1.ScrollTitre;
var
dc: HDC;
r: Trect;
begin
// Le scrolling proprement dit
// Acquisition du DC 'non client'
dc := GetWindowDC(Handle);
//remplissage du bitmap avec la couleur de fond
r.Top := 0;
r.Left := 0;
r.Bottom := Bitmap.Height;
r.Right := Bitmap.Width;
Bitmap.Canvas.Brush.Color := clActiveColor;
Bitmap.FillRect(r);
//écriture du titre dans la bitmap
Bitmap.Canvas.Brush.Style := bsClear;
Bitmap.Canvas.TextOut(Bitmap.Width - Offset, 0, Titre);
// copie de la bitmap dans la fenêtre
BitBlt(dc, XC, YC, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
ReleaseDC(Handle, dc);
Offset := Offset + 1;
if (Offset > Bitmap.Width + Bitmap.Canvas.TextWidth(Titre)) then Offset := 0;
end;
Cependant, à partir de Windows 98, les fenêtres possèdent un dégradé qu'il faut recréér manuellement dans le Bitmap. Pour cela, il faut déjà obtenir les couleurs du dégradé dans la base de registre, puis dessiner le dégradé au lieu du remplissage standard FillRect :
Dégradé
uses
Registry;
var
// Variables pour le dégradé
r1, g1, b1: byte;
r2, g2, b2: byte;
dr, dg, db: integer;
procedure TForm1.GetColor(Active: boolean);
var
s, t: string;
Reg: TRegistry;
begin
s := 'ActiveTitle';
if not Active then s := 'In' + s;
Reg := TRegistry.Create;
try
Reg.OpenKey('\Control Panel\Colors', true);
if Reg.ValueExists(s) then t := Reg.ReadString(s)
else exit;
r1 := StrToInt(Trim(Copy(t, 1, Pos(' ', t))));
Delete(t, 1, Pos(' ', t));
g1 := StrToInt(Trim(Copy(t, 1, Pos(' ', t))));
Delete(t, 1, Pos(' ', t));
b1 := StrToInt(Trim(t));
finally
Reg.Free;
end;
end;
procedure TForm1.GetGradientColor(Active: boolean);
var
s, t: string;
Reg: TRegistry;
begin
s := 'GradientActiveTitle';
if not Active then Insert('In', s, 9);
Reg := TRegistry.Create;
try
Reg.OpenKey('\Control Panel\Colors', true);
if Reg.ValueExists(s) then t := Reg.ReadString(s)
else exit;
r2 := StrToInt(Trim(Copy(t, 1, Pos(' ', t))));
Delete(t, 1, Pos(' ', t));
g2 := StrToInt(Trim(Copy(t, 1, Pos(' ', t))));
Delete(t, 1, Pos(' ', t));
b2 := StrToInt(Trim(t));
finally
Reg.Free;
end;
end;
procedure TForm1.DrawGradient(Rect: TRect);
var
len: integer;
a: extended;
r, g, b: integer;
i: integer;
begin
len := Rect.Right - Rect.Left;
for i := Rect.Left to Rect.Right do
begin
a := (i - Rect.Left) / len;
r := r1 + Round(a * dr);
g := g1 + Round(a * dg);
b := b1 + Round(a * db);
Bitmap.Canvas.Pen.Color := rgb(r, g, b);
Bitmap.Canvas.MoveTo(i, Rect.Top);
Bitmap.Canvas.LineTo(i, Rect.Bottom);
end;
end;
3 requête(s) SQL executée(s) en 0.001 Secs - Temps total de génération de la page : 0.007 Secs
