qt: support for drag/dock for forms with dkDock style

win32: allow drag/dock TCustomForms too - not only TForm descendants

git-svn-id: trunk@13888 -
This commit is contained in:
paul 2008-01-26 18:20:19 +00:00
parent 54d4d815b2
commit 1d29c3e238
5 changed files with 32 additions and 11 deletions

View File

@ -1087,7 +1087,8 @@ end;
TControl.DoDragMsg TControl.DoDragMsg
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
function TControl.DoDragMsg(ADragMessage: TDragMessage; APosition: TPoint; ADragObject: TDragObject; ATarget: TControl; ADocking: Boolean):LRESULT; function TControl.DoDragMsg(ADragMessage: TDragMessage; APosition: TPoint; ADragObject: TDragObject; ATarget: TControl; ADocking: Boolean):LRESULT;
var AWinTarget: TWinControl; var
AWinTarget: TWinControl;
Accepts: Boolean; Accepts: Boolean;
P: TPoint; P: TPoint;
Begin Begin
@ -1108,10 +1109,10 @@ Begin
if ADragObject is TDragDockObject then if ADragObject is TDragDockObject then
begin begin
AWinTarget:= TWinControl(ADragObject.DragTarget); AWinTarget:= TWinControl(ADragObject.DragTarget);
AWinTarget.DockOver(TDragDockObject(ADragObject),P.X,P.Y,TDragState(ADragMessage),Accepts); AWinTarget.DockOver(TDragDockObject(ADragObject), P.X, P.Y, TDragState(ADragMessage), Accepts);
end end
else else
DragOver(ADragObject,P.X,P.Y,TDragState(ADragMessage),Accepts); DragOver(ADragObject, P.X, P.Y, TDragState(ADragMessage), Accepts);
Result := Ord(Accepts); Result := Ord(Accepts);
end; end;

View File

@ -1,7 +1,7 @@
{%MainUnit ../extctrls.pp} {%MainUnit ../extctrls.pp}
{****************************************************************************** {******************************************************************************
TCustomForm TCustomSplitter
****************************************************************************** ******************************************************************************
***************************************************************************** *****************************************************************************

View File

@ -4735,7 +4735,7 @@ procedure TWinControl.DockOver(Source: TDragDockObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); State: TDragState; var Accept: Boolean);
begin begin
PositionDockRect(Source); PositionDockRect(Source);
DoDockOver(Source,X,Y,State,Accept); DoDockOver(Source, X, Y, State, Accept);
end; end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------
@ -4746,7 +4746,7 @@ procedure TWinControl.DoDockOver(Source: TDragDockObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); State: TDragState; var Accept: Boolean);
begin begin
if Assigned(FOnDockOver) then if Assigned(FOnDockOver) then
FOnDockOver(Self,Source,X,Y,State,Accept); FOnDockOver(Self, Source, X, Y, State, Accept);
end; end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------

View File

@ -128,6 +128,7 @@ type
procedure SlotHover(Sender: QObjectH; Event: QEventH); cdecl; procedure SlotHover(Sender: QObjectH; Event: QEventH); cdecl;
function SlotKey(Sender: QObjectH; Event: QEventH): Boolean; cdecl; function SlotKey(Sender: QObjectH; Event: QEventH): Boolean; cdecl;
procedure SlotMouse(Sender: QObjectH; Event: QEventH); cdecl; procedure SlotMouse(Sender: QObjectH; Event: QEventH); cdecl;
procedure SlotNCMouse(Sender: QObjectH; Event: QEventH); cdecl;
procedure SlotMouseEnter(Sender: QObjectH; Event: QEventH); cdecl; procedure SlotMouseEnter(Sender: QObjectH; Event: QEventH); cdecl;
procedure SlotMouseMove(Event: QEventH); cdecl; procedure SlotMouseMove(Event: QEventH); cdecl;
procedure SlotMouseWheel(Sender: QObjectH; Event: QEventH); cdecl; procedure SlotMouseWheel(Sender: QObjectH; Event: QEventH); cdecl;
@ -1085,6 +1086,8 @@ const
DblClickThreshold = 3;// max Movement between two clicks of a DblClick DblClickThreshold = 3;// max Movement between two clicks of a DblClick
type type
TWinControlAccess = class(TWinControl)
end;
TLastMouseInfo = record TLastMouseInfo = record
Widget: QObjectH; Widget: QObjectH;
MousePos: TQtPoint; MousePos: TQtPoint;
@ -1535,6 +1538,10 @@ begin
SlotPaint(Sender, Event); SlotPaint(Sender, Event);
end; end;
QEventContextMenu: SlotContextMenu(Sender, Event); QEventContextMenu: SlotContextMenu(Sender, Event);
QEventNonClientAreaMouseButtonPress:
begin
SlotNCMouse(Sender, Event);
end;
QEventLCLMessage: QEventLCLMessage:
begin begin
SlotLCLMessage(Sender, Event); SlotLCLMessage(Sender, Event);
@ -2013,6 +2020,16 @@ begin
DeliverMessage(Msg); DeliverMessage(Msg);
end; end;
procedure TQtWidget.SlotNCMouse(Sender: QObjectH; Event: QEventH); cdecl;
begin
//Drag&Dock support TCustomForm => Start BeginDrag()
if LCLObject is TCustomForm then
begin
if TWinControlAccess(LCLObject).DragKind = dkDock then
LCLObject.BeginDrag(true);
end;
end;
procedure TQtWidget.SlotMouseEnter(Sender: QObjectH; Event: QEventH); cdecl; procedure TQtWidget.SlotMouseEnter(Sender: QObjectH; Event: QEventH); cdecl;
var var
Msg: TLMessage; Msg: TLMessage;

View File

@ -1821,11 +1821,14 @@ begin
Assert(False, 'Trace:WindowProc - Got WM_NCLBUTTONDOWN'); Assert(False, 'Trace:WindowProc - Got WM_NCLBUTTONDOWN');
//Drag&Dock support TCustomForm => Start BeginDrag() //Drag&Dock support TCustomForm => Start BeginDrag()
if lWinControl <> nil then begin if lWinControl <> nil then
if WParam = HTCAPTION then begin begin
if lWinControl is TForm then begin if WParam = HTCAPTION then
if TForm(lWinControl).DragKind = dkDock begin
then lWinControl.BeginDrag(true); if lWinControl is TCustomForm then
begin
if TWinControlAccess(lWinControl).DragKind = dkDock then
lWinControl.BeginDrag(true);
end; end;
end; end;
end; end;