FMX的ImageViewer控件,如何可以按住鼠标拖动图片?只能用滚动条来显示大图片的不同区域吗?

ooolinux 2019-10-17 05:07:51
FMX的ImageViewer控件,如何可以按住鼠标拖动图片?只能用滚动条来显示大图片的不同区域吗?
...全文
614 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2019-11-12
  • 打赏
  • 举报
回复
nikotin 2019-10-18
  • 打赏
  • 举报
回复
fmx控件在渲染前, 会乘以一个变换矩阵,用来实现缩放,旋转,移动等操作,对应sacle, rotate, translate等属性。所以我想在鼠标事件里,改变一下translate属性,或者直接设置这个变换矩阵,就可以实现随鼠标移动了。
ooolinux 2019-10-18
  • 打赏
  • 举报
回复
引用 1 楼 nikotin 的回复:
添加鼠标拖动事件,改变控件的变换矩阵对应属性就行了吧。
不是滚动,是按住鼠标拖动。 控件的变换矩阵是啥?
ooolinux 2019-10-18
  • 打赏
  • 举报
回复
引用 6 楼 ooolinux 的回复:
[quote=引用 5 楼 早打大打打核战争 的回复:] 只需要在鼠标移动时调用ImageViewer的ScrollBy方法
float px,py;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageViewer1MouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, float X, float Y)
{
	px=X;
	py=Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageViewer1MouseMove(TObject *Sender, TShiftState Shift,
          float X, float Y)
{
	if(Shift.Contains(ssLeft))
		ImageViewer1->ScrollBy(X-px,Y-py);
}
//---------------------------------------------------------------------------
ScrollBy滚动的太灵敏了,我希望的是移动图片(X-px,Y-py)像素,有没有方法? 如果ScrollBy时参数乘于一个系数,系数不好计算,因为图片大小不一样。[/quote] ScrollBy没法精确地控制移动,比如移动时在图片某区域停止。
ooolinux 2019-10-18
  • 打赏
  • 举报
回复
引用 5 楼 早打大打打核战争 的回复:
只需要在鼠标移动时调用ImageViewer的ScrollBy方法
float px,py;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageViewer1MouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, float X, float Y)
{
	px=X;
	py=Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageViewer1MouseMove(TObject *Sender, TShiftState Shift,
          float X, float Y)
{
	if(Shift.Contains(ssLeft))
		ImageViewer1->ScrollBy(X-px,Y-py);
}
//---------------------------------------------------------------------------
ScrollBy滚动的太灵敏了,我希望的是移动图片(X-px,Y-py)像素,有没有方法? 如果ScrollBy时参数乘于一个系数,系数不好计算,因为图片大小不一样。
  • 打赏
  • 举报
回复
只需要在鼠标移动时调用ImageViewer的ScrollBy方法
ooolinux 2019-10-18
  • 打赏
  • 举报
回复
引用 3 楼 nikotin 的回复:
fmx控件在渲染前, 会乘以一个变换矩阵,用来实现缩放,旋转,移动等操作,对应sacle, rotate, translate等属性。所以我想在鼠标事件里,改变一下translate属性,或者直接设置这个变换矩阵,就可以实现随鼠标移动了。


感觉这样不是常规的方法。
nikotin 2019-10-17
  • 打赏
  • 举报
回复
添加鼠标拖动事件,改变控件的变换矩阵对应属性就行了吧。

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧