我编写了一个MFC程序,用于读取文件,存储数据,并在客户端视图中将其作为文本绘制。
我想制作一个菜单按钮View-> Split将客户区分成两个,分别滚动显示相同数据的视图。
我在网上看到了一些关于CWndSplitter的内容并阅读了一些文档,但没有一个证明是有用的,因为他们谈论使用OnCreate并删除默认视图以使其工作。这不是一个选择。我想保留默认视图,但如果用户单击按钮则将其拆分为两个。
我目前创建了一个CWndSplitter成员变量,并在我的SDI-1View.cpp中定义了一个菜单按钮事件处理程序。当被调用时,它绝对不会导致屏幕闪烁,第二次单击会使程序崩溃。
void CSDI1View::OnViewSplit32778()
{
// TODO: Add your command handler code here
/*
int rows = 2;
int columns = 1;
if (!m_wndSplitter.CreateStatic(this, rows, columns))
return;
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSDI1View), CSize(100, 100), NULL) ||
(!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CSDI1View), CSize(100, 100), NULL)))
{
m_wndSplitter.DestroyWindow();
return;
}
*/
}
有谁能告诉我将客户端视图分成两半的正常方法是什么?我只是想将它集成到事件处理程序中。 任何帮助将不胜感激。
感谢。
-------------------------------- EDIT -------------- --------------------
我现在在我的Split按钮事件处理程序中有以下代码,这要归功于xMRi提供的大纲,但它仍然无法正常工作......
void CMainFrame::OnViewSplit()
{
// TODO: Add your command handler code here
//calculate client size
CRect cr;
GetClientRect(&cr);
if (!m_mainSplitter.CreateStatic(this, 2, 1))
{
MessageBox(_T("Error setting up splitter frames! (CreateStatic)"),
_T("Init Error!"), MB_OK | MB_ICONERROR);
return;
}
// Set the parent of the splitter window to the current view
CSDI1View * view = CSDI1View::GetView();
m_mainSplitter.SetParent(this);
view->SetParent(&m_mainSplitter);
// Create a CCreateContext
CCreateContext cc;
CRuntimeClass* prt = RUNTIME_CLASS(CSDI1View);
cc.m_pNewViewClass = prt;
cc.m_pCurrentDoc = view->GetDocument();
cc.m_pNewDocTemplate = NULL;
cc.m_pLastView = NULL;
cc.m_pCurrentFrame = this;
if (!m_mainSplitter.CreateView(0, 0,
cc.m_pNewViewClass,
CSize(cr.Width(), cr.Height()/2), &cc))
{
MessageBox(_T("Error setting up splitter frames! (CreateView 1)"),
_T("Init Error!"), MB_OK | MB_ICONERROR);
return;
}
if (!m_mainSplitter.CreateView(1, 0,
cc.m_pNewViewClass,
CSize(cr.Width(), cr.Height()/2), &cc))
{
MessageBox(_T("Error setting up splitter frames! (CreateView 2)"),
_T("Init Error!"), MB_OK | MB_ICONERROR);
return;
}
m_bInitSplitter = TRUE;
}
单击view-> split按钮后,我得到一个" Debug Assertion Error"弹出窗口和第一次调用CreateView返回FALSE,显示我的消息框:"设置分割帧时出错! (CreateView 1)"
答案 0 :(得分:3)
静态分割器用于静态分割 - 即,总是分割的窗口。当您希望在拆分的每个窗格中具有不同的视图时,通常使用它(例如,在一个窗格中显示一列数字,在另一个窗格中显示一个图形)。
对于像你这样的情况,你希望能够拥有窗口,然后将它拆分并有两个基本相同的视图,你(至少通常)想要使用动态分割器。
至少通常,在创建视图时创建拆分器。这将创建一个窗口,在顶部,右上角有一个手柄,用户可以向下拉以分割视图:
要分割窗口,用户可以拉下手柄:
当拆分位于他们想要的位置时,他们会释放鼠标按钮,并且视图会分成两个可单独滚动的部分:
由于您没有指定是要垂直分割还是水平分割,我将此设置为允许其中一个或两个:
这个代码看起来像这样:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext) {
return my_splitter.Create(this,
2, 2, // 2 rows, 2 columns
CSize(20, 20), // minimum pane size
pContext);
}
其中my_splitter
的定义如下:
CSplitterWnd my_splitter;
答案 1 :(得分:1)
如果要按需使用拆分器窗口,则需要更改当前视图的父窗口。 所以步骤是:
回来的路。
有活动示例如何切换当前文档中的视图(MSDN)。它可以帮助您更改和更改ID。