查看: 10310|回复: 15|关注: 0

[已答复] 实现GUI界面treeview 树状菜单上节点的点击事件

[复制链接]

新手

5 麦片

财富积分


050


1

主题

2

帖子

0

最佳答案
  • 关注者: 1
发表于 2013-4-17 15:14:46 | 显示全部楼层 |阅读模式
              我使用treeview控件在GUI界面上写了一个树状菜单~~怎样实现点击不同的节点实现不同的事件~~求各位帮忙解答下
效果图如下:代码见附件
QQ截图20130417150615.jpg

newgaoshi_gui.fig

2.4 KB, 下载次数: 19686

界面设计

newgaoshi_gui.m

5.53 KB, 下载次数: 19501

回调函数

新手

11 麦片

财富积分


050


0

主题

5

帖子

0

最佳答案
  • 关注者: 1
发表于 2013-5-7 23:46:18 | 显示全部楼层
你好,以下是我博客中的一篇文章《matlab函数句柄、GUI第三方控件treeview、Tabs和子图 》中的部分内容,由于我还没有权限发表链接,贴了出来。希望能帮到你。
function treeview_test()
global mc hf;
hf=figure('Position',[300,300,500,300],'Name','treeview例子',...
'Color',[0.925,0.914,0.847],'MenuBar','none','NumberTitle','off');

%在主界面上建右键弹出菜单,便于在树中调用及显示
mc=uicontextmenu('Parent',hf);%右键菜单
mu1=uimenu(mc,'label','菜单1');
mu2=uimenu(mc,'label','菜单2');
mu3=uimenu(mc,'label','菜单3');
set(hf,'uicontextmenu',mc);

pos=[10 20 150 260];
h_tv=actxcontrol('MSComctlLib.TreeCtrl.2',pos,hf);
h_tv.Style = 6;
h_tv.LineStyle = 1;
h_tv.HideSelection = 0;
h_tv.Indentation = 500;
h_tv.FullRowSelect = 1;
h_tv.SingleSel = 1;

h_nodes=h_tv.Nodes;
h_node=h_nodes.Add;
h_node.Text='中国';
h_node.Key='R1';
h_node.Expanded=true;
%R1父节点的Key,4-子节点,R1C1本子节点的Key,最后一个为名称
h_node(1)=h_nodes.Add('R1',4,'R1C1','广东');
h_node(2)=h_nodes.Add('R1C1',4,'R1C1C1','广州');
h_node(3)=h_nodes.Add('R1C1',4,'R1C1C2','深圳');
h_node(4)=h_nodes.Add('R1C1',4,'R1C1C3','东莞');

registerevent(h_tv,@nodeclick_event);

%在主界面上设置ButtonDownFcn和ButtonUpFcn函数,以便在其他地方右键时,消掉右键弹出菜单
set(hf,'WindowButtonDownFcn',@WINButttonDownFcn);
set(hf,'WindowButtonUpFcn',@WINButttonDownFcn);
Tabs();
subpig();
end



function nodeclick_event(varargin)  
global mc hf;
       if ~isempty(mc)&&~ishandle(mc)
           mc=uicontextmenu('Parent',hf);%右键菜单
           mu1=uimenu(mc,'label','菜单1');
           mu2=uimenu(mc,'label','菜单2');
           mu3=uimenu(mc,'label','菜单3');
           set(hf,'uicontextmenu',mc);
       end

     ev=varargin{end};
     para=varargin{end-1};
     switch ev
     %节点单击响应事件,点击对应的节点,输出节点的内容
     case 'NodeClick'
             nd=para.Node;
             nd.Expanded = 1;
             nd.Checked = 1;
             disp(nd.text)
            
      %右键弹出菜单响应      
     case 'MouseDown'
        a=varargin{end-1};
        b = a.Button;%=1为左键,2为右键
        htvX=a.x;    % 点击的X坐标
        htvY=a.y;    % 点击的Y坐标
        if b==2
            if ~isempty(mc)&&ishandle(mc)
              set(mc,'Position',[htvX+10 300-htvY-20])
              set(mc,'Visible','on')
            end
        end
    otherwise
     %do nothing
     end
end

function WINButttonDownFcn(src,event)
global mc

%用户在界面的其他地方右键时,消掉右键菜单
if ~isempty(mc)&&ishandle(mc)
       delete(mc)
end

end



新手

19 麦片

财富积分


050


4

主题

43

帖子

1

最佳答案
发表于 2013-7-12 15:12:53 | 显示全部楼层
本帖最后由 yes1man 于 2013-7-12 16:22 编辑

这个不错,终于找到例子了。。。谢谢。。。可是怎么在父节点“中国”下面增加另一个父节点“美国”呢???

新手

11 麦片

财富积分


050


0

主题

5

帖子

0

最佳答案
  • 关注者: 1
发表于 2013-10-19 16:37:45 | 显示全部楼层
有好一段时间没有上来了,没有及时回复,见谅了。
修改了一下,原来的Tabs()和subpig()这两个函数没有贴上来,删掉他们了。
同时,树节点是可以通过函数动态生成的,已经做了修改,赋上完整的程序,直接运行treeview_test()该函数即可。

function treeview_test()
global mc hf;
hf=figure('Position',[300,300,500,300],'Name','treeview例子',...
'Color',[0.925,0.914,0.847],'MenuBar','none','NumberTitle','off');

%在主界面上建右键弹出菜单,便于在树中调用及显示
mc=uicontextmenu('Parent',hf);%右键菜单
mu1=uimenu(mc,'label','菜单1');
mu2=uimenu(mc,'label','菜单2');
mu3=uimenu(mc,'label','菜单3');
set(hf,'uicontextmenu',mc);

pos=[10 20 150 260];
h_tv=actxcontrol('MSComctlLib.TreeCtrl.2',pos,hf);
h_tv.Style = 6;
h_tv.LineStyle = 1;
h_tv.HideSelection = 0;
h_tv.Indentation = 500;
h_tv.FullRowSelect = 1;
h_tv.SingleSel = 1;

%% 修改的地方
% 树节点数据
treedata={'CHN','中国','C1','广州';'CHN','中国','C2','深圳';...
         'CHN','中国','C3','东莞';'USA','美国','U1','加州';...
         'USA', '美国','U2','纽约'};

% 动态生成树,只考虑两层的一个通用函数,也可以考虑更多的层数
Addtree(h_tv,treedata);
%%

registerevent(h_tv,@nodeclick_event);

%在主界面上设置ButtonDownFcn和ButtonUpFcn函数,以便在其他地方右键时,消掉右键弹出菜单
set(hf,'WindowButtonDownFcn',@WINButttonDownFcn);
set(hf,'WindowButtonUpFcn',@WINButttonDownFcn);

end



function nodeclick_event(varargin)  
global mc hf;
       if ~isempty(mc)&&~ishandle(mc)
           mc=uicontextmenu('Parent',hf);%右键菜单
           mu1=uimenu(mc,'label','菜单1');
           mu2=uimenu(mc,'label','菜单2');
           mu3=uimenu(mc,'label','菜单3');
           set(hf,'uicontextmenu',mc);
       end

     ev=varargin{end};
     para=varargin{end-1};
     switch ev
     %节点单击响应事件,点击对应的节点,输出节点的内容
     case 'NodeClick'
             nd=para.Node;
             nd.Expanded = 1;
             nd.Checked = 1;
             disp(nd.text)
            
      %右键弹出菜单响应      
     case 'MouseDown'
        a=varargin{end-1};
        b = a.Button;%=1为左键,2为右键
        htvX=a.x;    % 点击的X坐标
        htvY=a.y;    % 点击的Y坐标
        if b==2
            if ~isempty(mc)&&ishandle(mc)
              set(mc,'Position',[htvX+10 300-htvY-20])
              set(mc,'Visible','on')
            end
        end
    otherwise
     %do nothing
     end
end

function WINButttonDownFcn(src,event)
global mc

%用户在界面的其他地方右键时,消掉右键菜单
if ~isempty(mc)&&ishandle(mc)
       delete(mc)
end

end

function  Addtree(h_tv,treedata)
%% 根据模型树数据,添加树节点

%清空树的节点
h_tv.Nodes.Clear;
h_nodes=h_tv.Nodes;

p0='';
p1='';

if isempty(treedata)
    return
end

%%  第一层
for k=1:length(treedata(:,1))   
   
    if length(treedata(1,:))<2
        return
    end
   
    if k==1
        if ~isempty(treedata{1,1})&&~isempty(treedata{1,2})
            h_node=h_nodes.Add;
            h_node.Text=treedata{1,2};
            h_node.Key=treedata{1,1};
            h_node.Expanded=true;
            p0=treedata{1,1};
        end
    end
   
    if k>=2
         if ~isempty(treedata{k,1})&&~isempty(treedata{k,2})
             if strcmp(treedata{k,1},p0)
                 continue
             end
            h_node=h_nodes.Add;
            h_node.Text=treedata{k,2};
            h_node.Key=treedata{k,1};
            h_node.Expanded=true;
            p0=treedata{k,1};
         end
    end
end


%%  第二层
for k=1:length(treedata(:,1))   
   
    if length(treedata(1,:))<4
        return
    end
   
    if k==1
        if ~isempty(treedata{1,3})&&~isempty(treedata{1,4})
              if ~isempty(treedata{1,1})
                   h_nodes.Add(treedata{1,1},4,treedata{1,3},treedata{1,4});
                   p1=treedata{1,3};
              end
        end
    end
   
    if k>=2
         if ~isempty(treedata{k,3})&&~isempty(treedata{k,4})
             if strcmp(treedata{k,3},p1)
                 continue
             end
             if ~isempty(treedata{k,1})
                  h_nodes.Add(treedata{k,1},4,treedata{k,3},treedata{k,4});
                  p1=treedata{k,3};
             end
         end
    end
end
end

新手

8 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 2013-12-26 10:36:26 | 显示全部楼层
您好,为什么我在matlab上运行您给的代码,总是报错activex1找不到呢,是因为64位win7系统么?我装的2013a

新手

5 麦片

财富积分


050


0

主题

4

帖子

0

最佳答案
  • 关注者: 2
发表于 2016-1-16 20:04:13 | 显示全部楼层
hengqiu 发表于 2013-10-19 16:37
有好一段时间没有上来了,没有及时回复,见谅了。
修改了一下,原来的Tabs()和subpig()这两个函数没有贴上 ...

太好了,终于解决了我的问题。万分感谢

新手

5 麦片

财富积分


050


0

主题

4

帖子

0

最佳答案
  • 关注者: 2
发表于 2016-1-16 20:06:00 | 显示全部楼层
hengqiu 发表于 2013-10-19 16:37
有好一段时间没有上来了,没有及时回复,见谅了。
修改了一下,原来的Tabs()和subpig()这两个函数没有贴上 ...

万分感谢

新手

45 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
发表于 2016-4-12 20:38:17 | 显示全部楼层
楼主,求改好后的文件!!谢谢

新手

10 麦片

财富积分


050


0

主题

6

帖子

0

最佳答案
发表于 2016-8-29 10:24:50 | 显示全部楼层
楼主你好!如何实现右键点击不同的节点,弹出不同的contextmenu,即每个节点对应的菜单不同

新手

5 麦片

财富积分


050


1

主题

13

帖子

0

最佳答案
  • 关注者: 1
发表于 2016-10-9 11:10:38 | 显示全部楼层
请问下treeview不是ActiveX里面的这个ctreeview吧?我把你的代码复制到我这matlab里function报错,请问下如何实现,多谢啦
BPCF]CS{A)7C_]BX@~_3KED.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表