如何“一行代码”控制主界面的所有功能调用

原创 2002年05月09日 09:09:00
如何“一行代码”控制主界面的所有功能调用
www.lvyin.net  2002-4-22 绿荫网络


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

       在大多数软件中,都具有菜单、工具栏、按钮或树形功能选择。同样的一个功能模板,有可能在菜单中调用它,在工具栏中也调用它,或者用其它方式调用它,即存在着多次调用的问题。


       在一次有意无意的探索中,我找到了一个非常方便的功能调用方法,使用了这种方法之后几乎可以说成是“一行代码”控制主界面的所有功能调用。


       然而,如何实现呢,请听我慢慢道来。


       以我探索时所用的程序为例:所有的功能操作全部集成在主窗体里面,各模板全部以Tframe(即框架)的形式提供,功能调用即包括菜单调用,工具栏调用,也有树形功能树调用。


       实现方法:


一、首先定义好几个数组,以方便构造功能树所用:


private:    // User declarations


  TTreeNode *m_CurrentNode;         // 当前节点


  TTreeNode *mTree[MAXNODE];  // 节点指针


  int mTreeNo[MAXNODE];            // 结点ID


  int mTreePNo[MAXNODE];          // 父结点ID


  AnsiString mTreeName[MAXNODE];    // 结点名称


  TFrame *ChildFrame[MAXNODE];         // Tframe 子模块


 


二、定义一个构造功能树的函数


public:            // User declarations


  void CreateTree();


 


三、功能树的构造


void TfrmMain::CreateTree()


{


  mTreeName[0]="公司基本信息";  mTreePNo[0]=MAXNODE; 


  mTreeName[1]="部门设置";      mTreePNo[1]=0;        ChildFrame[1]=new TfraDepartment(plFrame);


  mTreeName[2]="职位设置";      mTreePNo[2]=0;        ChildFrame[2]=new TfraPosition(plFrame);


  mTreeName[3]="员工信息";      mTreePNo[3]=0;        ChildFrame[3]=new TfraEmployee(plFrame);


  mTreeName[4]="节假日设置";    mTreePNo[4]=0;        ChildFrame[4]=new TfraHoliday(plFrame);


  mTreeName[5]="排班设置";      mTreePNo[5]=0;        ChildFrame[5]=new TfraDeployClass(plFrame);


  mTreeName[6]="考勤管理";      mTreePNo[6]=MAXNODE;


  mTreeName[7]="数据导入";      mTreePNo[7]=6;        ChildFrame[7]=new TfraImportData(plFrame);


  mTreeName[8]="签卡";          mTreePNo[8]=6;        ChildFrame[8]=new TfraSingCard(plFrame);


  mTreeName[9]="请假管理";      mTreePNo[9]=6;        ChildFrame[9]=new TfraLeave(plFrame);


  mTreeName[10]="加班管理";     mTreePNo[10]=6;


  mTreeName[11]="加班申请";     mTreePNo[11]=10;      ChildFrame[11]=new TfraOverTime(plFrame);


  mTreeName[12]="加班审核";        mTreePNo[12]=10;       ChildFrame[12]=new TfraAuditingOverTime(plFrame);


  mTreeName[13]="临时换班";     mTreePNo[13]=6;       ChildFrame[13]=new TfraTempRelief(plFrame);


  mTreeName[14]="数据维护";     mTreePNo[14]=6;       ChildFrame[14]=new TfraMaintenanceDatabase(plFrame);


  mTreeName[15]="报表";         mTreePNo[15]=MAXNODE;


  mTreeName[16]="基础信息报表"; mTreePNo[16]=15;      ChildFrame[16]=new TfraBaseReport(plFrame);


  mTreeName[17]="日报表";       mTreePNo[17]=15;      ChildFrame[17]=new TfraDayReport(plFrame);


  mTreeName[18]="月报表";       mTreePNo[18]=15;      ChildFrame[18]=new TfraMonthReport(plFrame);


  mTreeName[19]="自定义报表";   mTreePNo[19]=15;      ChildFrame[19]=new TfraCustomReport(plFrame);


  mTreeName[20]="统计报表";     mTreePNo[20]=15;      ChildFrame[20]=new TfraCountReport(plFrame);


  mTreeName[21]="用户管理";     mTreePNo[21]=MAXNODE;


  mTreeName[22]="添加用户";     mTreePNo[22]=21;      ChildFrame[22]=new TfraAddAdmin(plFrame);


  mTreeName[23]="修改密码";     mTreePNo[23]=21;      ChildFrame[23]=new TfraModifyPassword(plFrame);


  mTreeName[24]="修改权限";     mTreePNo[24]=21;      ChildFrame[24]=new TfraModifyPopedom(plFrame);


 


  for (int i=0;i<MAXNODE;i++)


  {


    mTreeNo[i]=i;


    mTree[i]=tvMain->Items->AddChild((mTreePNo[i]==MAXNODE)?NULL:mTree[mTreePNo[i]],mTreeName[i]);


    mTree[i]->Data =&mTreeNo[i];


    if (ChildFrame[i]!=NULL)


    {


      ChildFrame[i]->Visible=false;


      ChildFrame[i]->Parent=plFrame;


      ChildFrame[i]->Align =alClient;


    }


  }


}


 


四、在OnCreate方法中加入以下代码


       CreateTree ();


 


五、在树形控件的OnChange方法中加入以下代码


void __fastcall TfrmMain::tvMainChange(TObject *Sender, TTreeNode *Node)


{


  // 如果实际上结点不更换,则不作任何事


  if (Node==m_CurrentNode)


    return;


 


  int flag;


  flag=*((int*)Node->Data);


  if (flag==0 ||flag==6 ||flag==15 ||flag==21 || flag==10)


    return;


  if (m_CurrentFrame!=NULL)


    m_CurrentFrame->Visible =false;


 


  m_CurrentFrame=ChildFrame[flag];


  m_CurrentFrame->Visible =true;


  m_CurrentNode=Node;


}


 


六、在主窗体中加入一个TActionList控件,并新建一系列Action方法,以功能名命令,设置好相关CaptionHintImageIndexShortCutTag;最重要的是各Action方法的Tag属性,其值一定要与其相应功能在建立功能调用树时分配的数组下标一样;双击任意一个Action方法,并加入代码:


  tvMain->Selected =mTree[((TAction*)Sender)->Tag];


这句代码是整个程序的核心!也就是这句代码控制了整个程序的模块调用。


 


七、最后,在要调用的控件属性中赋于相应的Action方法即可!

程序主界面的作用

       在桌面程序中。都会有一个主界面。从我经历的 项目来看,每个主界面都包含了大量的方法。我以前参与过的一个项目的MainForm的代码量居然有2W行。造成这个问题的原因有两个: 第一是 主界...
  • zhuliangxiong
  • zhuliangxiong
  • 2007年09月25日 11:14
  • 2138

VC 如何在线程里调用主窗口的控件。

 UINT ThreadFunc(LPVOID pParam);AfxBeginThread(ThreadFunc,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);//调用...
  • thanato
  • thanato
  • 2007年10月28日 18:52
  • 2413

launch界面

去年做了launcher相关的工作,看了很长时间.很多人都在修改launcher,但还没有详细的文档,把自己积累的东西分享出来,大家一起积累.这份源码是基于2.1的launcher2,以后版本虽有变化...
  • liwei405499
  • liwei405499
  • 2014年12月18日 22:33
  • 392

C# 子窗口修改主窗口的控件

//先将父窗口中的控件设为public ( eg: 可以直接生命成public 但最好做个属性. 例如 public TextBox FormText { get{return tex...
  • u011385799
  • u011385799
  • 2015年09月27日 12:12
  • 383

Qt事件处理(三)

Qt处理事件的第三种方式:"在QObject中注册事件过滤器",如果对象使用installEventFilter()函数注册了事件过滤器,目标对象中的所有事件将首先发给这个监视对象的eventFilt...
  • imxiangzi
  • imxiangzi
  • 2015年09月02日 12:23
  • 235

微信主界面

转载 :http://blog.csdn.net/lmj623565791/article/details/41087219 Activitypublic class Main2Activity e...
  • wqewq19
  • wqewq19
  • 2016年07月08日 09:43
  • 406

C# 在一个winform中控制另一个winform中的控件

转载请注明出处:http://blog.csdn.net/zjbpku/article/details/7515691 以前我完成这样的功能是通过get{}和set{}来完成的,结果发现其效率并...
  • zjbpku
  • zjbpku
  • 2012年04月26日 20:13
  • 8288

《hbase学习》-06-HBase界面简介

hbase的界面的配置如下 在hbase-site.xml中加入一下内容即可 hbase.master.info.port 60010 监控如:http://192.1...
  • qq_21383435
  • qq_21383435
  • 2017年11月21日 09:24
  • 121

Flex4弹出子窗口

点击新增按钮弹出新增窗口例子 父窗口: 新增按钮: 子窗口: 新建一个组件,选择基于TitleWindow 在TitleWindow标签里加上两个属性 close="P...
  • jddqwe
  • jddqwe
  • 2012年03月26日 10:12
  • 310

修改MFC主窗口界面标题和图标的方法

在VS2010下新建一个MFC的多文档应用程序,程序默认的标题是“文档名-工程名”。图标默认的是写着MFC的三个方块。但在很多软件中都不是使用的默认设置,开发者们都将标题和图标改过,以符合项目要求,而...
  • niusaifei1987
  • niusaifei1987
  • 2013年12月20日 11:50
  • 962
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何“一行代码”控制主界面的所有功能调用
举报原因:
原因补充:

(最多只允许输入30个字)