VC下使用橡皮筋类(Use CRectTracker)

 

使用CRectTracker,可以简单的实现操作系统下的选择框
声明与设置
//成员变量
CRectTracker m_RectTracker;

//设置RectTracker样式
m_RectTracker.m_nStyle = CRectTracker::resizeOutside|CRectTracker::solidLine;
m_RectTracker.m_nHandleSize = 6;
m_RectTracker.m_rect.SetRect(0,0,0,0);
实现点击代码如下:

CPoint m_ptStart;       //成员变量

//有关正规化矩形的解释:
//因为有可能出现矩形的起始点的X坐标大于终止点的X坐标
//这样在以后的操作中会引起不必要的麻烦,所以需要转换过来
//MFC已经定义好了这个函数m_rect.NormalizeRect()

void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
        // TODO: Add your message handler code here and/or call default
        if(m_RectTracker.HitTest(point)<0)      //如果未击中矩形选择框,重新画选择框
        {
                m_ptStart = point;      //保存起始点

                m_RectTracker.TrackRubberBand(this,point,TRUE);
                m_RectTracker.m_rect.NormalizeRect();   //正规化矩形

                //这时系统就屏蔽了WM_LBUTTONUP事件,所以需要自己发送消息(已删除,原因见下)
                /*SendMessage(WM_LBUTTONUP,NULL,NULL);*/
        }
        else    //如果击中矩形选择框
        {
                m_RectTracker.Track(this,point,TRUE);
                m_RectTracker.m_rect.NormalizeRect();   //正规化矩形
        }

        Invalidate();   //刷新窗口区域

        CDialog::OnLButtonDown(nFlags, point);
}

//Update: 2007/10/18
//经验证,删除此函数,CRectTracker仍可正常工作,此函数在没有特殊操作的情况下显得多余了
/*
void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
        // TODO: Add your message handler code here and/or call default

        //左键弹起,设置矩形
        CPoint ptEnd;
        GetCursorPos(&ptEnd);
        ScreenToClient(&ptEnd);

        m_RectTracker.m_rect.SetRect(m_ptStart,ptEnd);
        m_RectTracker.m_rect.NormalizeRect();   //正规化矩形

        Invalidate(); //刷新窗口区域
       
        CDialog::OnLButtonUp(nFlags, point);
}
*/
改变光标: (Update: 2008/01/30)
ps: 由于MFC的BUG问题,使用静态库时,会发生光标丢失的情况
具体解决方法: 1. Microsoft官方 2. VC静态库下CRectTracker鼠标光标(指针)不显示问题
谢谢haoder的提醒,更新了本文 :)

//注意:在使用静态MFC链接库时,会不起作用,请看相关解释
BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
        // TODO: Add your message handler code here and/or call default

        if (pWnd == this && m_RectTracker.SetCursor(this, nHitTest))
        {
                return TRUE;
        }
       
        return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
画矩形(自己实现):

void CMyDlg::OnPaint()
{
        if (IsIconic())
        {
                CPaintDC dc(this); // device context for painting

                SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

                // Center icon in client rectangle
                int cxIcon = GetSystemMetrics(SM_CXICON);
                int cyIcon = GetSystemMetrics(SM_CYICON);
                CRect rect;
                GetClientRect(&rect);
                int x = (rect.Width() - cxIcon + 1) / 2;
                int y = (rect.Height() - cyIcon + 1) / 2;

                // Draw the icon
                dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
                CPaintDC dc(this);
                dc.Draw3dRect(m_RectTracker.m_rect,0x000000,0x000000); //画矩形边界
               
                CDialog::OnPaint();
        }
}
其他可重载函数:
AdjustRect 当矩形被改变大小时此函数被调用
DrawTrackerRect 当画一个CRectTracker对象的边框时此函数被调用
OnChangedRect 当矩形被改变大小或被移动时,此函数被调用
GetHandleMask 调用此函数来获得一个CRectTracker项的调整大小把手的掩码



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值