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