在 SDI 应用程序中创建垂直和水平标尺条的最佳方法是什么?你会让它成为框架或视图的一部分吗?从CControlBar派生出来,还是有更好的方法?
垂直标尺也必须停靠在窗格而不是框架上。
为了让我更清楚地了解我所追求的,想象一下 Visual Studio 中对话框编辑器中的垂直标尺(仅限 MFC)。每当调整树视图的大小时,它都会重新定位。
在 SDI 应用程序中创建垂直和水平标尺条的最佳方法是什么?你会让它成为框架或视图的一部分吗?从CControlBar派生出来,还是有更好的方法?
垂直标尺也必须停靠在窗格而不是框架上。
为了让我更清楚地了解我所追求的,想象一下 Visual Studio 中对话框编辑器中的垂直标尺(仅限 MFC)。每当调整树视图的大小时,它都会重新定位。
我不会用控制吧。我没有其他充分的理由(IMOHO)很难做你想做的事——如果你想要的不是停靠工具栏的话。
我会使用 GDI 调用直接在视图窗口上绘制它们。
我想我可能会考虑让每个标尺都有自己的窗口,然后在自己的窗口上绘制标尺。然后,我将在视图中创建这两个 CWnd 派生类并将其定位为子窗口。如果您想在这些标尺上与鼠标进行交互,这很好(更容易理清哪些消息是针对标尺的)。
我最终按照您的建议从 CWnd 派生了标尺,并跳过了控制栏路线。此代码适用于任何一种情况:
m_wndSplitter.CreateStatic(this, 1, 3);
m_wndLeftPane.Create(&m_wndSplitter,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0, 0));
m_ruler.Create(&m_wndSplitter,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0, 1));
m_wndSplitter.CreateView(0, 2, pContext->m_pNewViewClass, CSize(300, 0), pContext);
SetActiveView((CScrollView*)m_wndSplitter.GetDlgItem(m_wndSplitter.IdFromRowCol(0, 2)));