请大家帮忙看以下代码:运行时调整控件大小和位置的好代码,我的问题是如何再次定制它(100分)

  • 主题发起人 主题发起人 alaclp
  • 开始时间 开始时间
A

alaclp

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TAnalysisControl = class(TCustomControl)
public
procedure MouseDown(Button : TMouseButton; Shift : TShiftState; X,Y : integer); override;
procedure MouseMove(Shift : TShiftState; X,Y : Integer); override;
procedure Paint; override;
end;

TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

const
sizeBorder = 2;

sc_SizeLeft = $F001; { these are the variations on the }
sc_SizeRight = $F002; { SC_SIZE value }
sc_SizeTop = $F003;
sc_SizeTopLeft = $F004;
sc_SizeTopRight = $F005;
sc_SizeBottom = $F006;
sc_SizeBottomRight = $F008;
sc_SizeBottomLeft = $F007;
sc_DragMove = $F012;

implementation

uses Winprocs;
{$R *.dfm}

{ TAnalysisControl }

procedure TAnalysisControl.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: integer);
begin
if Button = mbLeft then
begin
ReleaseCapture;

if (X >= Width - sizeBorder) And NOT((Y <= sizeBorder) or (Y >= Height - sizeBorder)) then
Self.Perform(WM_SysCommand,sc_SizeRight,0)
else
if Not((X <= sizeBorder) or (X >= Width - sizeBorder)) And (Y <= sizeBorder) then
Self.Perform(WM_SysCommand,sc_SizeTop,0)
else
if (X <= sizeBorder) And (Y <= sizeBorder) then
Self.Perform(WM_SysCommand,sc_SizeTopLeft,0)
else
if (X >= Width - sizeBorder) and (Y <= sizeBorder) then
Self.Perform( WM_SysCommand, sc_SizeTopRight , 0 )
else
if Not((X <= sizeBorder) or (X >= Width - sizeBorder)) And (Y >= Height - sizeBorder) then
Self.Perform(WM_SysCommand,sc_SizeBottom,0)
else
if (Y >= Height - sizeBorder) And (X <= sizeBorder) then
Self.Perform(WM_SysCommand,sc_SizeBottomLeft,0)
else
if (Y >= Height - sizeBorder) and (X >= Width - sizeBorder) then
Self.Perform(WM_SysCommand, sc_SizeBottomRight, 0)
else
if Not((Y <= sizeBorder) or (Y >= Height - sizeBorder)) And (X <= sizeBorder) then
Self.Perform(WM_SysCommand,sc_SizeLeft,0)
else
begin
Self.Perform(WM_SysCommand,SC_DragMove,0);
end;

end;

end;

procedure TAnalysisControl.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
if (X <= sizeBorder) or (X >= Width - sizeBorder) then
begin
if (Y >= Height - sizeBorder) then
begin
if (X >= Width - sizeBorder) then
Cursor := crSizeNWSE
else
Cursor := crSizeNESW;
end
else
if (Y <= sizeBorder) then
begin
if (X >= Width - sizeBorder) then
Cursor := crSizeNESW
else
Cursor := crSizeNWSE;
end
else
Cursor := crSizeWE;
end
else
if (Y <= sizeBorder) or (Y >= Height - sizeBorder) then
begin
Cursor := crSizeNS;
end
else
Cursor := crDefault;

end;

procedure TAnalysisControl.Paint;
var
Rect: TRect;
info: string;
begin
Info := '测试程序';
With Canvas do
begin
Brush.Color := clWhite;
Brush.Style := bsSolid;
Rect := Self.GetClientRect;
FillRect(Rect);
//如何绘制居中的文字
OffSetRect(Rect, 0, 4);
DrawText(GetDc(Self.Handle), PChar(Info), Length(Info), Rect, DT_Center);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
With TAnalysisControl.Create(Self) do
begin
Parent := Self;
Left := 20;
Top := 20;
// Shape := stRectangle;
Height := 90;
Width := 90;
end;
end;

end.

请问为什么把继承关系改为 TAnalysisControl = class(TCustomGraphic)
就不行了呢?
如果我想制作可以移动及改变大小的图象空间,要实现上述效果该怎么做?
 
都这么厉害了,连这个问题都问出来?
为什么要改成 TCustomGraphic ?你只要在现在这个控件里的 Paint 中,完成画一幅
图就可以了。TCustomControl 的 Canvas 属性用来做什么的 ?如果连这个都没搞懂,
先看看 vcl 代码怎么样 ?
 
不好意思,问题没有问清楚
我是说把继承关系修改为TAnalysisControl = class(TCustomGraphic)后,
为什么新的控件就不支持移动和改变大小操作了,而不是问如何绘制图形。
请大家帮帮忙
 
请大家帮忙up一下
 
TCustomControl有句柄,并且支持鼠标、键盘事件
TCustomGraphic不好意思,没用过这个类,也没见到过,有吗?
我会用TGraphicControl
我想应该是因为TGraphicControl没有句柄,所以不能SetCapture,
因此得不到相应的鼠标移动信息

那几个调整大小的消息,我想应该会在内部设置MouseCapture的
 
TGraphicControl支持SetCapture, ReleaseCapture, MouseCapture Windows API
操作。
否则,它不是没有鼠标事件了吗?
 
应该可以的吧,可以参考一下Vcl的源码,看看TImage是如何处理的
 
可是TImage没有动态调整大小的代码啊?
 
学会自己研究的的方法:找自己的parent,看看有没有上述属性,
不然要自己加。
 
这是因为你定义的这个类,它的控制是使用窗口消息的,使用窗口消息的必要条件是
必须有一个窗口定义,也就是需要有窗口的 HWND ,图形控件没有这个东西,所以你
发出的消息就不会被理睬。图形控件在 vcl 内有 Delphi 自己的 vcl 消息,而不是
标准的消息,在 Delphi 开发者大全上有详细说明。
 
大家可以试验以下代码:
procedcure Button1Click(Sender: TObject);
var
I : Integer;
begin
try
For I := 1 to 300 do
begin
With TListBox.Create(Self) do
Parent := Self;
end;
except
showmessage(IntToStr(I));
Raise;
end;
end;
看看到底Form中可以容纳多少窗口控件就知道为什么我不从TCustomControl继承了
 
我改了一点,可以创建无穷个。
 
怎么样创建无穷个?把代码贴出来看看。
 
后退
顶部