高技术难题,我想在运行时,能达到设计时的效果,类似Handle! 请问如何在运行时,使控件周边也有6各黑点,鼠标可以任意调整其大小和位置! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 unit DCBS_Components;interfaceuses Windows, Messages, SysUtils, Classes, Controls, Graphics, Menus;const SC_DRAGMOVE = $F012;type TdcbsSizeControlTemplate = class(TCustomControl) private FControl: TControl; FRectList: array [1..8] of TRect; FResizePosList: array [ 1..8] of DWORD; procedure PopupMenuItemFreeClick(Sender: TObject); procedure WMLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN; procedure WMMove(var Msg: TWMMove); message WM_MOVE; procedure WMNcHitTest(var Msg: TWMNcHitTest); message WM_NCHITTEST; procedure WMPaint(var Msg: TWMPaint); message WM_PAINT; procedure WMRButtonUp(var Msg: TWMRButtonUp); message WM_RBUTTONUP; procedure WMSize(var Msg: TWMSize); message WM_SIZE; protected { Protected declarations } public constructor Create(AOwner: TComponent; AControl: TControl); procedure CreateParams(var Params: TCreateParams); override; procedure CreateHandle; override; procedure SizeControlTemplateExit(Sender: TObject); published { Published declarations } end; TSizeControlTemplate = TdcbsSizeControlTemplate; procedure CreateSizeControl(AOwner: TComponent; AControl: TControl); stdcall;implementation//***************************************************************************{ TdcbsSizeControlTemplate }constructor TdcbsSizeControlTemplate.Create(AOwner: TComponent; AControl: TControl);var R: TRect; MenuItem: TMenuItem; FPopupMenu: TPopupMenu;begin inherited Create(AOwner); FControl := AControl; OnExit := SizeControlTemplateExit; R := FControl.BoundsRect; InflateRect(R, 2, 2); BoundsRect := R; Parent := FControl.Parent; FPopupMenu := TPopupMenu.Create(Self); with FPopupMenu do begin MenuItem := TMenuItem.Create(FPopupMenu); MenuItem.Caption := 'Free(&F)'; MenuItem.Name := 'FreeControlMenuItem'; MenuItem.OnClick := PopupMenuItemFreeClick; Items.Add(MenuItem); end; PopupMenu := FPopupMenu; FResizePosList[1] := htTopLeft; FResizePosList[2] := htTop; FResizePosList[3] := htTopRight; FResizePosList[4] := htRight; FResizePosList[5] := htBottomRight; FResizePosList[6] := htBottom; FResizePosList[7] := htBottomLeft; FResizePosList[8] := htLeft;end;procedure TdcbsSizeControlTemplate.CreateHandle;begin inherited; SetFocus;end;procedure TdcbsSizeControlTemplate.CreateParams(var Params: TCreateParams);begin inherited; Params.ExStyle := Params.ExStyle + WS_EX_TRANSPARENT;end;procedure TdcbsSizeControlTemplate.PopupMenuItemFreeClick(Sender: TObject);begin SizeControlTemplateExit(Self);end;procedure TdcbsSizeControlTemplate.SizeControlTemplateExit( Sender: TObject);begin Free;end;procedure TdcbsSizeControlTemplate.WMLButtonDown(var Msg: TWMLButtonDown);begin Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);end;procedure TdcbsSizeControlTemplate.WMMove(var Msg: TWMMove);var R: TRect;begin R := BoundsRect; InflateRect(R, -2, -2); FControl.Invalidate; FControl.BoundsRect := R;end;procedure TdcbsSizeControlTemplate.WMNcHitTest(var Msg: TWMNcHitTest);var Pt: TPoint; I: Byte;begin Pt := Point(Msg.XPos, Msg.YPos); Pt := ScreenToClient(Pt); Msg.Result := 0; for I := 1 to 8 do if PtInRect(FRectList[I], Pt) then Msg.Result := FResizePosList[I]; if Msg.Result = 0 then inherited;end;procedure TdcbsSizeControlTemplate.WMPaint(var Msg: TWMPaint);var I: Byte;begin with Canvas do begin Brush.Color := clBlue; for I := 1 to 8 do Rectangle(FRectList[I]); end;end;procedure TdcbsSizeControlTemplate.WMRButtonUp(var Msg: TWMRButtonUp);begin inherited; FControl.Invalidate;end;procedure TdcbsSizeControlTemplate.WMSize(var Msg: TWMSize);var R: TRect;begin R := BoundsRect; InflateRect(R, -2, -2); FControl.BoundsRect := R; FRectList[1] := Rect(0, 0, 5, 5); FRectList[2] := Rect(Width div 2 - 3, 0, Width div 2 + 2, 5); FRectList[3] := Rect(Width - 5, 0, Width, 5); FRectList[4] := Rect(Width - 5, Height div 2 - 3, Width, Height div 2 + 2); FRectList[5] := Rect(Width - 5, Height - 5, Width , Height); FRectList[6] := Rect(Width div 2 - 3, Height - 5, Width div 2 + 2, Height); FRectList[7] := Rect(0, Height - 5, 5, Height); FRectList[8] := Rect(0, Height div 2 - 3, 5, Height div 2 + 2);end;procedure CreateSizeControl(AOwner: TComponent; AControl: TControl);begin if not Assigned(AOwner) then raise Exception.Create('Invalid parameter "AOwner"!'); if not Assigned(AControl) then raise Exception.Create('Invalid parameter "AControl"'); TdcbsSizeControlTemplate.Create(AOwner, AControl);end;end. 使用方法:建立一个新的unit,把上面的代码都贴进去。在需要使用时只要调用CreateSizeControl()函数就可以了:// Example:begin CreateSizeControl(Form1, Button1);end;// 注意这个东西还不完善,如果不乱用是不会用问题的。 关于类的实例的内存释放问题是这样的:(1)当Button1失去焦点时,控件会自动释放;(2)使用鼠标右键可以手工释放。 {*************************************************}{ }{ DCB Studio Library }{ }{ Copyright(C) 2002-2003 DCB Studio }{ }{*************************************************}希望你在新的单元的顶部加上这个!谢谢! TommyTong(童童--百姓爱这个国呀,谁来爱百姓呀?),覆盖在原控件上的透明控件?呵呵,我原先作的一个界面设计器也是这样的思路,不过覆盖的范围很大,Form或者Panel等,可以调整多个控件.hryyx ,深入的话,需要看看RTTI方面的资料(TypInfo单元) 哪里有难度啊!很容易搞定的啊,控件大小是知道的,那么就在控件的周围用Canvas画6个点就是了啊,然后鼠标在哪个点附近就调整鼠标的光标进行需要的操作啊!哪里高技术难题了啊? Linux2001(我想买手提电脑啊!)兄: 笔记本电脑买了没有?:), 大家面试 delphi的时候,都被问什么问题啊? 用dephi可以编写activex.dll吗?哪里有例子可以下载.谢谢 请问高手建立了data module以后如何调用啊?急用!!!在线等待!真的是非常谢谢了!! 两个简单的问题?望高人指点 关于winrar压缩文件控制的问题 很简单啊 我就是不知道 又一个有关程序在win98与win2000下运行令我几个月不得安宁的问题... 如何制作安装盘(300分)? 怎样在Delphi中取系统时间? 读入文件问题 DELPHI对EMAIL的操作,急 ★★如何更改InputBox的字体及将其中的英文改为中文?
Windows, Messages, SysUtils, Classes, Controls, Graphics, Menus;const
SC_DRAGMOVE = $F012;type
TdcbsSizeControlTemplate = class(TCustomControl)
private
FControl: TControl;
FRectList: array [1..8] of TRect;
FResizePosList: array [ 1..8] of DWORD; procedure PopupMenuItemFreeClick(Sender: TObject); procedure WMLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMMove(var Msg: TWMMove); message WM_MOVE;
procedure WMNcHitTest(var Msg: TWMNcHitTest); message WM_NCHITTEST;
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
procedure WMRButtonUp(var Msg: TWMRButtonUp); message WM_RBUTTONUP;
procedure WMSize(var Msg: TWMSize); message WM_SIZE;
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent; AControl: TControl); procedure CreateParams(var Params: TCreateParams); override;
procedure CreateHandle; override; procedure SizeControlTemplateExit(Sender: TObject);
published
{ Published declarations }
end;
TSizeControlTemplate = TdcbsSizeControlTemplate; procedure CreateSizeControl(AOwner: TComponent; AControl: TControl); stdcall;implementation//***************************************************************************
{ TdcbsSizeControlTemplate }constructor TdcbsSizeControlTemplate.Create(AOwner: TComponent;
AControl: TControl);
var
R: TRect;
MenuItem: TMenuItem;
FPopupMenu: TPopupMenu;
begin
inherited Create(AOwner); FControl := AControl;
OnExit := SizeControlTemplateExit;
R := FControl.BoundsRect;
InflateRect(R, 2, 2);
BoundsRect := R;
Parent := FControl.Parent; FPopupMenu := TPopupMenu.Create(Self);
with FPopupMenu do
begin
MenuItem := TMenuItem.Create(FPopupMenu);
MenuItem.Caption := 'Free(&F)';
MenuItem.Name := 'FreeControlMenuItem';
MenuItem.OnClick := PopupMenuItemFreeClick;
Items.Add(MenuItem);
end;
PopupMenu := FPopupMenu; FResizePosList[1] := htTopLeft;
FResizePosList[2] := htTop;
FResizePosList[3] := htTopRight;
FResizePosList[4] := htRight;
FResizePosList[5] := htBottomRight;
FResizePosList[6] := htBottom;
FResizePosList[7] := htBottomLeft;
FResizePosList[8] := htLeft;
end;procedure TdcbsSizeControlTemplate.CreateHandle;
begin
inherited; SetFocus;
end;procedure TdcbsSizeControlTemplate.CreateParams(var Params: TCreateParams);
begin
inherited; Params.ExStyle := Params.ExStyle + WS_EX_TRANSPARENT;
end;procedure TdcbsSizeControlTemplate.PopupMenuItemFreeClick(Sender: TObject);
begin
SizeControlTemplateExit(Self);
end;procedure TdcbsSizeControlTemplate.SizeControlTemplateExit(
Sender: TObject);
begin
Free;
end;procedure TdcbsSizeControlTemplate.WMLButtonDown(var Msg: TWMLButtonDown);
begin
Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;procedure TdcbsSizeControlTemplate.WMMove(var Msg: TWMMove);
var
R: TRect;
begin
R := BoundsRect;
InflateRect(R, -2, -2);
FControl.Invalidate;
FControl.BoundsRect := R;
end;procedure TdcbsSizeControlTemplate.WMNcHitTest(var Msg: TWMNcHitTest);
var
Pt: TPoint;
I: Byte;
begin
Pt := Point(Msg.XPos, Msg.YPos);
Pt := ScreenToClient(Pt);
Msg.Result := 0;
for I := 1 to 8 do
if PtInRect(FRectList[I], Pt) then
Msg.Result := FResizePosList[I];
if Msg.Result = 0 then
inherited;
end;procedure TdcbsSizeControlTemplate.WMPaint(var Msg: TWMPaint);
var
I: Byte;
begin
with Canvas do
begin
Brush.Color := clBlue;
for I := 1 to 8 do
Rectangle(FRectList[I]);
end;
end;procedure TdcbsSizeControlTemplate.WMRButtonUp(var Msg: TWMRButtonUp);
begin
inherited; FControl.Invalidate;
end;procedure TdcbsSizeControlTemplate.WMSize(var Msg: TWMSize);
var
R: TRect;
begin
R := BoundsRect;
InflateRect(R, -2, -2);
FControl.BoundsRect := R; FRectList[1] := Rect(0, 0, 5, 5);
FRectList[2] := Rect(Width div 2 - 3, 0, Width div 2 + 2, 5);
FRectList[3] := Rect(Width - 5, 0, Width, 5);
FRectList[4] := Rect(Width - 5, Height div 2 - 3, Width, Height div 2 + 2);
FRectList[5] := Rect(Width - 5, Height - 5, Width , Height);
FRectList[6] := Rect(Width div 2 - 3, Height - 5, Width div 2 + 2, Height);
FRectList[7] := Rect(0, Height - 5, 5, Height);
FRectList[8] := Rect(0, Height div 2 - 3, 5, Height div 2 + 2);
end;procedure CreateSizeControl(AOwner: TComponent; AControl: TControl);
begin
if not Assigned(AOwner) then
raise Exception.Create('Invalid parameter "AOwner"!');
if not Assigned(AControl) then
raise Exception.Create('Invalid parameter "AControl"');
TdcbsSizeControlTemplate.Create(AOwner, AControl);
end;end.
建立一个新的unit,把上面的代码都贴进去。在需要使用时只要调用CreateSizeControl()函数就可以了:
// Example:
begin
CreateSizeControl(Form1, Button1);
end;// 注意这个东西还不完善,如果不乱用是不会用问题的。
(1)当Button1失去焦点时,控件会自动释放;
(2)使用鼠标右键可以手工释放。
{ }
{ DCB Studio Library }
{ }
{ Copyright(C) 2002-2003 DCB Studio }
{ }
{*************************************************}希望你在新的单元的顶部加上这个!谢谢!
覆盖在原控件上的透明控件?呵呵,我原先作的一个界面设计器也是这样的思路,不过覆盖的范围很大,Form或者Panel等,可以调整多个控件.hryyx ,
深入的话,需要看看RTTI方面的资料(TypInfo单元)