10.7.9 鼠标拖动字对象
【例 10.7.9 -1 】本程序有两个功能:把当前图形窗中已存在的任何字对象拖放到
所需的位置;向当前图形窗输入字对象,并拖放到任何所需位置。
(1)编写以下程 序
[textzz y.m]
fun ction textzzy(arg)
% textzzy.m 向当前图形窗输 入“字对象”,并用鼠标移放到需要的地方
% arg 任何合法的“字符串”,或 “字符串元胞数组”,或数值
% 调用格式 textzzy(S_C) 输入串、 串元胞 S_C ,并可用鼠标拖动
% 调用格式 textzzy 可移动当前图 形窗中已有的任何字对象
if ~nargin;
arg=0;
end
if ischar(ar g)|iscell(arg) % 以下指令向图形窗输入串或串 元胞
PT.Un its= 'normalized' ;
PT.Position=[0.01 0.01];
% 字符串进入图形窗的初始位置
PT.String=arg;
PT.Horiz ontalAlignment= 'left' ;
% 字符串 的水平定位方式
PT.VerticalAlignment= 'baselin e' ;
% 字符串的垂直定位方式
ht=text(PT);
% 采用构架设 置字对象属性,创建对象。
textzzy(0) % 递归调用 textzzy .m
elsei f arg==0 % 为鼠标操作准备条件
hf=get(0, 'Curren tFigure' );
% 获取当前图形窗的句柄
if isempty(hf )
error( ' 图形窗不存在。 ' )
end
< br>PF1.BackingStore= 'off' ;
% 为加快拖动速度,释放屏幕象素缓冲器。
PF1.WindowButtonDo wnFcn= 'textzzy(1)' ;
% 等待鼠标按下 左键,递归运行 textzzy(1)
set(hf,PF1) % 采用构架设 置图对象属性
f igure(hf) % 把当前图形窗调到前台
elseif arg==1 & amp;
strcmp(get(gco, 'Type' ), 'text' ) % 选定字对象
PO1.Units= 'data' ;
% 在此设置下,字对象框的左下顶点确定位置
PO1.EraseMode= ' xor' ;
% 设置旧对象的擦除模式
PO1.HorizontalAlig nment= 'left' ;
PO1.VerticalAli gnment= 'baseline' ;
set(gco,PO1) % 采用 构架设置选定对象的属性
PF2.Pointer= 'fleur' ;
% 设 置移动光标的形状
PF2.WindowButtonMotionFcn= 't extzzy(2)' ;
% 移动鼠标时,递归运行 text zzy(2)
P F2.WindowButtonUpFcn= 'textzzy (999)' ;
% 松开鼠标,递归运行 textzzy(9 99)
set( gcf,PF2) % 采用构架对图形窗属性再设置
elseif arg==2 % 拖动字对象
curpoi=get(gca, 'CurrentPoint ' );
% 获得鼠标所在新位置的坐标
set(gco, 'Position ' ,curpoi(1,1:3)) % 使所选对象定位在新坐 标处
elsei f arg==999 % 松开鼠标便属性重置为原缺省状态 <
br>
set(gco, 'EraseMode' , 'normal' )
PF3.WindowBut tonDownFcn= '' ;
% 恢复设置为缺省值,即空 串
PF3.Wi ndowButtonMotionFcn= '' ;
PF3.WindowBu ttonUpFcn= '' ;
PF3.Pointer= 'arrow' ;
% 光标恢复成箭头
< br>PF3.Units= 'pixels' ;
PF3.BackingSt ore= 'on' ;
% 重新起用象素缓冲器
set(gcf,PF3) % 把图形窗设置为缺省状态
else % 假如鼠标选择的不是“字对象”,恢复缺 省设置
PF4. WindowButtonDownFcn= '' ;
PF4.WindowBu ttonMotionFcn= '' ;
PF4.WindowButtonUp Fcn= '' ;
PF4.Pointer= 'arrow' ;
PF4.Units= 'p ixels' ;
PF4.BackingStore= 'on' ;
set(gcf,PF4)
end
< br>