当前位置: 源码素材网 » VC++教程 » 详情页

VC++实现拖放选中对象的方法

  •   时间:2019-04-14
  • 概述:拖放选择

VC++拖放选中对象,本例介绍如何拖放选中的图形对象,编译并运行本例程序,红色圆圈可以用鼠标随意拖动。实现方法:当鼠标左键在图形区域被按下时,捕捉所有鼠标消息,并且响应鼠标移动消息,随时更新图形的位置,重画图形。程序代码如下:
(1)利用AppWizard 创建单文档的应用程序MoveSelOb,并且选择视图类的基类为CScrollView。
(2)在视图类的头文件中增加4 个变量,用来保存图形位置和鼠标捕捉情况,其代码如下:

protected:
const CSize m_sizeEllipse;
CPoint m_pointTopLeft;
CSize m_sizeOffset;
BOOL m_bCaptured;

(3)在视图类的构造函数中初始化变量,其代码如下:

CMoveSelObView::CMoveSelObView() : m_sizeEllipse(100, -100),
m_pointTopLeft(0, 0),
m_sizeOffset(0, 0)
{
m_bCaptured = FALSE;
}

(4)在视图类的OnInitialUpdate 函数中初始化视图的滚动范围。

void CMoveSelObView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
//设置滚动范围
CSize sizeTotal(800, 1050); // 8-by-10.5 inches
CSize sizePage(sizeTotal.cx / 2, sizeTotal.cy / 2);
CSize sizeLine(sizeTotal.cx / 50, sizeTotal.cy / 50);
SetScrollSizes(MM_LOENGLISH, sizeTotal, sizePage, sizeLine);
}

(5)在视图类的OnDraw 函数中绘图,其代码如下:

void CMoveSelObView::OnDraw(CDC* pDC)
{
CMoveSelObDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//创建红色画刷
CBrush brushHatch(HS_DIAGCROSS, RGB(255, 0, 0));
CPoint point(0, 0);
//转换逻辑坐标到设备坐标
pDC->LPtoDP(&point);
pDC->SetBrushOrg(point);
CBrush* pOldBrush = pDC->SelectObject(&brushHatch);
//画红色圆圈
pDC->Ellipse(CRect(m_pointTopLeft, m_sizeEllipse));
pDC->SelectObject(pOldBrush);
// TODO: add draw code for native data here
}

(6)响应WM_LBUTTONDOWN 消息,其代码如下:

void CMoveSelObView::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rectEllipse(m_pointTopLeft, m_sizeEllipse);
CRgn circle;
CClientDC dc(this);
OnPrepareDC(&dc);
dc.LPtoDP(rectEllipse);
circle.CreateEllipticRgnIndirect(rectEllipse);
if (circle.PtInRegion(point)) {
//捕捉鼠标
SetCapture();
m_bCaptured = TRUE;
CPoint pointTopLeft(m_pointTopLeft);
dc.LPtoDP(&pointTopLeft);
m_sizeOffset = point - pointTopLeft;
//设置光标形状为十字状
::SetCursor(::LoadCursor(NULL, IDC_CROSS));
}
CScrollView::OnLButtonDown(nFlags, point);
}

(7)响应WM_LBUTTONUP 消息:

void CMoveSelObView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_bCaptured) {
//释放鼠标捕捉
::ReleaseCapture();
m_bCaptured = FALSE;
}
CScrollView::OnLButtonUp(nFlags, point);
}

(8)响应WM_MOUSEMOVE 消息:

void CMoveSelObView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bCaptured) {
//如果有图形被选中,并且鼠标被捕捉则更新图形位置
CClientDC dc(this);
OnPrepareDC(&dc);
CRect rectOld(m_pointTopLeft, m_sizeEllipse);
dc.LPtoDP(rectOld);
//擦除老位置的图形
InvalidateRect(rectOld, TRUE);
m_pointTopLeft = point - m_sizeOffset;
dc.DPtoLP(&m_pointTopLeft);
//在新位置画图形
CRect rectNew(m_pointTopLeft, m_sizeEllipse);
dc.LPtoDP(rectNew);
InvalidateRect(rectNew, TRUE);
}
CScrollView::OnMouseMove(nFlags, point);
}

    相关内容:

    相关声明:

      若“VC++实现拖放选中对象的方法”有损您的权益,请告之我们删除内容。
      部分文章来源于网络,版权归原作者所有。