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