问题来源
群里一位朋友,在开发的过程中,遇到一个产品需求。产品为在线教育,远程教育等操作时,会有多个视频窗口。
- 产品需求希望将视频窗口单独显示出来。
- 也可以根据用户需求,将所有窗口拖动到一个Panel里进行排序显示。
- 并且在Panel内部时,也可以通过拖动进行重新排序。
思考与解决
- 首先对窗体进行拖动,找到窗体拖动结束的事件。
- 窗体拖动接受后,判断鼠标当前位置是否在目标Panel上,如果是,则置入,否则不操作。
- 置入操作,可以通过改变窗体的Parent等属性进行调整。
- 在Panel内部调整时,根据鼠标拖动结束后的位置判断,是否在Panel外,如果在外面,则将Form拉出Panel。
- 至于在Panel内部拖动Form时不需要再做其他动作,在步骤2里已经进行了操作。
代码如下:
代码只需写在被拖动的窗体单元即可,这里我的主窗体为Form1,目标Panel名为Panel5,被拖动窗体为From2,From3,Form4。这里只给出Form2单元代码,Form3和Form4只需修改窗体名即可。
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
dxGDIPlusClasses, Vcl.ExtCtrls;
type
TForm2 = class(TForm)
Image1: TImage;
Label1: TLabel;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
procedure WMExitSizeMove(var Message: TMessage); message WM_EXITSIZEMOVE;
end;
var
Form2: TForm2;
implementation
uses
Unit1;
{<span class="katex math inline"><span class="err">ParseError: KaTeX parse error: Expected 'EOF', got '}' at position 8: R *.dfm}̲ procedure T…</span></span>F012, 0);
end;
end;
procedure TForm2.WMExitSizeMove(var Message: TMessage);
begin
if (Mouse.CursorPos.x > Form1.Panel5.Left + form1.Left) and (Mouse.CursorPos.x < Form1.Left + form1.Panel5.Left + form1.Panel5.Width) and (Mouse.CursorPos.y > form1.Top + form1.Panel5.Top) and (Mouse.CursorPos.y < Form1.top + form1.Panel5.Top + form1.Panel5.Height) then
begin
form2.Parent := Form1.Panel5;
if Mouse.CursorPos.x - Form1.Left - form1.Panel5.Left < 50 then
begin
Form2.Left := -1;
end
else
begin
form2.Left := Mouse.CursorPos.x - Form1.Left - form1.Panel5.Left;
end;
form2.BorderStyle := bsnone;
Form2.Align := alLeft;
form2.Visible := True;
end;
end;
end.