当前位置: 首页 > news >正文

MFC静态分割后锁定分隔条/限制分隔条的移动范围 方法1

重载:OnLButtonDown(UINT nFlags, CPoint point),OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 以及OnMouseMove(UINT nFlags, CPoint point)几个函数,前两个函数的重载也可以达到锁定的效果,第三个函数也就是OnMouseMove()的重载则是为了限定移动的范围

步骤:

1。新创建MFC类,从CSplitterWnd继承,并重载WM_LBUTTONDOWN ,WM_MOUSEMOVE 和 WM_SETCURSOR消息响应函数。

2。新构造的MySplitterWnd 使用方法和CSplitterWnd一样。

通过MFC类向导,构造MySplitterWnd 时,找不到基类CSplitterWnd,可以先选择CWnd,(generic CWnd)然后手动把基类改成CSplitterWnd。

重载WM_LBUTTONDOWN ,WM_MOUSEMOVE 和 WM_SETCURSOR消息响应函数

 

void MySplitterWnd ::OnLButtonDown(UINT nFlags, CPoint point)
{
	//CSplitterWnd::OnLButtonDown(nFlags, point);
	CWnd::OnLButtonDown(nFlags, point);
}


void MySplitterWnd itterWnd::OnMouseMove(UINT nFlags, CPoint point)
{
	//CSplitterWnd::OnMouseMove(nFlags, point);
	CWnd::OnMouseMove(nFlags, point);
}


BOOL MySplitterWnd ::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	//return CSplitterWnd::OnSetCursor(pWnd, nHitTest, message);
	return CWnd::OnSetCursor(pWnd, nHitTest, message);
}

代码:

void MySplitterWnd::OnLButtonDown(UINT nFlags, CPoint point)
{     
    // 直接返回,不处理
 return;
}

BOOL MySplitterWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{   
    // 当光标进入分割窗口时,不允许改变样子,不处理
 return FALSE;
}

void MySplitterWnd::OnMouseMove(UINT nFlags, CPoint point)
{       
 //将CSplitter类的处理改为由CWnd处理
 //CSplitterWnd::OnMouseMove(nFlags, point);

 if(point.x<250||point.x>500) CWnd::OnMouseMove(nFlags, point); 
 else  CSplitterWnd::OnMouseMove(nFlags, point);

 }

好了,其实到了这里还没有完,刚说到锁定的问题,大家可以发现如果三个函数这样子写你的分隔条直接不能动了,和刚才的截取消息的锁定效果一摸一样,但是关于第三个函数OnMouseMove()的实际作用其实是限定范围,if(point.x<250||point.x>500) CWnd::OnMouseMove(nFlags, point); 
 else  CSplitterWnd::OnMouseMove(nFlags, point); 这两句的意思是说将移动范围锁定在250和500之间(这个数值大家可以随便设置),为了要使得这个函数生效,大家可以把前面两个也就是OnLButtonDown()和OnSetCursor()屏蔽掉,只留下第三个OnMouseMove()就可以达到限制范围的效果了,当然只屏蔽掉OnLButtonDown()函数也是可以的,因为OnSetCursor()函数只是改变光标样子用的,(锁定的另一个方法其实就是只用前面两个,既屏蔽掉OnMouseMove(),这个函数,大家可以自己试试,分别屏蔽看会出现什么效果)

MySplitterWnd.h和MySplitterWnd.cpp分别如下:

MySplitterWnd.h:

#if !defined(AFX_MYSPLITTERWND_H__3A9C0767_32C8_4858_B057_8E48E4A2636B__INCLUDED_)
#define AFX_MYSPLITTERWND_H__3A9C0767_32C8_4858_B057_8E48E4A2636B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MySplitterWnd.h : header file
//

/
// MySplitterWnd window

class MySplitterWnd : public CSplitterWnd
{
protected:
CSplitterWnd m_wndSplitter;
// Construction
public:
MySplitterWnd();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(MySplitterWnd)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~MySplitterWnd();

// Generated message map functions
protected:
//{{AFX_MSG(MySplitterWnd)
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

/

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYSPLITTERWND_H__3A9C0767_32C8_4858_B057_8E48E4A2636B__INCLUDED_)

MySplitterWnd.cpp:

// MySplitterWnd.cpp : implementation file
//

#include "stdafx.h"
#include "FCDoubleTest.h"
#include "MySplitterWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// MySplitterWnd

MySplitterWnd::MySplitterWnd()
{
}

MySplitterWnd::~MySplitterWnd()
{
}


BEGIN_MESSAGE_MAP(MySplitterWnd, CSplitterWnd)
//{{AFX_MSG_MAP(MySplitterWnd)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/
// MySplitterWnd message handlers

void MySplitterWnd::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

//CWnd::OnMouseMove(nFlags, point);
/*
if(point.x<250||point.x>500) CWnd::OnMouseMove(nFlags, point);
else CSplitterWnd::OnMouseMove(nFlags, point);
*/

}

void MySplitterWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

//CWnd::OnLButtonDown(nFlags, point);
return;
}

BOOL MySplitterWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default

//return CWnd::OnSetCursor(pWnd, nHitTest, message);
return false;
}

说的可能有些不清楚,不清楚的也没关系,可以直接将上面的MySplitterWnd.h和MySplitterWnd.cpp导入到自己的工程中,直接用就行了,将你要锁定或者限制移动范围的分割区域用MySplitterWnd定义,不做限制,锁定的区域用CSplitterWnd类定义,这样子就可以做到有选择的限制锁定某几个分割区域的效果.

 

转载于:https://www.cnblogs.com/vipwtl/p/5889049.html

相关文章:

  • 异常 ORA-00257: archiver error. Connect internal only, until freed
  • 判断32位整数二进制中1的个数的算法
  • json化 datatable
  • 乐视云视频 接口开发 结合百度编辑器
  • css 布局
  • code异常处理
  • 直线方程公式
  • python中的tab补全功能添加
  • 一个失败团队的养成
  • 利用CSS3 clip-path裁剪各种图形。
  • [BZOJ4016][FJOI2014]最短路径树问题
  • 计数问题
  • 排序算法总结第二弹----冒泡排序---javascript描述
  • Codeforces710C【数学】
  • 【20160924】GOCVHelper 图像处理部分(2)
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • java第三方包学习之lombok
  • JS笔记四:作用域、变量(函数)提升
  • Service Worker
  • tweak 支持第三方库
  • Vue2.0 实现互斥
  • 后端_MYSQL
  • 跨域
  • 如何合理的规划jvm性能调优
  • 微信小程序填坑清单
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #etcd#安装时出错
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (定时器/计数器)中断系统(详解与使用)
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)php投票系统 毕业设计 121500
  • (七)Knockout 创建自定义绑定
  • (三)c52学习之旅-点亮LED灯
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)重识new
  • .gitignore文件---让git自动忽略指定文件
  • .NET Standard 的管理策略
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .Net接口调试与案例
  • .net与java建立WebService再互相调用
  • @RequestMapping用法详解
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [20190416]完善shared latch测试脚本2.txt
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [BJDCTF2020]The mystery of ip1
  • [bug总结]: Feign调用GET请求找不到请求体实体类