Содержание материала

Прочие функции

 

Сделаем это на примере. Давайте озадачимся возможностью таскать мышкой по всей форме круг, созданный в предыдущем примере. Что нам нужно. Во-первых, запоминать, где началось перетаскивание (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) в эту фигуру, двигать её, и многое ещё другое. Для полноты картины нам осталось только научиться сохранять регионы на диск и считывать обратно.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить