都是从CDialog继承来的。应该没问题吧? &tdlg也错误直接用CDialog也不行啊。 CTypedPtrArray<CDialog*, CDialog*> m_arrayDlgs; CDialog* dlg; m_arrayDlgs.Add(dlg);--------------- error C2516: 'BASE_CLASS' : is not a legal base class 1> test_myaddDlg.cpp(196) : see declaration of 'BASE_CLASS' 1> test_myaddDlg.cpp(196) : see reference to class template instantiation 'CTypedPtrArray<BASE_CLASS,TYPE>' being compiled
新建一个CDialog类CTestdlg。
CTestdlg tdlg;
m_arrayDlgs.add(tdlg);
这样不行啊,好几个错误。求用法3Q
应该换成你自己的对话框类吧
另外,既然是指针数组,当然要加指针啊
m_arrayDlgs.add(&tdlg);有多个错误,具体错误具体分析
&tdlg也错误直接用CDialog也不行啊。
CTypedPtrArray<CDialog*, CDialog*> m_arrayDlgs;
CDialog* dlg;
m_arrayDlgs.Add(dlg);---------------
error C2516: 'BASE_CLASS' : is not a legal base class
1> test_myaddDlg.cpp(196) : see declaration of 'BASE_CLASS'
1> test_myaddDlg.cpp(196) : see reference to class template instantiation 'CTypedPtrArray<BASE_CLASS,TYPE>' being compiled
CTypedPtrArray<CDialog*, CDialog*> m_arrayDlgs;
改成CTypedPtrArray <CPtrArray,CMyDlg *> m_arrayDlgs;就可以了
CTypedPtrArray的第一个参数是说Array本身的基类,而不是它要存储的元素的基类
CTypedPtrArray <CPtrArray,CMyDlg *> m_arrayDlgs;这种用法不懂
等高手解答哈
tab最合理的机制隐藏上一个
显示当前的
不会出现你说的把所有的都显示和隐藏的情况啊
3Q...这个方法好啊..
怎样得到当前tab页的CDialog对象呢?
弄一变量,当某tab页激活,就保存到该变量
一般都是重载CTabCtrl
然后tab的TCITEM结构有一个lParam
在添加页面的时候将页面的指针保存在这个参数里
然后处理TCN_SELCHANGE和TCN_SELCHANGING消息
OnTcnSelchanging里隐藏
OnTcnSelchange显示
mdlg1.Create(IDD_DIALOG1,&m_tab);
mdlg2.Create(IDD_DIALOG2,&m_tab); tcItem[1].mask = TCIF_TEXT | TCIF_PARAM;
tcItem[1].lParam = (LPARAM)&mdlg1;
tcItem[1].pszText = "11111";
m_tab.InsertItem(0,&tcItem[1]);
tcItem[2].mask = TCIF_TEXT | TCIF_PARAM;
tcItem[2].lParam = (LPARAM)&mdlg2;
tcItem[2].pszText = "2222";
m_tab.InsertItem(1,&tcItem[2]);OnTcnSelchangeTab中 TCITEM *t=new TCITEM;
m_tab.GetItem(cursel,t);
CDialog* d = (CDialog*)(t->lParam);
d->ShowWindow(false);
switch(cursel)
{
case 0:
m_tab.GetItem(0,t);
break;
case 1:
m_tab.GetItem(1,t);
break;
} d = (CDialog*)(t->lParam);
d->ShowWindow(true);
我没找出有什么问题.求解决或者请给一可用模板.3Q
class CPageTab : public CTabCtrl
{
DECLARE_DYNAMIC(CPageTab) int m_nItemCount; //页数public:
CPageTab();
virtual ~CPageTab(); void AddItem(CWnd *pWnd,LPTSTR name); //添加选项卡
void ShowCurrentPage(int nShowState); //显示当前页面public:
afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP()
};
实现文件#include "stdafx.h"
#include "PageTab.h"// CPageTab
IMPLEMENT_DYNAMIC(CPageTab, CTabCtrl)CPageTab::CPageTab()
{
m_nItemCount=0;
}CPageTab::~CPageTab()
{
}void CPageTab::AddItem(CWnd *pWnd, LPTSTR name)
{
TCITEM item; item.mask = TCIF_TEXT|TCIF_PARAM;
item.lParam = (LPARAM) pWnd;
item.pszText = name;
InsertItem(m_nItemCount, &item); if(m_nItemCount==0)
{
pWnd->ShowWindow(SW_SHOW);//显示第一个子窗体
}
else
{
pWnd->ShowWindow(SW_HIDE);
} m_nItemCount++;
}void CPageTab::ShowCurrentPage(int nShowState)
{
int nCurItem = GetCurSel();
TCITEM itemCurrent;
CWnd* pWnd; itemCurrent.mask = TCIF_PARAM;
GetItem(nCurItem, &itemCurrent);
pWnd = reinterpret_cast<CWnd*> (itemCurrent.lParam);
ASSERT_VALID(pWnd); pWnd->ShowWindow(nShowState);
}
BEGIN_MESSAGE_MAP(CPageTab, CTabCtrl)
ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CPageTab::OnTcnSelchange)
ON_NOTIFY_REFLECT(TCN_SELCHANGING, &CPageTab::OnTcnSelchanging)
END_MESSAGE_MAP()// CPageTab 消息处理程序void CPageTab::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
{
ShowCurrentPage(SW_SHOW); *pResult = 0;
}void CPageTab::OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult)
{
ShowCurrentPage(SW_HIDE); *pResult = 0;
}
CDialog *mdlg1;
CDialog *mdlg2;实现文件中
CtestaDlg::OnInitDialog()下 mdlg1->Create(IDD_DIALOG1);
mdlg2->Create(IDD_DIALOG2); m_tab.AddItem(mdlg1,"test1");
m_tab.AddItem(mdlg2,"test2");一运行就错误.然后就关闭了?
m_tab.AddItem((CWnd*)mdlg1,"test1");
m_tab.AddItem((CWnd*)mdlg2,"test2"); //这样也不行- -
CDialog *mdlg1;
CDialog *mdlg2
你分配空间了吗
3Q.是没分配空间引起的问题.分配后好了.现在创建出来的窗口不在tab控件的位置.
我以前用的现在加在了AddItem最前面.想在添加窗口时完成移动,但是不起作用.
GetClientRect(rect);
rect.InflateRect(-1,-30,-2,-2);
pWnd->MoveWindow(rect);
现在算窗口应该用GetWindowRect了.已经好了..再次感谢.