一个关于TImage的超级菜鸟级问题,请大家支招。

LngDotin 2006-05-07 11:49:10
问题是:如何在BCB中,让 Timage 控件支持鼠标的滑轮事件来实现 Image 的动态放大与缩小?即鼠标放在 Image 上,拔动的滑轮让图片实现动态放大与缩小,思路或源码均可贴出。请注意:回答对的得分,灌水贴没分。
...全文
465 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
老之 2006-05-08
  • 打赏
  • 举报
回复
换作我就直接用ImageEn控件了,滚轮缩放图片的功能本来就有。
LngDotin 2006-05-08
  • 打赏
  • 举报
回复
给分附言:
meikeer(美可儿):虽然贴的源码不全,他贴的时候,CSDN老说他源码中有禁忌字眼,他把源码上传到QQ群里去了,我下载看了,基本能达到要求,是故给分,以示鼓励。
BlueDeepOcean 2006-05-08
  • 打赏
  • 举报
回复
简单的做法:在OnFormWheelDown和OnFormWheelUp中写:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheelDown(TObject *Sender,
TShiftState Shift, TPoint &MousePos, bool &Handled)
{
Image1->Left = Image1->Left - 50;
Image1->Top = Image1->Top - 50;
Image1->Width = Image1->Width + 50;
Image1->Height = Image1->Height + 50;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheelUp(TObject *Sender,
TShiftState Shift, TPoint &MousePos, bool &Handled)
{
Image1->Left = Image1->Left + 50;
Image1->Top = Image1->Top + 50;
Image1->Width = Image1->Width - 50;
Image1->Height = Image1->Height - 50;
}
//---------------------------------------------------------------------------
loujing 2006-05-07
  • 打赏
  • 举报
回复
同意楼上,如果你一定要TImage接受响应,也可以从TImage派生一个组件出来,同样加上消息映射。
meikeer 2006-05-07
  • 打赏
  • 举报
回复
//unit1.h

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
#include <jpeg.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MOUSEWHEEL,TMessage,onmousewheel)
END_MESSAGE_MAP(TForm)
__published: // IDE-managed Components
TImage *Image1;
private: // User declarations
void __fastcall onmousewheel(TMessage &Message);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};

//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
LngDotin 2006-05-07
  • 打赏
  • 举报
回复
大家请注意:TImage控件是没有 onmousewheel() 事件的。
weixing979 2006-05-07
  • 打赏
  • 举报
回复
onmousewheel 里改变image的size
daydayup234 2006-05-07
  • 打赏
  • 举报
回复
OnMouseMove里头行不
huazixls 2006-05-07
  • 打赏
  • 举报
回复
可以在鼠标事件中
改变Image的尺寸大小啊
image的size
meikeer 2006-05-07
  • 打赏
  • 举报
回复
偶认为需要手动添加onmousewheel事件
Vsun 2006-05-07
  • 打赏
  • 举报
回复
通过老蔡的指点,把我的程序改了一下,变少了一些,呵呵
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
i: Integer;
ClientMousePos: TPoint;
begin
for i := 0 to ComponentCount - 1 do //编历所有组件
begin
if Components[i].ClassName = 'TImage' then //判断是否是Image组件
begin
ClientMousePos := ScreenToClient(MousePos); //将鼠标指示转成相对位置
with TImage(Components[i]) do
begin
if ((ClientMousePos.X > Left) and (ClientMousePos.X < Width)) and
((ClientMousePos.y > Top) and (ClientMousePos.y < Height))
then
Proportional := true; //锁定纵横比
if WheelDelta = 120 then Width := Width - 1 else Width := Width + 1
end;
end;
end;
end;

但是,如果说想完美实现,这样做还是不够的,因为如果当光标被定位在了一个可以响应WM_MOUSEWHEEL消息的控件中时(如Memo等控件),WM_MOUSEWHELL消息不会下传到Form,那么这个过程就起不到作用,如果要完整完美实现的话,需要做钩子才行。
hdwong 2006-05-07
  • 打赏
  • 举报
回复
自己写一个消息处理函数,然后处理 msg.msg == WM_MOUSEWHEEL 的哦,
有没有分派阿?
Vsun 2006-05-07
  • 打赏
  • 举报
回复
BCB不会,只会Delphi ,这里就发个Delphi的方法,可以做为参考。
正常情况下,Form是可以响应WM_MOUSEWHEEL消息的,并且都提供了事件。我们只需要写代码就可以实现了。如果Form不能响应WM_MOUSEWHEEL消息,我们只需要做消息映射也可以实现。

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
i: Integer;
ObjRect: TRect;
begin
for i := 0 to ComponentCount - 1 do //遍历Form1中的所有组件
begin
if Components[i].ClassName = 'TImage' then //判断是否是 Timage组件
begin
with ObjRect do
begin
//为Image创建一个相对于全屏的区域
Left := Form1.Left + TImage(Components[i]).Left;
Top := Form1.Top + TImage(Components[i]).Top;
Right := Left + TImage(Components[i]).Width;
Bottom := Top + TImage(Components[i]).Height;
//判断鼠标是否在这个Image的区域中
if (MousePos.X > Left) and (MousePos.X < Right) then
if (MousePos.Y > Top) and (MousePos.Y < Bottom) then
//跟据上下滚动来实现放大或宿小Image对象。
case WheelDelta of
120: TImage(Components[i]).Width := TImage(Components[i]).Width - 1;
-120: TImage(Components[i]).Width := TImage(Components[i]).Width + 1;
end;
end;
end;
end;
end;
samchoy 2006-05-07
  • 打赏
  • 举报
回复
我试过了, 写Form的OnMouseWheelDown, OnMouseWheelUp事件就可以了

void __fastcall TForm1::FormMouseWheelDown(TObject *Sender,
TShiftState Shift, TPoint &MousePos, bool &Handled)
{
TPoint p = Image1->ScreenToClient(MousePos);
if (p.x >= 0 && p.x <= Image1->Width && p.y >= 0 && p.y <= Image1->Height)
{
if (Image1->Width >= 2 && Image1->Height >= 2)
{
Image1->Width -= 2;
Image1->Height -= 2;
Image1->Left += 1;
Image1->Top += 1;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheelUp(TObject *Sender,
TShiftState Shift, TPoint &MousePos, bool &Handled)
{
TPoint p = Image1->ScreenToClient(MousePos);
if (p.x >= 0 && p.x <= Image1->Width && p.y >= 0 && p.y <= Image1->Height)
{
if (Image1->Width <= Panel1->Width-2 && Image1->Height <= Panel1->Height-2)
{
Image1->Width += 2;
Image1->Height += 2;
Image1->Left -= 1;
Image1->Top -= 1;
}
}
}
//---------------------------------------------------------------------------

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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