10.7.9 鼠标拖动字对象
【例 10.7.9 -1 】本程序有两个功能:把当前图形窗中已存在的任何字对象拖放到所需的位置;向当前图形窗输入字对象,并拖放到任何所需位置。
(1)编写以下程序
[textzzy.m]
function textzzy(arg)
% textzzy.m 向当前图形窗输入“字对象”,并用鼠标移放到需要的地方
% arg 任何合法的“字符串”,或“字符串元胞数组”,或数值
% 调用格式 textzzy(S_C) 输入串、串元胞 S_C ,并可用鼠标拖动
% 调用格式 textzzy 可移动当前图形窗中已有的任何字对象
if ~nargin;arg=0; end
if ischar(arg)iscell(arg) % 以下指令向图形窗输入串或串元胞
PT.Units= 'normalized' ;
PT.Position=[0.01 0.01]; % 字符串进入图形窗的初始位置
PT.String=arg;
PT.HorizontalAlignment= 'left' ; % 字符串的水平定位方式
PT.VerticalAlignment= 'baseline' ; % 字符串的垂直定位方式
ht=text(PT); % 采用构架设置字对象属性,创建对象。
textzzy(0) % 递归调用 textzzy.m
elseif arg==0 % 为鼠标操作准备条件
hf=get(0, 'CurrentFigure' ); % 获取当前图形窗的句柄
if isempty(hf)
error( ' 图形窗不存在。 ' )
end
PF1.BackingStore= 'off' ; % 为加快拖动速度,释放屏幕象素缓冲器。
PF1.WindowButtonDownFcn= 'textzzy(1)' ; % 等待鼠标按下左键,递归运行 textzzy(1)
set(hf,PF1) % 采用构架设置图对象属性
figure(hf) % 把当前图形窗调到前台
elseif arg==1 & strcmp(get(gco, 'Type' ), 'text' ) % 选定字对象
PO1.Units= 'data' ; % 在此设置下,字对象框的左下顶点确定位置
PO1.Erasemode= 'xor' ; % 设置旧对象的擦除模式
PO1.HorizontalAlignment= 'left' ;PO1.VerticalAlignment= 'baseline' ;
set(gco,PO1) % 采用构架设置选定对象的属性
PF2.Pointer= 'fleur' ; % 设置移动光标的形状
PF2.WindowButtonMotionFcn= 'textzzy(2)' ; % 移动鼠标时,递归运行 textzzy(2)