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