http://www.jizhuomi.com/software/207.html

标签控件的创建

MFC为标签控件的操作提供了CTabCtrl类。

与之前的控件类似,创建标签控件可以在对话框模板中直接拖入Tab Control,也可以使用CTabCtrl类的Create成员函数创建。Create函数的原型如下:

virtual BOOL Create(
  DWORD dwStyle,
  const RECT& rect,
  CWnd* pParentWnd,
  UINT nID 
);

参数dwStyle为标签控件的风格,rect为标签控件的位置和大小,pParentWnd为指向标签控件父窗口的指针,nID指定标签控件的ID。这里还是要具体说下dwStyle,下面列出了几种主要的控件风格:

TCS_BUTTONS:标签(控件上部用来选择标签页的位置)外观为按钮风格,且整个控件周围没有边框。

TCS_FIXEDWIDTH :所有标签具有相同的宽度。

TCS_MULTILINE:标签以多行显示,如果需要,可以显示所有标签。

TCS_SINGLELINE:只显示一行标签,用户可以滚动着看其他标签。

TCS_TABS:标签以普通标签样式显示,且整个控件周围有边框。

如果想了解标签控件的所有风格,可以查阅MSDN。

CTabCtrl类的主要成员函数

int GetCurSel( ) const;

获取标签控件中当前选择标签的索引。如果成功则返回选择标签的索引,否则返回-1。

BOOL GetItem(int nItem,TCITEM* pTabCtrlItem) const;

获取标签控件中某个标签的信息。参数nItem为标签索引,pTabCtrlItem为指向TCITEM结构体的指针,用来接收标签信息。若获取成功返回TRUE,否则返回FALSE。

int GetItemCount( ) const;

获取标签控件中标签的数量。

int SetCurSel(int nItem);

在标签控件中选择某标签。参数nItem为要选择的标签的索引。如果成功则返回之前选择标签的索引,否则返回-1。

BOOL SetItem(int nItem,TCITEM* pTabCtrlItem);

设置某标签的所有或部分属性。参数nItem为标签的索引,pTabCtrlItem为指向TCITEM结构体的指针,包含了新的标签属性。成功则返回TRUE,否则返回FALSE。

BOOL DeleteAllItems( );

删除标签控件中所有标签。

BOOL DeleteItem(int nItem);

删除标签控件中的某个标签。参数nItem为要删除标签的索引。

LONG InsertItem(int nItem,LPCTSTR lpszItem);

在标签控件中插入新的标签。参数nItem为新标签的索引,lpszItem为标签文本字符串。如果插入成功则返回新标签的索引,否则返回-1。

标签控件的应用实例

最后鸡啄米依然是给大家写一个简单的实例,说明CTabCtrl类的几个成员函数及标签控件通知消息等的使用方法。

此实例实现的功能:在一个标签控件中加入两个标签页,标签文本分别为“鸡啄米”和“Android开发网”,点击不同的标签显示不同的标签页。下面是具体实现步骤:

1. 创建一个基于对话框的MFC工程,名称设置为“Example33”。

2. 在自动生成的对话框模板IDD_EXAMPLE33_DIALOG中,删除“TODO: Place dialog controls here.”静态文本框、“OK”按钮和“Cancel”按钮。添加一个Tab Control控件,并为其关联一个CTabCtrl类型的控件变量m_tab。

3. 创建两个新的对话框,ID分别设为IDD_JIZHUOMI_DIALOG、IDD_ANDROID_DIALOG,两者都将Border属性设为None,Style属性设为Child。在对话框模板IDD_JIZHUOMI_DIALOG中加入一个静态文本框,Caption属性设为“鸡啄米 www.jizhuomi.com”,并为其生成对话框类CJzmDlg;在对话框模板IDD_ANDROID_DIALOG中也加入一个静态文本框,Caption属性设为“Android开发网 www.jizhuomi.com/android”,并为其生成对话框类CAndroidDlg。

4. 在“Example33Dlg.h”文件中包含“JzmDlg.h”和“AndroidDlg.h”两个头文件,然后继续在“Example33Dlg.h”文件中为CExample33Dlg类添加两个成员变量:

CJzmDlg m_jzmDlg;
       CAndroidDlg m_androidDlg;

5.  在CExample33Dlg对话框初始化时,我们也初始化标签控件。修改CExample33Dlg::OnInitDialog()函数如下:

C++代码

  1. BOOL CExample33Dlg::OnInitDialog()
  2. {
  3. CDialogEx::OnInitDialog();
  4. // Add "About..." menu item to system menu.
  5. // IDM_ABOUTBOX must be in the system command range.
  6. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  7. ASSERT(IDM_ABOUTBOX < 0xF000);
  8. CMenu* pSysMenu = GetSystemMenu(FALSE);
  9. if (pSysMenu != NULL)
  10. {
  11. BOOL bNameValid;
  12. CString strAboutMenu;
  13. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  14. ASSERT(bNameValid);
  15. if (!strAboutMenu.IsEmpty())
  16. {
  17. pSysMenu->AppendMenu(MF_SEPARATOR);
  18. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  19. }
  20. }
  21. // Set the icon for this dialog.  The framework does this automatically
  22. //  when the application's main window is not a dialog
  23. SetIcon(m_hIcon, TRUE);         // Set big icon
  24. SetIcon(m_hIcon, FALSE);        // Set small icon
  25. // TODO: Add extra initialization here
  26. CRect tabRect;   // 标签控件客户区的位置和大小
  27. m_tab.InsertItem(0, _T("鸡啄米"));         // 插入第一个标签“鸡啄米”
  28. m_tab.InsertItem(1, _T("Android开发网"));  // 插入第二个标签“Android开发网”
  29. m_jzmDlg.Create(IDD_JIZHUOMI_DIALOG, &m_tab);    // 创建第一个标签页
  30. m_androidDlg.Create(IDD_ANDROID_DIALOG, &m_tab); // 创建第二个标签页
  31. m_tab.GetClientRect(&tabRect);    // 获取标签控件客户区Rect
  32. // 调整tabRect,使其覆盖范围适合放置标签页
  33. tabRect.left += 1;
  34. tabRect.right -= 1;
  35. tabRect.top += 25;
  36. tabRect.bottom -= 1;
  37. // 根据调整好的tabRect放置m_jzmDlg子对话框,并设置为显示
  38. m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
  39. // 根据调整好的tabRect放置m_androidDlg子对话框,并设置为隐藏
  40. m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
  41. return TRUE;  // return TRUE  unless you set the focus to a control
  42. }

6. 运行程序,查看结果,这时我们发现切换标签时,标签页并不跟着切换,而总是显示CJzmDlg对话框。

7. 我们要实现的是标签页的切换效果,所以还要为m_tab标签控件的通知消息TCN_SELCHANGE添加处理函数,并修改如下:

C++代码

  1. void CExample33Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3. // TODO: Add your control notification handler code here
  4. *pResult = 0;
  5. CRect tabRect;    // 标签控件客户区的Rect
  6. // 获取标签控件客户区Rect,并对其调整,以适合放置标签页
  7. m_tab.GetClientRect(&tabRect);
  8. tabRect.left += 1;
  9. tabRect.right -= 1;
  10. tabRect.top += 25;
  11. tabRect.bottom -= 1;
  12. switch (m_tab.GetCurSel())
  13. {
  14. // 如果标签控件当前选择标签为“鸡啄米”,则显示m_jzmDlg对话框,隐藏m_androidDlg对话框
  15. case 0:
  16. m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
  17. m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
  18. break;
  19. // 如果标签控件当前选择标签为“Android开发网”,则隐藏m_jzmDlg对话框,显示m_androidDlg对话框
  20. case 1:
  21. m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
  22. m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
  23. break;
  24. default:
  25. break;
  26. }
  27. }

8. 再运行程序,最终的标签页切换效果如下面两图:

经过两讲内容,终于把标签控件的主要知识讲完了。如果想了解更多的相关内容,可以查看MSDN。鸡啄米最后还是谢谢各位的关注和支持。

VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)相关推荐

  1. (转载)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)

    上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...

  2. VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)

    前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...

  3. VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)

    前面一节中鸡啄米为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar添加Ribbon控件. VS2010为Ribbon界面开发提供了Ribbon De ...

  4. VS2010/MFC编程入门教程之目录和总结

    写这套VS2010/MFC编程入门教程历时八个月,时间比较长,都是鸡啄米在工作之余加班加点完成的.虽然有点累,但看到有这么多人过来支持鸡啄米,很是值得. 写每节教程我都力求讲明白,深入浅出的阐述每个知 ...

  5. VS2010/MFC编程入门

    近来鼓捣2D小游戏的过程中发现鸡啄米大神很好的MFC系列资料,在此汗颜将地址扒拉了过来,留待以后慢慢学习. VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解) (http://ww ...

  6. VS2010/MFC编程入门教程

    一.VS2010/MFC编程入门教程之目录       第一部分:VS2010/MFC开发环境       VS2010/MFC编程入门之前言        VS2010/MFC编程入门之一(VS20 ...

  7. VS2010/MFC 编程入门教程之目录和总结

    [原地址]:http://www.jizhuomi.com/software/257.html 鸡啄米这个网站不是很了解,但确实有很多好文章.自己工作需要,在vs2010 下学习mfc的知识,发现了这 ...

  8. VS2013/MFC编程入门之三十四(工具栏:工具栏资源及CToolBar类)

    上一节中讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程序会执 ...

  9. vs2010c语言窗口程序,VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)...

    上一节中鸡啄米讲了文档.视图和框架结构中各对象之间的关系,本节主要讲讲在MFC中如何分割窗口. 分割窗口概述 分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型 ...

  10. VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)

    上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button.Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件 ...

最新文章

  1. 使用镀锌铁皮制作负阻器件
  2. 使用ueditor小结
  3. LeetCode-剑指 Offer 18. 删除链表的节点
  4. LeetCode每日一题:N叉树的层序遍历(No.429)
  5. 华为鸿蒙官方翻译_鸿蒙系统官方译名来了?华为在欧盟注册Harmony商标
  6. 拨云见日—深入解析Oracle TX 行锁(上)
  7. is running beyond the ‘VIRTUAL‘ memory limit. Current usage: 123.5 MB of 1 GB physical memory used
  8. Android 系统权限
  9. android leaks工具,Androidx中ImmLeaksCleaner已经解决了InputMethodManager... - 简书
  10. python3函数重载_9.20 利用函数注解实现方法重载
  11. 9,求整数的二进制中1的个数《剑指offer》
  12. 开关电源/LDO反馈电阻辅助计算工具PowerHelper使用介绍
  13. 使用iperf3网络速度测试工具测试Windows和Ubuntu两台机器的网口速率
  14. java 首次适应算法_首次适应算法java代码
  15. 猫哥教你写爬虫 040--存储数据-作业
  16. 前端无法识别<br/>,无法进行换行
  17. 外部h5网页跳转微信指定页面
  18. Talk | 清华大学陈晓宇苏黎世联邦理工黄嘉伟 :基于实际应用的强化学习
  19. ruby和php比较,十张图读懂PHP、Python、 Ruby三大语言的差异
  20. 计算x的n次方 高效算法

热门文章

  1. 浏览器下载Firefox os 模拟器安装教程步骤详解
  2. Java权限管理系统源代码下载
  3. AD软件原理图库、PCB封装库创建
  4. 台达服务器AB和B2系列区别,台达伺服各系列区别
  5. SQL Server 2012安装异常:Error while enabling Windows feature: NetFx3, Error Code: -2146498298
  6. 机器学习和深度学习资料汇总【01】
  7. MySQL创建企业信息表,基于数据库mysql创建学生信息表(简易版)
  8. coolfire文章之六
  9. Dynamips和Vmware完成CCVP试验(6)
  10. 底层电子电路基础知识