gpt4 book ai didi

c++ - 使用菜单按钮将 View 一分为二? (MFC)

转载 作者:行者123 更新时间:2023-11-30 01:50:46 26 4
gpt4 key购买 nike

我编写了一个 MFC 程序来读取文件、存储数据并将其绘制为客户端 View 上的文本。

我想制作一个菜单按钮 View->Split,将客户区分成两个,分别滚动显示相同数据的 View 。

我在网上看到了一些关于 CWndSplitter 的东西,并阅读了一些文档,但没有一个被证明是有用的,因为他们谈论使用 OnCreate 和删除默认 View 来让它工作。这不是一个选择。我想保留默认 View ,但在用户单击按钮时将其分成两部分。

我目前已经创建了一个 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;
}
*/
}

谁能告诉我将客户端 View 一分为二的正常方法是什么?我只想将其集成到事件处理程序中。任何帮助将不胜感激。

谢谢。

--------------------------------编辑---------------- ----------------------

由于 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 ->拆分按钮后,出现“调试断言错误”弹出窗口,第一次调用 CreateView 返回 FALSE,显示我的消息框:“设置拆分框架时出错!(CreateView 1)”

最佳答案

静态拆分器用于静态 拆分,即始终 拆分的窗口。当您希望在拆分的每个 Pane 中有不同的 View 时(例如,在一个 Pane 中显示一列数字,在另一个 Pane 中显示图形),通常会使用它。

对于像您这样的情况,您希望能够拥有窗口,然后将其拆分并具有两个基本相同的 View ,您(至少通常)希望使用动态拆分器。

至少通常情况下,您会在创建 View 时创建拆分器。这将创建一个窗口,该窗口在右上角有一个 handle ,用户可以向下拉该 handle 来 Split View:

enter image description here

要拆分窗口,用户向下拉 handle :

enter image description here

当拆分到他们想要的位置时,他们释放鼠标按钮, View 拆分为两个单独的可滚动部分:

enter image description here

因为您没有指定是要垂直还是水平拆分,所以我将其设置为允许其中之一或同时允许:

enter image description here

这个代码看起来像这样:

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;

关于c++ - 使用菜单按钮将 View 一分为二? (MFC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27054697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com