博客
关于我
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 CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>
MYSQL CONCAT函数
查看>>
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>