为了完成面向对象的课程设计,我最近开始正式学习VC++。在学习单文档应用窗口切分的例程时,我发现用鼠标拖动切分条可以改变切分窗口的比例。我的课程设计中可不需要这样的效果。怎么才能让它固定呢?在网上搜了一下,发现大部分文章都是在粗略介绍用CSplitterWnd切分窗口的,没有详细说明怎样固定窗片的;还有一部分是在论坛里求助这个问题的帖子,回答也不是太明了。最后终于让我找到了一篇对我有帮助的文章:使用VC6.0实现窗口的任意分割
它里面提到“锁定切分条的最简单的方法莫过于不让CSplitterWnd来处理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息,而是将这些消息交给CWnd窗口进行处理”,由此我想到了下面的解决为法。下面我就把我做的这个例子中关于窗口切分的内容从头到尾介绍一下,希望对那些像我一样刚学VC++的人会有启示。如果您有更好的方法,或者说我这个方法不好,也请您告诉我。谢谢。
对了,再补充一句:我用的是VS.NET2003。
目的效果:把一个单文档应用程序的窗口拆分成左右两个,左边的视图基类为CWnd,右边的视图基类为CDialog,中间的切分条固定不可动。
步骤:
①创建一个“单文档”应用程序,“用户界面功能”中选择“拆分窗口”。
②添加一个MFC类CRightView,基类选择CFormView。
③编辑资源IDD_RIGHTVIEW。
④把MainFrm.cpp中的OnCreateClient函数体用下述内容替换:
{
//创建静态切分窗口
if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
return FALSE;
}
//创建左边的pane
if (!m_wndSplitter.CreateView(0, 0, pContext->m_pNewViewClass, CSize(400, 0), pContext))
{
return FALSE;
}
//创建右边的pane
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(0, 0), pContext))
{
return FALSE;
}
return TRUE;
}
此时已经达到了对窗口切分的目的。编译运行即可看到效果。下面实现切分条的固定。
⑤添加一个“一般C++类”CFixedSplitterWnd,基类填写CSplitterWnd。
⑥用这个类来响应WM_LBUTTONDOWN消息,把CFixedSplitterWnd::OnLButtonDown(...)函数中的CSplitterWnd::OnLButtonDown(...)改成CWnd::OnLButtonDown(...)。
⑦用这个类来响应WM_MOUSEMOVE消息,把CFixedSplitterWnd::OnMouseMove(...)函数中的CSplitterWnd::OnMouseMove(...)改成CWnd::OnMouseMove(...)。
其实上述两步的目的就是让CSplitterWnd类不响应WM_LBUTTONDOWN和WM_MOUSEMOVE消息。
⑧在MainFrm.h中,把m_wndSplitter的定义改成用CFixedSplitterWnd来定义。另外,别忘了在MainFrm.h中加上#include "FixedSplitterWnd.h"。
此时再编译运行,就完全达到我们想要的效果了。
sumless
对了,再补充一句:我用的是VS.NET2003。
目的效果:把一个单文档应用程序的窗口拆分成左右两个,左边的视图基类为CWnd,右边的视图基类为CDialog,中间的切分条固定不可动。
步骤:
①创建一个“单文档”应用程序,“用户界面功能”中选择“拆分窗口”。
②添加一个MFC类CRightView,基类选择CFormView。
③编辑资源IDD_RIGHTVIEW。
④把MainFrm.cpp中的OnCreateClient函数体用下述内容替换:
{
//创建静态切分窗口
if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
return FALSE;
}
//创建左边的pane
if (!m_wndSplitter.CreateView(0, 0, pContext->m_pNewViewClass, CSize(400, 0), pContext))
{
return FALSE;
}
//创建右边的pane
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(0, 0), pContext))
{
return FALSE;
}
return TRUE;
}
此时已经达到了对窗口切分的目的。编译运行即可看到效果。下面实现切分条的固定。
⑤添加一个“一般C++类”CFixedSplitterWnd,基类填写CSplitterWnd。
⑥用这个类来响应WM_LBUTTONDOWN消息,把CFixedSplitterWnd::OnLButtonDown(...)函数中的CSplitterWnd::OnLButtonDown(...)改成CWnd::OnLButtonDown(...)。
⑦用这个类来响应WM_MOUSEMOVE消息,把CFixedSplitterWnd::OnMouseMove(...)函数中的CSplitterWnd::OnMouseMove(...)改成CWnd::OnMouseMove(...)。
其实上述两步的目的就是让CSplitterWnd类不响应WM_LBUTTONDOWN和WM_MOUSEMOVE消息。
⑧在MainFrm.h中,把m_wndSplitter的定义改成用CFixedSplitterWnd来定义。另外,别忘了在MainFrm.h中加上#include "FixedSplitterWnd.h"。
此时再编译运行,就完全达到我们想要的效果了。
sumless