使用CSplitterWnd分割窗口

摘要:
没弄明白)returnTRUE;//returnCFrameWnd::OnCreateClient;}运行后就可以看到生成了分割为左右两个视图的窗口。在类视图中右键,选择“添加”-˃“类”,在弹出窗口中选择MFC类,输入新类的名字CMySplitter,基类选择为CWnd。然后把生成的MySplitter.h和MySplitter.cpp里面的三个地方的“Cwnd”改成“CSplitterWnd”。

使用CSplitterWnd分割窗口

一、基本的CSplitterWnd的使用

1. 在CMainFrame中添加一个CSplitterWnd成员:
CSplitterWnd m_splitterwnd1;

2.基于CView创建两个新的视图类,CViewLeft和CViewRight,一个用于在左边显示,一个用于在右边显示。


3.重载CMainFrame的OnCreateClient函数,
在并其中调用CSplitterWndr的CreateStatic函数创建该分割窗口,CreateView函数创建左右两个视图,SetColumnInfo设定分割窗口的列的宽度:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
m_mysplitter1.CreateStatic(this, 1, 2);//创建一个一行二列的分割窗口
m_mysplitter1.CreateView(0, 0, RUNTIME_CLASS(CViewLeft), CSize(0, 0),
pContext);//建立第0行第0列的视图
m_mysplitter1.CreateView(0, 1, RUNTIME_CLASS(CViewRight), CSize(0, 0),
pContext);//建立第0行第1列的视图

m_mysplitter1.SetColumnInfo(0, 250, 10);//设定某列的宽度,这里表示设定第0列的理想宽度为250像素,最小宽度为10像素(什么是最小宽度?没弄明白)

return TRUE;

//return CFrameWnd::OnCreateClient(lpcs, pContext);
}

运行后就可以看到生成了分割为左右两个视图的窗口。

二、为分割窗添加一些自己需要的功能
从系统的CSplitterWnd类派生一个新类。
在类视图中右键,选择“添加”->“类”,在弹出窗口中选择MFC类,输入新类的名字CMySplitter,基类选择为CWnd(这里基类的选项里面没有CSplitterWnd,所以要先选择Cwnd)。然后把生成的MySplitter.h和MySplitter.cpp里面的三个地方的“Cwnd”改成“CSplitterWnd”。
MySplitter.h中:
class CMySplitter : public CSplitterWnd
Mysplitter.cpp中:
IMPLEMENT_DYNAMIC(CMySplitter, CSplitterWnd)
BEGIN_MESSAGE_MAP(CMySplitter, CSplitterWnd)

1.双击分隔栏展开或者收起左边的一栏
重载OnLButtonDblClk函数:
void CMySplitterWnd::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

//CSplitterWnd::OnLButtonDblClk(nFlags, point);
int left, min;
GetColumnInfo(0, left, min);//得到第0栏(即左边的一栏)的宽度
if(left == 0 || left == min)//如果当前已经是收起的状态
{
SetColumnInfo(0, 250, 10);//重新设置左边一栏的宽度,这里设置为250,即展开
}
else
{
SetColumnInfo(0, 0, 10);//重新设置左边一栏的宽度,这里设置为0,即收起
}
RecalcLayout();//重新构建窗口布局
}

2.设置分隔栏的宽度
在CMySplitter的构造函数中(这里是把宽度设为11像素):
m_cxSplitterGap = 11;
m_cxSplitter = 11;
几个相关变量的意义:
//int m_cxSplitter, m_cySplitter; // size of splitter bar
//int m_cxBorderShare, m_cyBorderShare; // space on either side of splitter
//int m_cxSplitterGap, m_cySplitterGap; // amount of space between panes
//int m_cxBorder, m_cyBorder; // borders in client area

3.禁止拖动分隔栏的位置
(1)重载OnLButtonDown函数,改成什么都不做:
void CMySplitter::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//CSplitterWnd::OnLButtonDown(nFlags, point);

}
(2)重载OnMouseMove函数,也改成什么都不做:
void CMySplitter::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

//CSplitterWnd::OnMouseMove(nFlags, point);
}

4. 在分隔栏上添加一个”按钮“
(1)在资源视图中导入两张位图资源,分另是一个向左的箭头和一个向右的箭头,图片大小为(6*31)像素:IDB_BITMAP_LEFT,IDB_BITMAP_RIGHT
(2)为CMySplitter类添加显示该“按钮”相关的成员:
CBitmap m_bitmapleft;//左箭头位图
CBitmap m_bitmapright;//右箭头位图
CDC m_dcMem;//
CRect m_rectImgBtn;//显示该“按钮”的矩形区域
(3)添加一个成员函数得到显示该“按钮”的矩形区域:
//这个函数用来得到显示该按钮的矩形区域
void CMySplitter::GetImgBtnRect(void)
{
CRect r;
int left, min;
GetWindowRect(&r);
GetColumnInfo(0, left, min);
m_rectImgBtn.SetRect(left+2+2, r.Height()/2-16,
left+2+8, r.Height()/2+15);//这里这么写是根据WindowsXP显示的分隔栏来确定的,要用绘图软件测一下
if(left == 250)//这里用到了正常显示下的左栏是250像素宽
{
if(m_dcMem != NULL)
{
m_dcMem.SelectObject(m_bitmapleft);//这个DC选择左箭头的图片
}
}
else
{
if(m_dcMem != NULL)
{
m_dcMem.SelectObject(m_bitmapright);//这个DC选择右箭头的图片
}
}
}
(4)重载OnDrawSplitter函数,画出该按钮:
void CMySplitter::OnDrawSplitter(CDC* pDC, ESplitType nType,
const CRect& rect)
{
// TODO: 在此添加专用代码和/或调用基类
CSplitterWnd::OnDrawSplitter(pDC, nType, rect);//本来的画分隔栏

if(pDC != NULL)
{
if(m_dcMem == NULL)
{
m_dcMem.CreateCompatibleDC(NULL);//CreateCompatibleDC参数为NULL表示创建一个与当前显示器兼容的DC
}
GetImgBtnRect();
pDC->BitBlt(m_rectImgBtn.left, m_rectImgBtn.top,
m_rectImgBtn.Width(), m_rectImgBtn.Height(),
&m_dcMem, 0, 0, SRCCOPY);//从m_dcMem中把图片复制到pDC中并画出来(大概是这个意思)
}
}
}
(5)重载OnLButtonUp函数,使得点击该“按钮”时可以收起或者展开左栏
void CMySplitter::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
GetImgBtnRect();
if(m_rectImgBtn.PtInRect(point))//如果鼠标当前是在“按钮”区域内
{
//这里判断一下左栏是否收起了,如果是,隐藏左栏;不是则显示左栏
//通过GetColumnInfo和SetColumnInfo

}
else
{
CSplitterWnd::OnLButtonUp(nFlags, point);
}
}
(6)重载OnMouseMove函数,当鼠标移动到“按钮”上时,把鼠标形状变成手形
void CMySplitter::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
GetImgBtnRect();
if(m_rectImgBtn.PtInRect(point))
{
::SetCursor(LoadCursor(NULL, IDC_HAND));
}
else
{
::SetCursor(LoadCursor(NULL, IDC_ARROW));
}
}

免责声明:文章转载自《使用CSplitterWnd分割窗口》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇倒排表数据结构、通配符查询、拼写纠正详解数学和编程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【snmp】win7安装和配置snmp

一、安装SNMP 1、打开控制面板—>程序和功能—>打开或关闭Windows功能 勾上复选框,点击确定按钮 2、开始安装SNMP 3、snmp安装完成,需要重启计算机才能生效,可以立即重启或稍后重启  安装完成后,再次打开控制面板—>程序和功能—>打开或关闭Windows功能,简单网络管理协议(SNMP)这里是勾选上的   二...

5.1 jQuery基础

1. jquery.com 下载     api.jQuery.com 查看api  important!!! 2. 绑定事件     http://api.jquery.com/category/events/   bind():attach a handler to an event, As of jQuery 1.7, the .on() metho...

Android单元测试

Android提供了上面的多个测试类,可以允许我们对于单个方法、Activity、Service、Application等多个对象进行测试,单元测试可以很方便的让我们对代码进行测试,并且方便对重构后的代码进行检查。本篇将简要的讲解如何对Android中的对象进行测试。 一、准备工作 首先在manifest.xml中添加权限和相关配置代码。 在Applic...

用PopupWindow实现弹出菜单(弹出的菜单采用自定义布局)

     用PopupWindow实现弹出菜单是一个比较好的方式。当然我们还有一个类PopupMenu也能实现弹出菜单,但那个太过于局限了,所以不是很推荐。 这个实例的效果是这样的:点击按钮后,一个菜单从屏幕的右边滑入到屏幕中,点击按钮/空白处后菜单消失。 布局文件时一个按钮,我就不贴出代码了。下面是菜单的布局: <?xml version="1.0...

vue 公用组件开发 确认框confirm

文件目录: github地址:https://github.com/xingkongwuyu/vue-spa-experience/tree/master/src/components 最终的效果:  组件的源码解析: confirm :  confirm的框架 ./index.js import confirmBox from './src/inde...

03- web表单测试

软件分为 b/s c/s两种架构 表单测试 1.用户注册,登录,信息提交。 2.用户查询商品。 3.用户订购商品。 4.用户查询订单等。 表单测试实例   表单数据添加测试(一) 添加按钮可用,测试点击添加按钮,能够进入响应的添加页面; 进入添加页面,验证输入字段和需求描述一致; 所有的输入字段输入合法数据;  表单数据添加测试(二) 重复提交信息,如一...