Rysunek na belce

michaell

Witam! Jest to mój pierwszy artykuł dlatego bardzo proszę o delikatne ocenianie :). Przejde do sedna sprawy, otóż przydatną rzeczą w trakcie tworzenia programów nastawionych na wygląd jest możliwość rysowania po "belce" tytułowej. Postaram się teraz w miarę prosto przedstawić jak to zrobić .

1.) Napiszmy więc procedurę, która bedzie wstawiała w wiadomym miejscu jakąś grafikę. Piszemy:

procedure TMainForm.Maluj;
begin

end;

2.) Potrzebne nam będą zmienne typu TCanvas oraz TBitmap</code>. Typ <code>TCanvas przechwici nam obiekt paska tytułu formy i delikatnie mówiąc bedzie odwalał cała robotę. Typ TBitmap wstawiamy tylko dlatego, że potrzebujemy załadować bitmapę z pliku.

3.)Zajmijmy się teraz kodem właściwym procedury. Jak już powiedziałem należy przechwycić "belkę", oczywiście najpierw trzeba załadować bitmape do TBitmap:

ACanvas := TCanvas.Create;
  try
    ACanvas.Handle := GetWindowDC(MainForm.Handle);

Teraz gdy mamy już uchwyt możemy przystąpić do rysowania:

with ACanvas do
    begin
      Brush.Style := bsClear;
      Font.Name := 'Tahoma';
      Font.Size := 8;
      Font.Color := clWhite;
      Font.Style := [fsBold];
      Draw(0,0,Img);
      TextOut(GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CXBORDER)+15,
        Round((GetSystemMetrics(SM_CYCAPTION) - Abs(Font.Height)) / 2-3) + 5, 'Bardzo ładny tytuł :)');
    end;

Funkcje GetSystemMetrics() służą w tym wypadku do ustalenia współrzednych elementów paska tytułu.
Mamy już gotową procedurę, którą wywołujemy przy zdarzeniu OnPaint formatki.

Mam nadzieję, że wszystko jest jasne i zrozumiałe. Cały program znajduje się poniżej.

unit Unit1;

interface

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

type
  TFormatka = class(TForm)
private
   procedure Maluj;
  public
    { Public declarations }
  end;

var
  Formatka: TFormatka;

implementation

{$R *.dfm}

procedure TFormatka.Maluj;
var
  ACanvas: TCanvas;
  Img : TBitmap;
begin
Img := TBitmap.Create;
Img.LoadFromFile('Skiny/Test/Bar.bmp');
  inherited;
  ACanvas := TCanvas.Create;
  try
    ACanvas.Handle := GetWindowDC(MainForm.Handle);
    with ACanvas do
    begin
      Brush.Style := bsClear;
      Font.Name := 'Tahoma';
      Font.Size := 8;
      Font.Color := clWhite;
      Font.Style := [fsBold];
      Draw(0,0,Img);
      TextOut(GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CXBORDER)+15,
        Round((GetSystemMetrics(SM_CYCAPTION) - Abs(Font.Height)) / 2-3) + 5, 'Bardzo ładny tytuł :)');
    end;
  finally
    ReleaseDC(MainForm.Handle, ACanvas.Handle);
    ACanvas.Free;
  end;
end;

procedure TFormatka.FormPaint(Sender: TObject);
begin
Formatka.Maluj;
end;

end.

3 komentarzy

Zmienne ACanvas i Img powinny być zmiennymi globalnymi, a tworzenie canvasa i bitmapy oraz ładowanie obrazka do zmiennej Img powinno znajdować się oddzielnej procedurze, najlepiej w zdarzeniu OnCreate formy. Ładowanie obrazka przy każdym zdarzeniu OnPaint formy jest chyba troszkę nieekonomiczne. Poza tym OK.

Fajny artykuł.. ja tam ide na łatwiznę i korzystam z TJvTransparentForm, który robi to automatycznie.. od razu wywala krawędzie.. - Polecam

"Funkcje GetSystemMetri[b]x/b służą w tym wypadku do ustalenia" =GetSystemMetri[b]cs/b ;)
Za dużo Matrix'a :P