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.005 Secs