如何防止在拆分窗口中调整视图大小






4.94/5 (31投票s)
禁用拆分窗口的鼠标输入
引言
我怀疑这可能是 CodeProject 上呈现的最微不足道的类。
在我编写的一个 MFC 应用程序中,我想要一个带有左侧树控件和右侧视图类的资源管理器风格界面。但我想要阻止用户抓取分隔条并调整视图大小。
该应用程序是使用 AppWizard
创建的,选择了 MFC、资源管理器风格和一个分隔器。 生成的项目包含人们期望的标准类,CMainFrame
,一个 CDocument
派生类,一个从 CTreeView
派生的 CLeftView
和另一个用于应用程序右侧的视图类。
这两个视图由嵌入在 CMainFrame
对象中的 CSplitterWnd
实例管理。 所有这些都是 MFC 101 的内容。
鉴于我想阻止通过分隔器调整视图大小,因此查看 CSplitterWnd
的 MSDN 文档是有意义的。 该类中有很多函数,但没有一个可以让你禁用分隔器上的鼠标操作。 嗯……在 分割窗口[^] 主题下的 CodeProject 上快速检查没有明显的发现。 然后我突然明白了。 CSplitterWnd
是一个具有一些额外功能的 CWnd
。
由于 CSplitterWnd
派生自 CWnd
,因此很容易拦截 Windows 消息。 在这种情况下,我感兴趣的 Windows 消息是 WM_NCHITTEST
,它是 Windows 询问窗口,鼠标是否位于特殊位置的方式? 对于分割窗口,如果鼠标位于分隔器上,则答案为是。 如果我们将该答案更改为否,则 CSplitterWnd
中的额外逻辑将不会启动。
CSplitOverride 类
这是声明。 这是一个非常简单的类,仅包含一个构造函数、一个消息映射和一个消息映射条目。
class CSplitOverride : public CSplitterWnd
{
DECLARE_DYNAMIC(CSplitOverride)
public:
CSplitOverride() { }
protected:
DECLARE_MESSAGE_MAP()
afx_msg UINT OnNcHitTest(CPoint point);
}
这是实现
IMPLEMENT_DYNAMIC(CSplitOverride, CSplitterWnd)
BEGIN_MESSAGE_MAP(CSplitOverride, CSplitterWnd)
ON_WM_NCHITTEST()
END_MESSAGE_MAP()
// CSplitOverride message handlers
afx_msg UINT CSplitOverride::OnNcHitTest(CPoint /*point*/)
{
return HTNOWHERE;
}
嘿,我确实说过这是一个微不足道的类! WM_NCHITTEST
消息处理程序的重写只是返回 HTNOWHERE
,它告诉 Windows 鼠标指针的位置没有任何特别之处。
Using the Code
要使用该类,请将下载中的两个文件添加到您的项目,然后在 CMainFrame
类的头文件中,将 CSplitterWnd
变量类型更改为 CSplitOverride
。 宾果! 您的应用程序现在将忽略分割窗口上的鼠标操作。 不要忘记禁用任何菜单或键盘访问来调整分隔器大小。
历史
- 2004 年 2 月 25 日 - 初始版本(可能也是最后一个版本)