• 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类定义,这样子就可以做到有选择的限制锁定某几个分割区域的效果.
  • 相关阅读:
    Objects in this class cannot be updated outside
    操作系统原理好书推荐
    Can't initialize OCI
    比较好的GIS blog
    栅格数据开发
    arcgis 本地地图服务 silverlight 调用报错 .
    (转载)Rasterdataset Load data耗时
    网络达人梁宏达
    arcengine总结(1)栅格数据开发
    MyNPOI V1.2发布并开放源码,让.NET Excel导出将简单进行到底【转】
  • 原文地址:https://www.cnblogs.com/vipwtl/p/5889049.html
Copyright © 2020-2023  润新知