订阅所有文章
文章搜索

高级搜索这是社么?这是顶尖最新推出的文章增强型搜索功能!
全网 本站
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> VC >> 文章正文

演练VC中的COMMON一族(转贴)之一

作者:happypar…  来源:CSDN  点击  更新:2006-12-19 7:06:00  编辑: 画王w  字体

xt=PM[i][j];
   TCItem.item.lParam=(i+1)*10+(j+1);//子项序号
   m_TreeCtrl.InsertItem(&TCItem);
  }
     m_TreeCtrl.Expand(hCur,TVE_EXPAND);//展开树
    }
    m_TreeCtrl.Expand(hRoot,TVE_EXPAND);//展开上一级树
    return TRUE;  // return TRUE  unless you set the focus to a control
    }
    (3)增加树项功能的实现
    在增加树项功能时,除了需要定义和设置插入树项的数据结构之外,还需要注意的是新增树项的名称初始时均为“新增数据”,增加后允许用户给数据项设置自定义名称。在编程时应特别注意m_TreeCtrl.EditLabel(hInsert);后面不能跟任何其它程序命令,否则这条编辑指令无效。
    void CVCTREEDlg::OnAdd()
    { file://增加子项功能函数
    HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选择项句柄
    if(hSel==NULL) return;//无任何选项则返回
    static int nAddNo=100;//编号大于100为新增数据
    TV_INSERTSTRUCT TCItem;//定义插入项数据结构
    TCItem.hParent=hSel;   file://设置父项句柄
    TCItem.hInsertAfter=TVI_LAST;//在最后增加
    TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
    TCItem.item.pszText="新增数据";
    TCItem.item.lParam=nAddNo++;//索引号增加
    TCItem.item.iImage=0;//正常图标
    TCItem.item.iSelectedImage=1;//选中时图标
    HTREEITEM hInsert=m_TreeCtrl.InsertItem(&TCItem);//增加
    m_TreeCtrl.Expand(hSel,TVE_EXPAND);
    m_TreeCtrl.EditLabel(hInsert);//修改增加的数据
    }
    (4)删除树项功能的实现
    在实现删除功能时,应对存在子项的树项进行提示,以警告用户是否连同其子项一起删除。
    void CVCTREEDlg::OnDel()
    { file://删除子项功能函数
      HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
     if(hSel==NULL) return;//无任何选项则返回
     if(m_TreeCtrl.ItemHasChildren(hSel))//判断是否有子项
       if(MessageBox("厂家下存在品名,一同删除?","警告",MB_YESNO)==IDNO) return;
   m_TreeCtrl.DeleteItem(hSel);
    }
    (5)排序功能的实现
    排序功能是对所选中的树项的所有子项按字符中顺序进行排序,如果想要按照其它规则进行排序,应利用SortChildrenItemBC()函数进行自行开发排序程序,这个自行开发的函数与列表控制中实现的函数基本相同,可兴趣的读可以试验。
    void CVCTREEDlg::OnSort()
    { file://排序子项功能函数
    HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
    if(hSel==NULL) return;//无任何选项则返回
    m_TreeCtrl.SortChildren(hSel);
    }
    (6)查看功能的实现
    查看功能用来查看选中树项的有关信息,函数中中显示了树项的文本名称和标识号,可以将这两个信息作为查找关键字,来查看其它更详细的信息。
    void CVCTREEDlg::OnView()
    { file://查看选中项功能函数
    HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
    if(hSel==NULL) return;//无任何选项则返回
    CString cText=m_TreeCtrl.GetItemText(hSel);//取得数据项名
    LONG IDs=m_TreeCtrl.GetItemData(hSel);//取得数据项序号
    char temp[100];
    wsprintf(temp,"厂家:%s 编号:%05d",cText,IDs);
    MessageBox(temp,"选择信息");
    }
    (7)修改功能的实现
    如果不进行其它处理,当修改树项的文本名称后,就会发现其未被修改,这是因为程序中没有对修改结果进行保存处理,这就要利用TV_DISPINFO结构和SetItemText函数对TVN_ENDLABELEDIT进行处理,这样就可以正确地实现修改功能。
    void CVCTREEDlg::OnEndlabeleditTree(NMHDR* pNMHDR, LRESULT* pResult)
    { TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
  // TODO: Add your control notification handler code here
      if(pTVDispInfo->item.pszText==0) return;//用户取消修改操作
     m_TreeCtrl.SetItemText(pTVDispInfo->item.hItem,
  pTVDispInfo->item.pszText);//设置新数据
  *pResult = 0;
    }
7、树视的演练技巧
树视的应用技巧在使用树视时,其方法与树控制基本相同,只不过树视是在窗口中来实现的而树控制是在对话框中实现,树视的各种功能是通过菜单来实现的而树控制是通过按钮等方式来实现的,树控制需要在对话框中创建树控制控件而树视直接占据整个窗口,在设计过程中只要将按钮和树控制设计过程变为菜单设计,并注意在功能函数是在类向导中是通过菜单命令来操作,同时在每个功能函数前面增加取得列表视引用的命令(CTreeCtrl& TreeCtrl = GetTreeCtrl()),而其余数据结构和代码均不需要修改,实现起来比较容易。笔者实现的树控制和视程序的运行结果如下:
                    树控制的演练示例结果
              树视演练结果示例
第5章 演练CTab
5.1 标5.2 签控制的主要功能
    标签控制(Tab Control)是用来在一个窗口如对话框等中的同一用户区域控制多组显示信息或控制信息,由顶部的一组标签来控制不同的信息提示,标签即可以是文本说明也可以是一个代表文本含义的图标,或是两者的组合。针对不同的选择标签,都会有一组提示信息或控制信息与之相对应,供用户进行交互操作,这在WINDOWS98的属性表中最常见。另外还存在一种特殊风格的标签,即TBS_BUTTONS风格的标签,这种标签外观类似按钮,通过鼠标点击改变状态,一般用来执行一些功能而不是用来显示或控制信息。
    提到标签,最快想到的应该是属性表对话(Property Sheet),这两者的配合应用更是随处可见。属性表对话框有时也称为多页对话框(Multiple-Page Dialog)或是标签对话框(Table Dialog),最多可设置24个属性页(Property Page),通过顶部的标签来选择不同的属性页。另外还有一种特殊的属性表对话框,就象VC++5.0中的类向导AppWizard一样,其不存在供用户选择的标签,而是按照顺序依次控制属性页的显示,并且还有一般属性页中不存在的“确认”、“上一步”、“下一步”、“完成”和“帮助”等按钮。
    标签控制在MFC中只存在一种封装形式,即控制类CtabCtrl。在使用标签时即可以在对话框中直接添加,也可以在窗口中作为子窗口来使用,只不过这样应用时需要选创建标签。
5.3 标5.4 签控制的对象结构
5.4.1 标5.4.2 签控制的建立方法
    CTabCtrl&tabCtrl     建立标签控制对象结构
    Create                建立标签控制并绑定对象
    标签控制CTabCtrl::Create的调用格式如下:
    BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
    其中参数dwStyle用来确定标签控制的风格;rect用来控制标签的大小和位置;pParentWnd用来确定标签控制的父窗口句柄;nID用来确定标签控制的标识符。
标签控制的风格可以是如下值的组合:
    TCS_BUTTONS            表示将标签外观定义成类似按钮
    TCS_FIXEDWIDTH         使所有标签具有相同的宽度
    TCS_FOCUSNEVER         使特定标签永远不接收输入焦点
    TCS_FOCUSONBUTTONDOWN  当标签被鼠标点击时接收输入焦点,其仅与TCS_BUTTONS合用
    TCS_FORCEICONLEFT      强制图标在左面,剩余部分使标签居中
    TCS_FORCELABELLEFT     使图标和标签均左对齐
    TCS_MULTILINE          允许标签控制显示多行标签
    TCS_OWNERDRAWFIXED     允许父窗口自绘标签
    TCS_RIGHTJUSTIFY       使标签右对齐
    TCS_SHAREIMAGELISTS    当控制被撤消时标签控制的图像不被撤消
    TCS_TOOLTIPS           允许标签控制存在工具提示控制
    TCS_TABS               标签正常显示,为默认状态
    TCS_SINGLELINE         将标签只显示在一行上,默认状态
    TCS_RAGGEDRIGHT        不使标签自动填满控制区域,默认状态
    同样,标签控制还可以使用窗口的一些控制风格:
    WS_CHILD               为标签控制创建子窗口,只能与WS_POPUP风格一起使用
    WS_VISIBLE             建立一个初始可视的标签控制
    WS_DISABLED            建立一个初始不可视的标签控制
    WS_GROUP               建立标签控制群组的第一个控制
    WS_TABSTOP             建立可用TAB键移动的标签控制
5.4.3 标5.4.4 签控制的属性类
    标签控制的属性类包括取得与标签控制相关联的图像列表GetImageList、设置标签控制的图像列表SetImageList、取得标签控制中标签的总数GetItemCount、取得标签控制中特定标答的相关信息GetItem、设置标签的部分或全部属性SetItem、检测当前被选中的标签GetCurSel、将一个标签设置为选中状态SetCurSel和取得具有当前输入焦点的标签SetCurSel等。
5.4.5 标5.4.6 签控制的操作方法
    标签控制的操作方法包括在标签控制中插入一个标签InsertItem、删除一个标签      DeleteItem、从标签控制中删除所有项目DeleteAllItems、从标签控制中删除一个图像列表RemoveImage和绘制标签控制中的特定一项DrawItem等。
5.5 标5.6 签控制的数据结构
    在使用标签控制时,必须使用的函数就是在标签控制中插入标签。函数InsertItem的原形如下:
    BOOL  InsertItem(int nItem,TC_ITEM * pTabCtrlItem);
    该函数中的TC_ITEM为添加标签时所使用信息的数据结构,其数据成员的定义方法及含义如下:
    typedef struct _TC_ITEM {
    UINT mask;         // 确定结构成员的屏蔽或设置位
    UINT lpReserved1;  // 保留未用
    UINT lpReserved2;  // 保留未用
    LPSTR pszText;     // 标签名称字符串
    int cchTextMax;    // 标签名称字符串缓冲区大小
    int iImage;        // 标签控制的图像索引号
    LPARAM lParam;     // 应用程序定义的相关32位数据
    } TC_ITEM;
    当鼠标点击标签控制中的标签时,标签控制就会向其父窗口发送相关的通知消息,通过处理这些通知消息,程序可以实现各种功能。
5.7 属性表和属性页的基本用法
    在标签控制过程中,属性表对话框和属性页是必不可少的。在MFC类库中,属性表对话框类CpropertySheet是由CWnd类派生而来的,而属性页类CpropertyPage是由Cdialog类派生而来的,它们的用法基本相同:
    1、创建所有的属性页。创建属性页的方法与创建一般对话框资源的方法一样,利用对话框编辑器可以为每个属性页创建一个对话框模板,其区别在于,当利用类向导ClassWizard为属性页生成类时应选择属性页类CpropertyPage作为基类,而不是将一般的对话框类Cdialog作为基类;
    2、创建属性表对话框,并将事先创建好的各属性页添加进去,两者的创建顺序可以互换,但在创建完之后将属性页添加到属性表对话框中去这一步是必须要做的;
    3、显示属性表对话框。虽然属性表对话框类CpropertySheet不是由对话框类Cdialog派生而来的,但两者的操作非常类似,调用DoModal()函数就会显示一个模态属性表对话框,而调用Create()操作就会显示一个非模态的属性表对话框;
    4、对数据交换的处理。和对话框类似,属性表对话框与对象之间的数据交换也是通过数据成员2来实现的,只是属性表本身不带数据成员,而实际进行数据交换的是属性页中的数据成员;
    5、对向导对话框的处理。如果要显示一个向导对话框,在显示之前应首先调用SetWizardMode()函数对向导对话框进行特殊处理,对于存在按钮的向导对话框,还应调用SetWizardButtons()来对向导对话框的按钮功能进行定制,在用户操作结束时还应调用SetFinis

上一页  [1] [2] [3] [4] [5] [6] 下一页

  • 上一篇文章:

  • 下一篇文章:
  •      
    热门文章  
    推荐文章  
    相关文章    
     发表评论
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备05002835号