求大神解决MFC tab控件的问题!~万分感谢

ksws0164995 2016-05-08 03:55:40
今天学习用MFC编程,做了一个tab控件,又加了两个子对话框,ID为IDD_MONTH IDD_DAY,变量名为m_mdlg、m_ddlg.
在使用书上所给的代码后发现按tab按钮后没有反应。我用的示例中给的做好的的C文件发现完全没问题,自己做的时候确出现了如下情况:

具体实现代码如下:
在主对话框OnInitDialog中,输入代码:
BOOL CLhwyDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

//TODO: Add extra initialization here

m_Tab.AddPage("班级成绩", &m_bdlg, IDD_BADIALOG);
m_Tab.AddPage("年级成绩", &m_ndlg, IDD_NADIALOG);
m_Tab.AddPage("参数设置", &m_cdlg, IDD_CADIALOG);
m_Tab.Show();

return TRUE; // return TRUE unless you set the focus to a control
}

在tabsheet类中定义如下函数:

BOOL 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()
{
for( int i=0; i < m_nNumOfPages; i++ )
{
m_pPages[i]->Create( m_IDD[i], this );
InsertItem( i, m_Title[i] );
}

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();
}
}

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();

}


希望大神不吝赐教!
...全文
229 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2016-05-10
  • 打赏
  • 举报
回复
再简化为:

BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)
{
	if( MAX_PAGE == m_nNumOfPages) return FALSE;
//
	m_pPages[m_nNumOfPages] = pDialog;
//
	pDialog->Create(ID, this);
	InsertItem(m_nNumOfPages, title);
//
    CRect tabRect;
	GetClientRect(&tabRect);
	tabRect.DeflateRect(2,2);
	tabRect.top +=26;
	m_pPages[m_nNumOfPages]->MoveWindow(&tabRect);
// default page 0
	if(m_nNumOfPages==0)
	{
		m_pPages[0]->ShowWindow(SW_SHOW);
		m_pPages[0]->SetFocus();
	}
// 0,1,2.3
	m_nNumOfPages++;
//
	return TRUE;
}

void CTabSheet::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
static lastSel=0;
//	afxDump << lastSel << ";" << GetCurFocus() << "\n";
	if(lastSel != GetCurFocus())
	{
		m_pPages[lastSel]->ShowWindow(SW_HIDE);
		lastSel=GetCurFocus();// 
		m_pPages[lastSel]->ShowWindow(SW_SHOW);
		m_pPages[lastSel]->SetFocus();
	}
	*pResult = 0;
}
初始化
	// TODO: Add extra initialization here
	if(!m_Tab.AddPage("班级成绩", &m_bdlg, IDD_BADIALOG))
		return FALSE;
	if(!m_Tab.AddPage("年级成绩", &m_ndlg, IDD_NADIALOG))
		return FALSE;
	if(!m_Tab.AddPage("参数设置", &m_cdlg, IDD_CADIALOG))
		return FALSE;
// not : m_Tab.SetCurSel(2);
	m_Tab.SetCurFocus(2);
ksws0164995 2016-05-09
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
注意对话框的 属性是 Child 不是 popup,(无标题,无边框)
我都按照你说的做了,可是还是原来的样子。。 方便的话能给我发一份你成功的工程么,发到我的邮箱就可以了。435380202@qq.com 谢谢!
schlafenhamster 2016-05-09
  • 打赏
  • 举报
回复
注意对话框的 属性是 Child 不是 popup,(无标题,无边框)
schlafenhamster 2016-05-09
  • 打赏
  • 举报
回复
vc6 上 可以的,就上面4个 函数,别的不要。 另外 CTabSheet::CTabSheet() { m_nCurrentPage=0; m_nNumOfPages=0; } class CTabSheet : public CTabCtrl { // Construction public: CTabSheet(); BOOL AddPage(LPCTSTR title, CDialog *pDialog,UINT ID); void SetRect(); void Show(); // void OnLButtonDown(UINT nFlags, CPoint point) // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTabSheet) //}}AFX_VIRTUAL // Implementation public: virtual ~CTabSheet(); protected: int m_nCurrentPage; int m_nNumOfPages; CDialog *m_pPages[4]; UINT m_IDD[4]; LPCSTR m_Title[4]; // Generated message map functions protected: //{{AFX_MSG(CTabSheet) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
schlafenhamster 2016-05-09
  • 打赏
  • 举报
回复
其实 就是一个函数

// CTabSheet message handlers
BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)
{
	if( 3 == m_nNumOfPages) return FALSE;
//
	m_pPages[m_nNumOfPages] = pDialog;
	m_IDD[m_nNumOfPages] = ID;
	m_Title[m_nNumOfPages] = title;
	m_pPages[m_nNumOfPages]->Create(m_IDD[m_nNumOfPages], this);
	InsertItem(m_nNumOfPages, m_Title[m_nNumOfPages]);
//
    CRect tabRect;
	GetClientRect(&tabRect);
	tabRect.DeflateRect(2,2);
	tabRect.top +=26;
	m_pPages[m_nNumOfPages]->SetParent(this);
	m_pPages[m_nNumOfPages]->MoveWindow(&tabRect);
	if(m_nNumOfPages==0)
	{
		m_pPages[m_nNumOfPages]->ShowWindow(SW_SHOW);
		m_pPages[m_nNumOfPages]->SetFocus();
	}
// 0,1,2.3
	m_nNumOfPages++;
//
	return TRUE;
}
schlafenhamster 2016-05-09
  • 打赏
  • 举报
回复
“Tab内是Dlg.rar” http://download.csdn.net/detail/schlafenhamster/4478966 “本程序是一个对话框内一个Tab,而这个Tab含5个对话框的例子。 5个对话框有相同的背景。 本程序显示如何使用运行时类型识别。 DECLARE_DYNAMIC(CDlg1); 还显示如何调整对话框中控件位置 DeferWindowPos”
ksws0164995 2016-05-08
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
注意 void CTabSheet::SetRect()
你好,我看到你帮我把SetRect函数改写了,后面的Show函数也有一些改动。按照你的代码试了试,还是和原来一样啊。。不过还是谢谢你!
schlafenhamster 2016-05-08
  • 打赏
  • 举报
回复
注意 void CTabSheet::SetRect()
schlafenhamster 2016-05-08
  • 打赏
  • 举报
回复

// CTabSheet message handlers
BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)
{
	if( 4 == 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;

	GetClientRect(&tabRect);

	tabRect.DeflateRect(2,2);
	tabRect.top +=26;
	for( int nCount=0; nCount < m_nNumOfPages; nCount++ )
	{
		m_pPages[nCount]->SetParent(this);
		m_pPages[nCount]->MoveWindow(&tabRect);
	}
}
//
void CTabSheet::Show()
{
    for( int i=0; i < m_nNumOfPages; i++ )
	{
		m_pPages[i]->Create(m_IDD[i], this);
		InsertItem( i, m_Title[i] );
	}
	for( i=0; i < m_nNumOfPages; i++)
	{
		m_pPages[i]->ShowWindow(SW_SHOW);
	}
//
	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();
	}
}
ksws0164995 2016-05-08
  • 打赏
  • 举报
回复
引用 3 楼 lilingshui 的回复:
试试用代码比较工具如beyond compare比较一下你的代码和示例代码的区别,看看是什么问题。
我的代码应该是和它一样的,要不然编译也不会通过呀
ksws0164995 2016-05-08
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
“发现按tab按钮后没有反应” tab 键 ? 还是 tab 的 标题 ?
是界面中的tab按钮。我要实现的是按不同的tab按钮实现界面的切换。可是我一直显示空白~
lilingshui 2016-05-08
  • 打赏
  • 举报
回复
试试用代码比较工具如beyond compare比较一下你的代码和示例代码的区别,看看是什么问题。
schlafenhamster 2016-05-08
  • 打赏
  • 举报
回复
“发现按tab按钮后没有反应” tab 键 ? 还是 tab 的 标题 ?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧