65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (31投票s)

2004年2月25日

CPOL

2分钟阅读

viewsIcon

127157

downloadIcon

2383

禁用拆分窗口的鼠标输入

引言

我怀疑这可能是 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 日 - 初始版本(可能也是最后一个版本)
© . All rights reserved.