Прочие функции
Сделаем это на примере. Давайте озадачимся возможностью таскать мышкой по всей форме круг, созданный в предыдущем примере. Что нам нужно. Во-первых, запоминать, где началось перетаскивание (fStartX, fStartY). Во-вторых, флаг (fDragging), указывающий, что юзер действительно перетскивает наш регион, а не просто гоняет с экрана мух. В третьих, надо узнать, ткнул ли он на регион, а не мимо (PtInRegion). В четвёртых, надо двигать регион по мере того, как он двигает мышь (OffsetRgn). Вот, пожалуй, и всё. На этот раз текст модуля приведу полностью. Единственное что там стоит упомянуть - это свойство DoubleBuffered. Оно выставлено в TRUE, т.к. иначе появляется мерцание. Итак.
Code: |
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private declarations } fDragging: boolean; fRgn: hRGN; fStartX, fStartY: integer; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin fRgn := CreateEllipticRgn (10, 10, 200, 200); fDragging := FALSE; DoubleBuffered := TRUE; end;
procedure TForm1.FormDestroy(Sender: TObject); begin DeleteObject (fRgn); end;
procedure TForm1.FormPaint(Sender: TObject); var bmp: TBitmap; begin bmp := TBitmap.Create; try bmp.LoadFromFile ('C:\WINDOWS\Aieoaua e?o?aaa 16.bmp'); Canvas.Brush.Bitmap := bmp; PaintRgn (Canvas.Handle, fRgn); Canvas.Brush.Color := clBlack; FrameRgn (Canvas.Handle, fRgn, Canvas.Brush.Handle, 2, 2); finally Canvas.Brush.Bitmap := nil; bmp.Free; end; end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button = mbLeft) and (PtInRegion (fRgn, X, Y)) then begin fDragging := TRUE; fStartX := X; fStartY := Y; end; end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if (ssLeft in Shift) and fDragging then begin OffsetRgn (fRgn, X - fStartX, Y - fStartY); fStartX := X; fStartY := Y; Refresh; end; end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin fDragging := FALSE; end;
end. |
Как видим, абсолютно ничего сложного в работе с регионами нет. А вот возможности они дают довольно интересные. Фигуру любой формы можно раскрасить как угодно (в т.ч. и битмапом), вывести на экран, определить, входит ли точка (X,Y) в эту фигуру, двигать её, и многое ещё другое. Для полноты картины нам осталось только научиться сохранять регионы на диск и считывать обратно.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!