可以任意拖动,没有问题的,还有要拖很长距离才移动这是因为我在procedure TCustomImageEx.WMLButtonUp(var Message: TWMLButtonUp);消息中,进行了网格对齐的视觉效果的处理,你可以去掉这段代码:
procedure TCustomImageEx.WMLButtonUp(var Message: TWMLButtonUp);
var
iLeft, iTop: Integer;
I: Integer;
begin
inherited;
//网格对齐的视觉效果
iLeft := Left mod Width;
if iLeft < Width div 2 then
Left := Left div Width * Width
else
Left := Left div Width * Width + Width;
iTop := Top mod Height;
if iTop < Height div 2 then
Top := Top div Height * Height
else
Top := Top div Height * Height + Height;
for I := 0 to FLine.Count - 1 do
SendMessage(TPuckerLineEx(FLine.Items).Handle,
WM_WINCONTROLUP, 0, 0);
end;
这是我的测试工程,使用TScrollBox作为Parent:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Buttons, ImgList, ExtCtrls, ImageEx, DB,
ADODB, RbsWiredEdit, ToolWin;
type
TImageExDemo = class(TForm)
ImgLstBea: TImageList;
Splitter: TSplitter;
ScrollBox: TScrollBox;
Panel1: TPanel;
ListBox: TListBox;
Panel2: TPanel;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
chkVisible: TCheckBox;
chkReadOnly: TCheckBox;
StatusBar: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ListBoxClick(Sender: TObject);
procedure chkVisibleClick(Sender: TObject);
procedure chkReadOnlyClick(Sender: TObject);
private
{ Private declarations }
CustomImageEx : array of TCustomImageEx;
PuckerLineEx: array of TPuckerLineEx;
IsClick: Boolean;
procedure ImageExOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure ImageExOnEnter(Sender: TObject);
procedure ImageExOnExit(Sender: TObject);
procedure ImageExOnDblClick(Sender: TObject);
procedure ImageExOnMove(Sender: TObject; X, Y: Integer);
public
{ Public declarations }
end;
var
ImageExDemo: TImageExDemo;
implementation
{$R *.dfm}
procedure TImageExDemo.FormCreate(Sender: TObject);
var
I : Integer;
begin
IsClick := False;
SetLength(CustomImageEx, ListBox.Items.Count);
for I := low(CustomImageEx) to high(CustomImageEx) do
begin
CustomImageEx := TCustomImageEx.Create(Self);
CustomImageEx.Parent := ScrollBox;
CustomImageEx.SetBounds(10, 50 * I, 100, 100);
CustomImageEx.Images := ImgLstBea;
CustomImageEx.ImageDefaultIndex := 0;
CustomImageEx.ImageActivateIndex := 1;
CustomImageEx.Transparent := true;
CustomImageEx.Stretch := true;
CustomImageEx.AutoSize := true;
CustomImageEx.Text := ListBox.Items.Strings;
CustomImageEx.Font.Color := clBlue;
//CustomImageEx.ReadOnly := True;
CustomImageEx.OnMouseMove := ImageExOnMouseMove;
CustomImageEx.OnEnter := ImageExOnEnter;
CustomImageEx.OnExit := ImageExOnExit;
CustomImageEx.OnDblClick := ImageExOnDblClick;
CustomImageEx.OnMove := ImageExOnMove;
CustomImageEx.Show;
end;
end;
procedure TImageExDemo.FormClose(Sender: TObject; var Action: TCloseAction);
var
I : Integer;
begin
for I := low(CustomImageEx) to high(CustomImageEx) do
FreeAndNil(CustomImageEx);
for I := low(PuckerLineEx) to high(PuckerLineEx) do
if Assigned(PuckerLineEx) then
FreeAndNil(PuckerLineEx);
end;
procedure TImageExDemo.ImageExOnMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
//labX.Caption := 'X: ' + IntToStr(X);
//labY.Caption := 'Y: ' + IntToStr(Y);
end;
procedure TImageExDemo.ListBoxClick(Sender: TObject);
begin
CustomImageEx[ListBox.ItemIndex].SetFocus;
end;
procedure TImageExDemo.ImageExOnEnter(Sender: TObject);
var
I : Integer;
begin
for I := low(CustomImageEx) to high(CustomImageEx) do
if CustomImageEx.Focused then
CustomImageEx.Font.Color := clRed;
StatusBar.Panels.Items[0].Text := '与之关联的线条数量:'
+ IntToStr((Sender as TCustomImageEx).LineCount);
end;
procedure TImageExDemo.ImageExOnExit(Sender: TObject);
var
I : Integer;
begin
for I := low(CustomImageEx) to high(CustomImageEx) do
if not CustomImageEx.Focused then
CustomImageEx.Font.Color := clBlue;
end;
procedure TImageExDemo.ImageExOnDblClick(Sender: TObject);
begin
IsClick := not IsClick;
if IsClick then
begin
SetLength(PuckerLineEx, High(PuckerLineEx) + 2);
PuckerLineEx[High(PuckerLineEx)] := TPuckerLineEx.Create(Self);
PuckerLineEx[High(PuckerLineEx)].Parent := ScrollBox;
PuckerLineEx[High(PuckerLineEx)].BeginBit := (Sender as TCustomImageEx);
(Sender as TCustomImageEx).Line.Add(Pointer(PuckerLineEx[High(PuckerLineEx)]));
end else
begin
PuckerLineEx[High(PuckerLineEx)].EndBit := (Sender as TCustomImageEx);
(Sender as TCustomImageEx).Line.Add(Pointer(PuckerLineEx[High(PuckerLineEx)]));
if Assigned(PuckerLineEx[High(PuckerLineEx)]) then
begin
PuckerLineEx[High(PuckerLineEx)].Show;
end;
end;
end;
procedure TImageExDemo.ImageExOnMove(Sender: TObject; X, Y: Integer);
begin
end;
procedure TImageExDemo.chkVisibleClick(Sender: TObject);
var
I: Integer;
begin
for I := Low(PuckerLineEx) to High(PuckerLineEx) do
PuckerLineEx.Visible := chkVisible.Checked;
end;
procedure TImageExDemo.chkReadOnlyClick(Sender: TObject);
var
I: Integer;
begin
for I := Low(PuckerLineEx) to High(PuckerLineEx) do
PuckerLineEx.ReadOnly := not chkReadOnly.Checked;
end;
end.