MDI窗口的拆分问题 我的程序是MDI程序,包含了两种不同的视图,分别叫做A,B我只需要对A类视图进行拆分(左右两部分)该如何实现呀? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 BOOL CChildFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext){ if(!m_wndSplitter.CreateStatic(this,1,2,WS_CHILD|WS_VISIBLE)) { TRACE("Failed to CreateStaticSplitter\n"); return FALSE; } if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(Adverse),CSize(275,200),pContext)) { TRACE("Failed to Create command view pane\n"); return FALSE; } if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyView),CSize(400,400),pContext)) { TRACE("Failed to Create preview view pane\n"); return FALSE; } return TRUE;}http://search.csdn.net/Expert/topic/979/979600.xml?temp=.4390222 mfc深入浅出一书通过改写OnWindowNew实现同源子窗口:先派生个view: CHexView 然后做两个文档模版,对应原来的view 和CHexView:CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_TEXTTYPE, RUNTIME_CLASS(CTextDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CTextView)); AddDocTemplate(pDocTemplate); m_pTemplateTxt = new CMultiDocTemplate( IDR_TEXTTYPE, RUNTIME_CLASS(CTextDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CTextView)); m_pTemplateHex = new CMultiDocTemplate( IDR_TEXTTYPE, RUNTIME_CLASS(CTextDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CHexView));然后在需要创建新子窗口时,模仿OnWindowNew的内容:void CMainFrame::OnWindowText(){ CMDIChildWnd* pActiveChild = MDIGetActive(); CDocument* pDocument; if (pActiveChild == NULL || (pDocument = pActiveChild->GetActiveDocument()) == NULL) { TRACE0("Warning: No active document for WindowNew command\n"); AfxMessageBox(AFX_IDP_COMMAND_FAILURE); return; // command failed } // otherwise we have a new frame! CDocTemplate* pTemplate = ((CTextApp*) AfxGetApp())->m_pTemplateTxt; ASSERT_VALID(pTemplate); CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild); if (pFrame == NULL) { TRACE0("Warning: failed to create new frame\n"); AfxMessageBox(AFX_IDP_COMMAND_FAILURE); return; // command failed } pTemplate->InitialUpdateFrame(pFrame, pDocument);}void CMainFrame::OnWindowHex(){ CMDIChildWnd* pActiveChild = MDIGetActive(); CDocument* pDocument; if (pActiveChild == NULL || (pDocument = pActiveChild->GetActiveDocument()) == NULL) { TRACE0("Warning: No active document for WindowNew command\n"); AfxMessageBox(AFX_IDP_COMMAND_FAILURE); return; // command failed } // otherwise we have a new frame! CDocTemplate* pTemplate = ((CTextApp*) AfxGetApp())->m_pTemplateHex; ASSERT_VALID(pTemplate); CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild); if (pFrame == NULL) { TRACE0("Warning: failed to create new frame\n"); AfxMessageBox(AFX_IDP_COMMAND_FAILURE); return; // command failed } pTemplate->InitialUpdateFrame(pFrame, pDocument);}这样就产生了两个同源子窗口,你如果要将其中之一拆分,另一个不拆分可以把不拆分的文档模板直接用CMDIChildWnd 产生,需要拆分的用CChildFrame,然后在其中用CSplitterWnd 我刚找到一个解决方案:在OnCreateClient函数中if pContext->m_pNewViewClass->m_lpszClassName == 'a' 拆分else 不拆分 成功解决MDI+多视+拆分,解决办法如下:BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class const char* pszViewName = "CModuleView"; if (strcmp(pszViewName, pContext->m_pNewViewClass->m_lpszClassName) == 0) { if (!m_wndSplitter.CreateStatic(this, 1, 2) || \ !m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CModuleView),CSize(230, 0), pContext) || !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CModuleView),CSize(0, 0), pContext)) { return FALSE; } else return TRUE; } return CMDIChildWnd::OnCreateClient(lpcs, pContext);} v是一个矩阵,这样的计算是啥运算,怎么算的? 主线程创建一个新的线程后,如何让该线程处理的结果又返回主线程? HOOK API 后原来替换API函数的函数不能用 请问在单文档框架中如何在主框架得到视的指针? 在一个窗口类中是如何获得中文输入的信息的 给CSDN上的朋友们拜年了!(一) 不好意思,我想提问。 如何在程序中指定一个硬盘上的文件为只读? 如何判断鼠标移出客户区? 小白关于MFC文本IO的提问 怎么改变窗口边框的颜色 怎样生成这样的图象?就是在一个位图中有一些文字。当打开这个图象时,只有文字能看到?其余的背景都看不到??
CCreateContext* pContext)
{
if(!m_wndSplitter.CreateStatic(this,1,2,WS_CHILD|WS_VISIBLE))
{
TRACE("Failed to CreateStaticSplitter\n");
return FALSE;
} if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(Adverse),CSize(275,200),pContext))
{
TRACE("Failed to Create command view pane\n");
return FALSE;
} if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyView),CSize(400,400),pContext))
{
TRACE("Failed to Create preview view pane\n");
return FALSE;
} return TRUE;
}http://search.csdn.net/Expert/topic/979/979600.xml?temp=.4390222
先派生个view: CHexView 然后做两个文档模版,对应原来的view 和CHexView:
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_TEXTTYPE,
RUNTIME_CLASS(CTextDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CTextView));
AddDocTemplate(pDocTemplate); m_pTemplateTxt = new CMultiDocTemplate(
IDR_TEXTTYPE,
RUNTIME_CLASS(CTextDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CTextView)); m_pTemplateHex = new CMultiDocTemplate(
IDR_TEXTTYPE,
RUNTIME_CLASS(CTextDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CHexView));
然后在需要创建新子窗口时,模仿OnWindowNew的内容:
void CMainFrame::OnWindowText()
{
CMDIChildWnd* pActiveChild = MDIGetActive();
CDocument* pDocument;
if (pActiveChild == NULL ||
(pDocument = pActiveChild->GetActiveDocument()) == NULL)
{
TRACE0("Warning: No active document for WindowNew command\n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return; // command failed
} // otherwise we have a new frame!
CDocTemplate* pTemplate = ((CTextApp*) AfxGetApp())->m_pTemplateTxt;
ASSERT_VALID(pTemplate);
CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
if (pFrame == NULL)
{
TRACE0("Warning: failed to create new frame\n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return; // command failed
} pTemplate->InitialUpdateFrame(pFrame, pDocument);
}
void CMainFrame::OnWindowHex()
{
CMDIChildWnd* pActiveChild = MDIGetActive();
CDocument* pDocument;
if (pActiveChild == NULL ||
(pDocument = pActiveChild->GetActiveDocument()) == NULL)
{
TRACE0("Warning: No active document for WindowNew command\n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return; // command failed
} // otherwise we have a new frame!
CDocTemplate* pTemplate = ((CTextApp*) AfxGetApp())->m_pTemplateHex;
ASSERT_VALID(pTemplate);
CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
if (pFrame == NULL)
{
TRACE0("Warning: failed to create new frame\n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return; // command failed
} pTemplate->InitialUpdateFrame(pFrame, pDocument);
}这样就产生了两个同源子窗口,你如果要将其中之一拆分,另一个不拆分
可以把不拆分的文档模板直接用CMDIChildWnd 产生,需要拆分的用CChildFrame,然后在其中用CSplitterWnd
在OnCreateClient函数中
if pContext->m_pNewViewClass->m_lpszClassName == 'a'
拆分
else
不拆分
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
const char* pszViewName = "CModuleView";
if (strcmp(pszViewName, pContext->m_pNewViewClass->m_lpszClassName) == 0)
{
if (!m_wndSplitter.CreateStatic(this, 1, 2) || \
!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CModuleView),CSize(230, 0), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CModuleView),CSize(0, 0), pContext))
{
return FALSE;
}
else
return TRUE;
}
return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}