matlab 回调函数问题,在Matlab中将实际值传递给回调函数

本文介绍了如何在Matlab中利用ButtonDownFcn和ResizeFcn回调函数捕获和传递鼠标点击的位置。建议使用ApplicationData类来存储数据,避免使用全局变量或userdata字段,以确保数据安全地在不同回调间传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看起来您正在尝试存储鼠标单击位置的值,然后将这些值用作resize函数的一部分(稍后将调用它).我会做一些改变.

首先,使用另一个回调来捕获鼠标单击,而不是while循环.例如,您可以使用图形ButtonDownFcn回调来触发一个功能,该功能旨在将鼠标位置捕获到某个位置.

其次,有更好的方法来存储鼠标位置,正确的方法将取决于您的技能水平和您的程序的需要.其中一些存储数据的方法是:

>在另一个回调的参数中,就像你现在正在做的那样.这非常痛苦,但它可能有效.如果它足以满足您的需求,您可以保留它.

>大多数Matlab对象中的“userdata”字段.一些人提出了这个问题,它会很好.我不喜欢依赖于此,因为我总是担心其他一些工具也会想要使用userdata字段,而工具会覆盖数据.

>全局变量值.我不喜欢使用全局变量,出于同样的原因我不喜欢使用userdata字段.但是全局变量有时候是最好的解决方案.如果您一次只有一个数字,这可能是解决您问题的最简单,最省力的解决方案. (多个数字将推动您使用userdata解决方案作为最简单的解决方案.)

>提供一个句柄类来存储一些数据(即x和y),并将该类的副本提供给两个回调中的每一个(ButtonDownFcn和ResizeFcn).这允许两个函数传递数据,而不会污染任何其他人的命名空间.这是我最喜欢的解决这类问题的方法,所以我将在下面给它一个更详细的描述.

要执行上面的选项(4),需要一个类来存储看起来像这样的数据:

classdef ApplicationData < handle

properties (SetAccess = public, GetAccess = public)

x = [];

y = [];

end

end

请注意,由于ApplicationData扩展了句柄,因此Matlab将其视为传递引用对象,这对我们很有用.

然后,您可以创建此类的实例,并将其提供给每个回调函数.

dataPassing = ApplicationData;

set(f, 'ButtonDownFcn', @(x,y) mouseClickCapture(x,y,dataPassing));

set(f, 'ResizeFcn', @(x,y) resizeCallback2(x,y, dataPassing));

mouseClickCapture看起来像这样:

function mouseClickCapture(hAxis, ignored, dataPassingClass)

mousePositionData = get(hAxis,'CurrentPoint');

dataPassingClass.x = mousePositionData(1,1);

dataPassingClass.y = mousePositionData(1,2);

你的resizeCallback2看起来像这样:

function resizeCallback2(h, ignored, dataPassingClass)

%Do something here using

%dataPassingClass.x

%and

%dataPassingClass.y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值