Delphi

Xakep, номер #049, стр. 049-084-2


private

{ Private declarations }

Dragging : Boolean;

OldLeft, OldTop: Integer;

Если переменная Dragging равна true, то пользователь щелкнул в окне и перетаскивает его. В переменных OldLeft и OldTop будут сохраняться первоначальные координаты окна. На всякий случай, по событию OnCreate можно засовывать в переменную Dragging значение false, чтобы случайно при старте в нее не попало true и не началось перетаскивание.

Теперь создаем обработчик события OnMouseDown для главной формы и пишем в нем следующее:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if button=mbLeft then

begin

Dragging := True;

OldLeft := X;

OldTop := Y;

end;

end;

Здесь происходит проверка, если кликнули левой кнопкой, то установить переменную Dragging в true и запомнить координаты, в которых произошел щелчок.

Теперь создавай обработчик события OnMouseMove и пиши в нем следующее:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

if Dragging then

begin

Left := Left+X-OldLeft;

Top := Top+Y-OldTop;

end;

end;

Здесь мы проверяем, если переменная Dragging равна true, то пользователь тащит окно, и мы должны изменить его координаты.

В обработчике события OnMouseUp нужно написать только одну строчку:

Dragging := False;

Раз кнопка отпущена, мы должны изменить переменную Dragging на false и закончить перетаскивание.

Disconnect

Посмотри на рисунок 2, и ты увидишь мою программу в запущенном виде. Я специально расположил окно поверх окна с кодом программы, чтобы ты оценил его нестандартный вид. Никакой квадратности, никаких оборочек, окно имеет вид Тринити с компьютером из фильма "Матрица".

Обрати внимание на рисунок 3. Здесь поверх нашего окна я поместил компонент календаря (рисунок слева). Справа показано окно в запущенном виде, в котором календарь обрезался вместе с окном. Учитывай это, когда размещаешь что-либо на окне.

Как всегда, исходники примера можно найти на моем сайте http://www.cydsoft.com/vr-online/ через несколько дней после выхода этого номера в свет.

У меня к тебе просьба. Не пиши мне большие письма. Я бы с удовольствием помог всем желающим, но это невозможно – вопросов слишком много. Поэтому лучше разбей свой вопрос на несколько маленьких и спрашивай постепенно, а не все сразу.

Листинг функции CreateRgnFromBitmap

function CreateRgnFromBitmap(rgnBitmap: TBitmap): HRGN;

var

TransColor: TColor;

i, j: Integer;

i_width, i_height: Integer;

i_left, i_right: Integer;

rectRgn: HRGN;

begin

Result := 0;

// Запоминаю размеры окна

i_width := rgnBitmap.Width;

i_height := rgnBitmap.Height;

// Определяю прозрачный цвет

transColor := rgnBitmap.Canvas.Pixels[0, 0];

// Запускаю цикл перебора строк картинки

// для определения области окна без фона

for i := 0 to i_height - 1 do

begin

i_left := -1;

// Запускаю цикл перебора столбцов картинки

for j := 0 to i_width - 1 do

begin

if i_left < 0 then

begin

if rgnBitmap.Canvas.Pixels[j, i] <> transColor then

Назад на стр. 049-084-1  Содержание  Вперед на стр. 049-084-3