博客
关于我
MFC之标签控件26
阅读量:241 次
发布时间:2019-03-01

本文共 5012 字,大约阅读时间需要 16 分钟。

1 标签控件

1)先创建基于对话框的项目。

2)添加TabControl控件到对话框。

在这里插入图片描述
3)由于这个标签控件是唯一需要添加额外代码的,所以我们需要添加额外的代码进去项目当中。
在这里插入图片描述
TabSheet.h

#if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)#define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// TabSheet.h : header file///// CTabSheet window#define MAXPAGE 16class CTabSheet : public CTabCtrl{   	// Constructionpublic:	CTabSheet();		// Attributespublic:		// Operationspublic:		// Overrides	// ClassWizard generated virtual function overrides	//{   {AFX_VIRTUAL(CTabSheet)	//}}AFX_VIRTUAL		// Implementationpublic:	int GetCurSel();	int SetCurSel(int nItem);	void Show();	void SetRect();	BOOL AddPage(LPCTSTR title, CDialog *pDialog, UINT ID);	virtual ~CTabSheet();		// Generated message map functionsprotected:	LPCTSTR m_Title[MAXPAGE];	UINT m_IDD[MAXPAGE];	CDialog* m_pPages[MAXPAGE];	int m_nNumOfPages;	int m_nCurrentPage;	//{   {AFX_MSG(CTabSheet)	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);	afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);	//}}AFX_MSG		DECLARE_MESSAGE_MAP()};///{   {AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_)

TabSheet.cpp

// TabSheet.cpp : implementation file//#include "stdafx.h"//#include "Property5.h"#include "TabSheet.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/// CTabSheetCTabSheet::CTabSheet(){   	m_nNumOfPages = 0;	m_nCurrentPage = 0;}CTabSheet::~CTabSheet(){   }BEGIN_MESSAGE_MAP(CTabSheet, CTabCtrl)	//{   {AFX_MSG_MAP(CTabSheet)	ON_WM_LBUTTONDOWN()	ON_WM_HSCROLL()	//}}AFX_MSG_MAPEND_MESSAGE_MAP()/// CTabSheet message handlersBOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID){   	if( MAXPAGE == m_nNumOfPages )		return FALSE;	m_nNumOfPages++;	m_pPages[m_nNumOfPages-1] = pDialog;	m_IDD[m_nNumOfPages-1] = ID;	m_Title[m_nNumOfPages-1] = title;	return TRUE;}void CTabSheet::SetRect(){   	CRect tabRect, itemRect;	int nX, nY, nXc, nYc;	GetClientRect(&tabRect);	GetItemRect(0, &itemRect);	nX=itemRect.left;	nY=itemRect.bottom+1;	nXc=tabRect.right-itemRect.left-2;	nYc=tabRect.bottom-nY-2;	m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW);	for( int nCount=1; nCount < m_nNumOfPages; nCount++ )		m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW);}void CTabSheet::Show(){   	int i = 0;	for( i=0; i < m_nNumOfPages; i++ )	{   		m_pPages[i]->Create( m_IDD[i], this );		if (AfxGetMainWnd())			InsertItem( i, m_Title[i] );		else			return;	}	m_pPages[0]->ShowWindow(SW_SHOW);	for( i=1; i < m_nNumOfPages; i++)		m_pPages[i]->ShowWindow(SW_HIDE);	SetRect();}void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point) {   	CTabCtrl::OnLButtonDown(nFlags, point);	if(m_nCurrentPage != GetCurFocus())	{   		m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);		m_nCurrentPage=GetCurFocus();		m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);//		m_pPages[m_nCurrentPage]->SetFocus();		//AfxMessageBox("бЁжа"); wbm test	}	}int CTabSheet::SetCurSel(int nItem){   	if( nItem < 0 || nItem >= m_nNumOfPages)		return -1;	int ret = m_nCurrentPage;	if(m_nCurrentPage != nItem )	{   		m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);		m_nCurrentPage = nItem;		m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);//		m_pPages[m_nCurrentPage]->SetFocus();		CTabCtrl::SetCurSel(nItem);	}	return ret;}int CTabSheet::GetCurSel(){   	return CTabCtrl::GetCurSel();}void CTabSheet::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {   	// TODO: Add your message handler code here and/or call default		CTabCtrl::OnHScroll(nSBCode, nPos, pScrollBar);}

4)然后在对话框中添加刚刚TabSheet类型的变量。

在这里插入图片描述

5)右击插入两个对话框。

在这里插入图片描述

6)由于我们在标签中需要添加对话框,需要使用到对话框的对象参数,所以我们需要给刚刚两个插入对话框添加类。(一般插入对话框都需要添加类)

在这里插入图片描述
在这里插入图片描述

7)然后在主窗口对话框头文件中添加刚刚添加类的头文件和对话框对象成员。

#include "MyDlg1.h"#include "MyDlg2.h"MyDlg1 m_dlg1;//刚刚插入对话框的两个类对象MyDlg2 m_dlg2;

8)然后我们就可以在主对话框的初始化函数正式初始化标签。

BOOL CbiaoqiankongjianDlg::OnInitDialog(){   	CDialogEx::OnInitDialog();	// 将“关于...”菜单项添加到系统菜单中。	// IDM_ABOUTBOX 必须在系统命令范围内。	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);	ASSERT(IDM_ABOUTBOX < 0xF000);	CMenu* pSysMenu = GetSystemMenu(FALSE);	if (pSysMenu != NULL)	{   		BOOL bNameValid;		CString strAboutMenu;		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);		ASSERT(bNameValid);		if (!strAboutMenu.IsEmpty())		{   			pSysMenu->AppendMenu(MF_SEPARATOR);			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);		}	}	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动	//  执行此操作	SetIcon(m_hIcon, TRUE);			// 设置大图标	SetIcon(m_hIcon, FALSE);		// 设置小图标	// TODO: 在此添加额外的初始化代码	//1 给标签添加选项	m_tabCtrl.AddPage(TEXT("系统设置"), &m_dlg1, IDD_DIALOG1);	m_tabCtrl.AddPage(TEXT("参数设置"), &m_dlg2, IDD_DIALOG2);	//2 显示标签	m_tabCtrl.Show();	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}

但是结果是点击标签的某个选项对应的对话框不在主对话框中,原因是两个对话框是独立的。

在这里插入图片描述

9)修改两个选项对话框的属性,使对话框作为主对话框的孩子。

在这里插入图片描述
结果:
在这里插入图片描述
但是上面结果还是给人显示成一种对话框,所以我们需要把边框属性去掉。

10)把两个选项对话框的边框属性去掉。改成none即可。

在这里插入图片描述

结果,搞定。

在这里插入图片描述

在这里插入图片描述

转载地址:http://itfv.baihongyu.com/

你可能感兴趣的文章
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>
mysql 导入导出大文件
查看>>
MySQL 导出数据
查看>>
mysql 将null转代为0
查看>>
mysql 常用
查看>>
MySQL 常用列类型
查看>>
mysql 常用命令
查看>>
Mysql 常见ALTER TABLE操作
查看>>
MySQL 常见的 9 种优化方法
查看>>