Programowanie w języku Delphi » Gotowce

Rysunek na belce

  • 2006-01-18 22:56
  • 3 komentarze
  • 695 odsłon
  • Oceń ten tekst jako pierwszy
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
. Typ
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 komentarze

KrisX 2005-08-01 12:24

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.

Deti 2005-01-15 18:06

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

LukaStrz 2005-01-13 14:51

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