В общих чертах, вы должны рисовать на всей поверхности формы и даже рабочего стола, для чего необходимо сделать растровую КОПИЮ окна или десктопа и рисовать на ней. Вот что нам нужно.
Начните со свеженькой формы. Бросьте на нее компонент Notebook и установите его свойство Align в alClient. Разработайте форму на первой странице компонента Notebook. Создайте вторую страницу в Notebook, поместите туда Paintbox и установите его свойство Align в alClient. Далее добавьте нижеследующие строчки в секцию Private вашей формы:
Img : TBitmap;DragX, DragY, DragW, DragH, XOff, YOff : Integer; |
В обработчике формы OnCreate:
|
Img := TBitmap.Create; |
В общем, для всех перетаскиваемых компонентов, обработчике события OnMouseDown:
IF NOT (ssShift IN Shift) THEN Exit;Img := GetFormImage;Notebook1.PageIndex := 1;WITH Sender AS TControl DOBEGINDragW := Width;DragH := Height;XOff:= X;YOff := Y;BeginDrag(True);END; |
В общем, для всех перетаскиваемых компонентов, обработчике события EndDrag:
Notebook1.PageIndex := 0;WITH Sender AS Tcontrol DOBEGINLeft := X-Xoff;Top := Y-YOff;END; |
Поместите следующую строку в обработчик события OnPaint компонента PaintBox:
PaintBox1.Canvas.Draw(0, 0, Img); |
И наконец, если вам еще это не надоело, поместите следующую строчку в обработчик OnDragOver компонента PaintBox:
IF (X=DragX) AND (Y=DragY) THEN Exit;WITH PaintBox1.Canvas DOBEGINDrawFocusRect(Bounds(DragX-XOff, DragY-YOff, DragW, DragH);DragX := X; DragY := Y;DrawFocusRect(Bounds(DragX-XOff, DragY-YOff, DragW, DragH);END; |
ФУ!! Но это работает! Я не хотел убирать в компонентах возможность перетаскивания их мышью обычным способом, поэтому для включения дополнительной характеристики необходимо при старте держать нажатой клавишу Shift. Попробуйте это!
- NEil
Я пытаюсь "потаскать" TPanel, используемую в качестве ToolBar и всегда почему-то получаю иконку с перечеркнутым кругом. Я понимаю, что это означает невозможность перетаскивания. К сожалению, в документации я ничего не нашел как решить эту проблему. Я пробовал и ручные, и автоматические настройки (DragMode = dmManual/dmAutomatic - В.О.), но все без толку.
Иногда я вообще не могу "оторвать" TPanel!
Начнем с самого начала. Причина того, что вы получаете курсор "crNoDrop" в том, что под курсором элемент управления не готов принять перетаскиваемый компонент. Чтобы исправить эту ситуацию, дважды щелкните (в Инспекторе Объектов) на событии формы или компонента OnDragOver и установите параметр Accept в, например так:
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);begin Accept := true ;end; |
FOR N := 0 TO ComponentCount-1 DOIF COmponents[N] IS TButton THENIF IntersectRect(DummyRect, TControl(Components[N]).BoundsRect,(Bounds(X-XOff, Y-YOff, DragW, DragH)) >0 THENAccept := False; |