- 积分
- 86
- 注册时间
- 2004-12-22
- 仿真币
-
- 最后登录
- 1970-1-1
|
这些天试了不少activex控件,不过很多属性不懂,能很好用的不多,前些天写了个electirc clock,觉得利用现成的activex控件确实可以大大丰富界面元素,得到意想不到的效果.对于Grid显示方面的控件,觉得还是MSFlexGrid属性最丰富,最易控制,于是集中精力,实现了MSFlexGrid控件从键盘输入数据,调试结果基本满足要求:
通过编写MSFlexGrid控件的event handler函数,完成了键盘数据输入功能,并实现了最简单的编辑功能,双击输入,单击或回车确认,双击后未输入字符时原字符仍然保存,可用BackSpace删除.
代码(直接保存为m文件运行):
function h=MSFGrid
%function h=MSFGrid
%MSFlexGrid输入数据或字符,双击输入,单击或回车确认,双击后未输入字符则原字符保存,支持BackSpace删除
% by nostalgica;email:nostalgica@163.com
ID='MSFlexGridLib.MSFlexGrid';
fi=figure('NumberTitle','off','toolbar','none','menubar','none','Name','Test Activex','pos',[159 150 550 250],'visible','off');
h = actxcontrol(ID,[0 0 550,250],fi,@gridhandler);
set(h,'rows',16,'cols',9);
for i=1:get(h,'rows')-1%固定栏标题
set(h,'row',i,'col',0,'text',num2str(i));
end
for i=1:get(h,'cols')-1
set(h,'row',0,'col',i,'text',num2str(i));
end
set(h,'format','No.');%标题
%========找一个数据交换的地方=========
atxdata{1}=get(h,'text');
atxdata{2}=[get(h,'row') get(h,'col')];
uicontrol(fi,'style','text','tag','datacontainer','visible','off','userdata',atxdata);%存放临时数据
=====================================
set(fi,'visible','on');
function gridhandler(varargin)
%varargin{1}:object (com,progid)
%varargin{2}:event id
%varargin{3}:event args
%varargin{4}:event name
switch varargin{2}
%-----------------------------------
case -600, %single click
[h,prow,pcol,ptext,datacontainer,atxdata]=dataprepare(varargin);
row=get(h,'row');col=get(h,'col');
rowsel=get(h,'rowsel');colsel=get(h,'colsel');%rowsel,colsel与row,col构成一矩形区为选定区
set(h,'row',prow,'col',pcol);
if length(ptext)~=0
if ptext(end)=='|'
if length(ptext)==1
atxdata{1}=atxdata{3};
else
atxdata{1}=ptext(1:end-1);
end
set(h,'text',atxdata{1});
end
end
set(h,'row',row,'col',col,'rowsel',rowsel,'colsel',colsel);
atxdata{2}=[row col];
set(datacontainer,'userdata',atxdata);
%-----------------------------------
case -601,%Dbclick
[h,prow,pcol,ptext,datacontainer,atxdata]=dataprepare(varargin);
atxdata{3}=get(h,'text');
atxdata{1}='|';
set(h,'text',atxdata{1});
set(datacontainer,'userdata',atxdata);
%-----------------------------------
%case -602, %keypress
%-----------------------------------
case -603, %charpress
[h,prow,pcol,ptext,datacontainer,atxdata]=dataprepare(varargin);
text=get(h,'text');
newchar=char(varargin{3});
if strcmp(newchar,char(13))==1%回车
if length(text)==1
set(h,'text','');
atxdata{1}=[];
set(datacontainer,'userdata',atxdata);
else
set(h,'text',text(1:end-1));
end
return
end
if strcmp(newchar,char(8))==1%Back Space
if length(text)>1
atxdata{1}=[text(1:end-2),'|'];
set(h,'text',atxdata{1});
end
set(datacontainer,'userdata',atxdata);
return
end
if length(text)~=0
if text(end)=='|'
if length(text)==1
atxdata{1}=[newchar,'|'];
else
atxdata{1}=[text(1:end-1),newchar,'|'];
end
set(h,'text',atxdata{1});
set(datacontainer,'userdata',atxdata);
end
end
%-----------------------------------
%case -604, %keypress
%-----------------------------------
%case -605, %mouse down
%-----------------------------------
%case -606, %mouse move
%-----------------------------------
%case -607, %mouse up
%-----------------------------------
end
function [h,prow,pcol,ptext,datacontainer,atxdata]=dataprepare(event)
datacontainer=findobj('style','text','tag','datacontainer');
datacontainer=datacontainer(end);
atxdata=get(datacontainer,'userdata');
h=event{1};
prow=atxdata{2}(1);
pcol=atxdata{2}(2);
ptext=atxdata{1};
[ 本帖最后由 nostalgica 于 2006-9-2 14:48 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
评分
-
1
查看全部评分
-
|