WTL CSplitterWindow 修改

本文介绍如何定制WTL的CSplitterWindow,包括限制分隔条的移动范围及调整双击分隔条的行为,使其更符合实际需求。

WTL的分割窗口CSplitterWindow非常好用。具体参见我的 http://data.blueanywhere.cn/wtl/ 第7章节

但美中不足的是有两点:

  1. 没有设置移动范围
  2. 双击分隔条每次都是默认居中分隔,其实这个很多时候不是本意,双击应该是最恰当的而不是最居中的。

幸好WTL全部有代码,小修小补一下即可满足以上要求。打开相关的文件:c:\YourWTL\include\atlsplit.h

红色是修改部分 

 

1.增加内部变量

	
class CSplitterImpl
{
public:
	enum { m_nPanesCount = 2, m_nPropMax = 10000 };

HWND m_hWndPane[m_nPanesCount];
	RECT m_rcSplitter;
	int m_xySplitterPos;
	int m_nDefActivePane;
	int m_cxySplitBar;              // splitter bar width/height
	static HCURSOR m_hCursor;
	int m_cxyMin;                   // minimum pane size

	int m_cxyMax;			//【修改之处】cxyMax = -1 就是没设置,和原来一样
	int m_cxyMid;			//【修改之处】cxyMid = -1 就是没,和原来一样
				
	int m_cxyBarEdge;              	// splitter bar edge
	bool m_bFullDrag;
	int m_cxyDragOffset;
	int m_nProportionalPos;
	bool m_bUpdateProportionalPos;
	DWORD m_dwExtendedStyle;       // splitter specific extended styles
	int m_nSinglePane;             // single pane mode


 

 2. 初始化

 

// Constructor
	CSplitterImpl() :
			m_xySplitterPos(-1), m_nDefActivePane(SPLIT_PANE_NONE), 
			m_cxySplitBar(0), m_cxyMin(0),
			m_cxyMax(-1),m_cxyMid(-1),//【修改之处】
			m_cxyBarEdge(0), m_bFullDrag(true), 
			m_cxyDragOffset(0), m_nProportionalPos(0), m_bUpdateProportionalPos(true),
			m_dwExtendedStyle(SPLIT_PROPORTIONAL),
			m_nSinglePane(SPLIT_PANE_NONE)


 

 3.双击处理

	LRESULT OnLButtonDoubleClick(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		T* pT = static_cast<T*>(this);

		if (m_cxyMid == -1 ) {//【修改之处】
			pT->SetSplitterPos();   // middle
		}
		else {
			pT->SetSplitterPos(m_cxyMid,true);//【修改之处】
		}
		return 0;
	}


4.移动范围设定 SetSplitterPos

	bool SetSplitterPos(int xyPos = -1, bool bUpdate = true)
	{
		if(xyPos == -1)   // -1 == middle
		{
			if(t_bVertical)
				xyPos = (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) / 2;
			else
				xyPos = (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge) / 2;
		}

		// Adjust if out of valid range
		int cxyMax = 0;

		if (m_cxyMax == -1 ) {//【修改之处】
			if(t_bVertical)
				cxyMax = m_rcSplitter.right - m_rcSplitter.left;
			else
				cxyMax = m_rcSplitter.bottom - m_rcSplitter.top;
		}
		else {//【修改之处】
			if(t_bVertical)
				cxyMax = ((m_rcSplitter.right - m_rcSplitter.left)>m_cxyMax?m_cxyMax:(m_rcSplitter.right - m_rcSplitter.left));//【修改之处】
			else
				cxyMax = ((m_rcSplitter.bottom - m_rcSplitter.top)>m_cxyMax?m_cxyMax:(m_rcSplitter.bottom - m_rcSplitter.top));//【修改之处】
		}

		if(xyPos < m_cxyMin + m_cxyBarEdge)
			xyPos = m_cxyMin;
		else if(xyPos > (cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin))
			xyPos = cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin;


设置一下编译通过了。我的应用程序里这么处理,初始化一下系统变量

 

CSplitterWindow  m_wndVertSplit;
.......
	m_wndVertSplit.m_cxySplitBar = 1;
	m_wndVertSplit.m_cxyMin = 80;
	m_wndVertSplit.m_cxyMax = 480;
	m_wndVertSplit.m_cxyMid = 200;

 

然后分割条就只能在80-480之间移动了,双击分割条,自动恢复到200的位置,而不是原来的中间位置。

 

以上修改在 Visual C++ 6.0 WTL 8.0 通过
 

爬虫(Web Crawler)是一种自动化程序,用于从互联上收集信息。其主要功能是访问页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对站造成过大负担或触发反爬虫机制,爬虫需要遵守站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重站的使用政策,并确保对被访问站的服务器负责。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值