使用Codejock的taskpanel进行的多页面显示中的问题

小新小小新 2013-11-13 04:25:51
以下是目前使用codekock的xtreme toolkit 15.2.1版本做的一个类似控制中心的显示软件;
目前遇到了一点问题,主要关于如何在右侧的CChildFrame中生成新视图的问题;

用的是多文档模式;
在APP.CPP文件中
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_LTSWCtrlCenterTYPE,
RUNTIME_CLASS(CLTSWCtrlCenterDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CTabView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);


然后在CMainFrame中创建左侧的这个浮动panel,其中代码在OnCreate中,参考的是TaskPanel的例子进行使用;
原本是想使用GUI_OutLook例子来实现的,但使用中发现若是使用了SplitWnd,便不好处理;
现在在点击左侧的选项之后,右边则会创建相应的框架与视图,其中被屏蔽的部分都是实验的代码,说明这几个思路已经试验过了,现在按照下面这部分代码处理,只能显示如下图的界面,而不会显示View中内容;
这里创建过程中需要的ActiveView与Document大多为NULL,导致无法显示View,请各位路过的大神看看如何填充这些变量;
代码是用VS2005写的,下载在最下方,若是有空的各位请帮忙看看,多谢了
BOOL	CMainFrame::OnCreateClientView(UINT nID)
{
CCreateContext context;
// POSITION pos = theApp.GetFirstDocTemplatePosition();
// CDocTemplate* pDocTpl = theApp.GetNextDocTemplate(pos);
// if(!pDocTpl)
// return FALSE;
// POSITION posDoc = pDocTpl->GetFirstDocPosition();
// CDocument* pDoc =pDocTpl->GetNextDoc(posDoc);
// if(!pDoc)
// return FALSE;
// context.m_pCurrentDoc = RUNTIME_CLASS(CLTSWCtrlCenterDoc);
//
// CXTPTabManagerItem* pItem = m_MTIClientWnd.HitTest(point);
// CFrameWnd* pFrame = DYNAMIC_DOWNCAST(CMDIChildWnd, CWnd::FromHandle(pItem->GetHandle()));
POSITION pos = theApp.GetFirstDocTemplatePosition();
CDocTemplate* pDocTmp = theApp.GetNextDocTemplate(pos);
if(pDocTmp == NULL)
return FALSE;

CMDIChildWnd* pChild=MDIGetActive();
CMDIFrameWnd* pFrame = (CMDIFrameWnd*)GetActiveFrame();
CLTSWCtrlCenterDoc* pDoc = new CLTSWCtrlCenterDoc();//GetActiveDocument();//MDIGetActive()->GetActiveView()->GetDocument();
// pDocTmp->CreateNewFrame(pDoc,pFrame);
context.m_pCurrentDoc =pDoc;
CView* pView;
if(!CheckID(nID)) //说明未打开过
{
CChildFrame* pFrm = new CChildFrame();
switch (nID)
{
case IDS_STRING_CONTACT:
// pView = (CView*)new CViewOne;
context.m_pNewViewClass = RUNTIME_CLASS(CViewOne);
break;
case IDS_STRING_GROUPLIST:
// pView = (CView*)new CViewTwo;
context.m_pNewViewClass = RUNTIME_CLASS(CViewTwo);
break;
case IDS_STRING_GPS:
// pView = (CView*)new CTabView;
context.m_pNewViewClass = RUNTIME_CLASS(CTabView);
break;
}
// pView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,pFrm,nID,&context);
// context.m_pNewViewClass = pView->GetRuntimeClass();
context.m_pCurrentFrame = pFrm;
pFrm->LoadFrame(IDR_MAINFRAME,
WS_CHILD|WS_OVERLAPPEDWINDOW,this,&context);
pFrm->ShowWindow(SW_SHOW);
pFrm->InitialUpdateFrame(pDoc,TRUE);
AddID(nID,pFrm->GetSafeHwnd());
// pView->OnInitialUpdate();
}
else //已经打开了
{
HWND hwnd = GetHwndFromID(nID);
if (hwnd != NULL)
{
CFrameWnd* pFrm = DYNAMIC_DOWNCAST(CMDIChildWnd, CWnd::FromHandle(hwnd));
if(!pFrm)
return FALSE;
MDIActivate(pFrm);
m_MTIClientWnd.Refresh();
return TRUE;
}
return FALSE;
}
return TRUE;
}






代码地址:http://download.csdn.net/detail/youxidonxx/6545799
...全文
118 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小新小小新 2013-11-16
  • 打赏
  • 举报
回复
还是自己算是解决了吧。 主要思路就是参照mfc相关类的几个函数进行变量的填充,之前不明了的地方就是这些参数的填充值不对。 这个是在MDI框架中使用的,至于SDI还暂时未验证。 这部分代码起码可以在我的工程中使用,至于是否真的如此还不得而知。 但是,依照view/doc/frame三者的关系图谱,新建新框架的思路应该是如此没错。

BOOL	CMainFrame::OnCreateClientView(UINT nID)
{
	CCreateContext	context;
	POSITION	pos = theApp.GetFirstDocTemplatePosition();
 	CDocument*	pDoc;
	CView*	pView;
		CDocTemplate*	pDocTmp = (CDocTemplate*)theApp.GetNextDocTemplate(pos);
		
		if(pDocTmp == NULL)
			return FALSE;
	if(!CheckID(nID))	//说明未打开过
	{
		switch (nID)
		{
		case IDS_STRING_CONTACT:
			pView = (CView*)new CContactView;
// 			context.m_pNewViewClass = RUNTIME_CLASS(CViewOne);
			break;
		case IDS_STRING_GROUPLIST:
 			pView = (CView*)new	CViewTwo;
//			context.m_pNewViewClass = RUNTIME_CLASS(CViewTwo);
			break;
		case IDS_STRING_GPS:
 			pView = (CView*)new	CLTSWCtrlCenterView;
//			context.m_pNewViewClass = RUNTIME_CLASS(CTabView);
			break;
		}
		pDoc = pDocTmp->CreateNewDocument();
		CChildFrame*	pFrm =  (CChildFrame*)pDocTmp->CreateNewFrame(pDoc,NULL);
 		pView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,pFrm,AFX_IDW_PANE_FIRST,NULL);
		ASSERT(pView);
 		pDoc->AddView(pView);
		pDocTmp->InitialUpdateFrame(pFrm,pDoc);
		RecalcLayout();
 		AddID(nID,pFrm->GetSafeHwnd());
   	}
	else	//已经打开了
	{
		HWND hwnd = GetHwndFromID(nID);
		if (hwnd != NULL)
		{
			CFrameWnd*	pFrm = DYNAMIC_DOWNCAST(CMDIChildWnd, CWnd::FromHandle(hwnd));
			if(!pFrm)
				return FALSE;
			MDIActivate(pFrm);
			 
			return TRUE;
		}
		return FALSE;
	}
	return TRUE;
}
小新小小新 2013-11-14
  • 打赏
  • 举报
回复
引用 2 楼 gordon3000 的回复:
zVS2008SP1以后的版本这些都有了,Codejock不要再用了吧。
嗯 后续的程序的话,就不准备用05了; 不过我觉得自己的问题主要是在于创建框架与视图上,概念的不清晰,还没有较为系统的搞清楚他们之间的一个架构关系,所以才会询问的; 多谢提醒
副组长 2013-11-14
  • 打赏
  • 举报
回复
zVS2008SP1以后的版本这些都有了,Codejock不要再用了吧。
小新小小新 2013-11-13
  • 打赏
  • 举报
回复
木有人看到。。。。

15,979

社区成员

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

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