高分求教:WINDOWS画图工具上对某一选定区域拖动是怎么实现的? 最好有源码,谢谢各位了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1。 在mousemove中不断的画啊,画啊……2。 拖动时生成一个小窗口,把区域位图放到它上面,然后mousemove中移动窗口 用CRectTracker全局变量CRect rect;CRectTracker tracker;//OnDraw()tracker.m_rect=rect;//OnSetCursor()tracker.SetCursor();//OnInitUpdate()tracker.m_nStyle=CRectTracker::resizeOutside;tracker.m_rect=CRect(0,0,100,100);//OnMouseDown()if(rect.PtInRect(point)){ tracker.Track(this,point);}//OnMouseUp(){ rect=tracker.m_rect;} 请大家不用把封装和实现功能等同!实现功能可以没有类,这时所关注的是如何实现(这里面很大一部分工作是与windows之间的"合作"); 然后可以考虑怎么实现更好,当然可以使用oo。这两步是头脑中的基本步骤,不一定是程序要写两边。大系统可以使用软工方法,小程序脑子想清楚就行了。 简单演示一下,刷新需要优化。在CImageEditView定义加protected: CBitmap m_bmpDrag; CDC m_dcDrag; CRect m_rcDrag; BOOL m_bDown; CRect m_rcOldDrag;void CImageEditView::OnDraw(CDC* pDC){ // 根据无效区画背景图}void CImageEditView::OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); CDC* pDC = GetDC(); m_dcDrag.SelectObject(&m_bmpDrag); m_dcDrag.BitBlt(0, 0, m_rcDrag.Width(), m_rcDrag.Height(), pDC, point.x - m_rcDrag.Width() / 2, point.y - m_rcDrag.Height() / 2, SRCCOPY); ReleaseDC(pDC); m_rcOldDrag.left = point.x - m_rcDrag.Width() / 2; m_rcOldDrag.top = point.y - m_rcDrag.Height() / 2; m_rcOldDrag.right = m_rcOldDrag.left + m_rcDrag.Width(); m_rcOldDrag.bottom = m_rcOldDrag.top + m_rcDrag.Height(); m_bDown = TRUE; CScrollView::OnLButtonDown(nFlags, point);}void CImageEditView::OnLButtonUp(UINT nFlags, CPoint point) { ReleaseCapture(); m_bDown = FALSE; CScrollView::OnLButtonUp(nFlags, point);}void CImageEditView::OnMouseMove(UINT nFlags, CPoint point) { if(m_bDown) { InvalidateRect(m_rcOldDrag); UpdateWindow(); // 以上两行可以优化,可在此直接用位图画无效区 CDC* pDC = GetDC(); pDC->BitBlt(point.x - m_rcDrag.Width() / 2, point.y - m_rcDrag.Height() / 2, m_rcDrag.Width(), m_rcDrag.Height(), &m_dcDrag, 0, 0, SRCCOPY); m_rcOldDrag.left = point.x - m_rcDrag.Width() / 2; m_rcOldDrag.top = point.y - m_rcDrag.Height() / 2; m_rcOldDrag.right = m_rcOldDrag.left + m_rcDrag.Width(); m_rcOldDrag.bottom = m_rcOldDrag.top + m_rcDrag.Height(); ReleaseDC(pDC); } CScrollView::OnMouseMove(nFlags, point);}int CImageEditView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CScrollView::OnCreate(lpCreateStruct) == -1) return -1; m_rcDrag.SetRect(0, 0, 150, 90); CDC* pDC = GetDC(); m_bmpDrag.CreateCompatibleBitmap(pDC, m_rcDrag.Width(), m_rcDrag.Height()); m_dcDrag.CreateCompatibleDC(pDC); ReleaseDC(pDC); return 0;} 关闭对话框后句柄还存在? 请教一个位图数据区的问题 vc有没有获得编码宏名的函数? 关于DDX的问题 你来当斑竹!愿意吗?redants.6to23.com 请来看看 关于控件reflect问题 使用下载的CDib类、怎么从资源里加载位图文件?是CDib::LoadFile(CFile&); @_@ 求助使用IHTMLDocument2怎么得到在微软浏览器中打开网页元素的ID 关于WM_VSCROLL消息问题。 有关Scripting.Dictionary CDialog::OnOK() 小弟出学,帮帮忙,在线等待! 如何提高我这个功能的效率呢?
2。 拖动时生成一个小窗口,把区域位图放到它上面,然后mousemove中移动窗口
全局变量
CRect rect;
CRectTracker tracker;
//
OnDraw()
tracker.m_rect=rect;
//
OnSetCursor()
tracker.SetCursor();
//
OnInitUpdate()
tracker.m_nStyle=CRectTracker::resizeOutside;
tracker.m_rect=CRect(0,0,100,100);
//
OnMouseDown()
if(rect.PtInRect(point))
{
tracker.Track(this,point);
}
//
OnMouseUp()
{
rect=tracker.m_rect;
}
在CImageEditView定义加
protected:
CBitmap m_bmpDrag;
CDC m_dcDrag; CRect m_rcDrag; BOOL m_bDown; CRect m_rcOldDrag;void CImageEditView::OnDraw(CDC* pDC)
{
// 根据无效区画背景图
}void CImageEditView::OnLButtonDown(UINT nFlags, CPoint point)
{
SetCapture(); CDC* pDC = GetDC();
m_dcDrag.SelectObject(&m_bmpDrag); m_dcDrag.BitBlt(0, 0, m_rcDrag.Width(), m_rcDrag.Height(), pDC,
point.x - m_rcDrag.Width() / 2,
point.y - m_rcDrag.Height() / 2,
SRCCOPY); ReleaseDC(pDC); m_rcOldDrag.left = point.x - m_rcDrag.Width() / 2;
m_rcOldDrag.top = point.y - m_rcDrag.Height() / 2;
m_rcOldDrag.right = m_rcOldDrag.left + m_rcDrag.Width();
m_rcOldDrag.bottom = m_rcOldDrag.top + m_rcDrag.Height(); m_bDown = TRUE; CScrollView::OnLButtonDown(nFlags, point);
}void CImageEditView::OnLButtonUp(UINT nFlags, CPoint point)
{
ReleaseCapture();
m_bDown = FALSE; CScrollView::OnLButtonUp(nFlags, point);
}void CImageEditView::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bDown)
{
InvalidateRect(m_rcOldDrag);
UpdateWindow();
// 以上两行可以优化,可在此直接用位图画无效区
CDC* pDC = GetDC(); pDC->BitBlt(point.x - m_rcDrag.Width() / 2,
point.y - m_rcDrag.Height() / 2,
m_rcDrag.Width(),
m_rcDrag.Height(),
&m_dcDrag,
0, 0, SRCCOPY); m_rcOldDrag.left = point.x - m_rcDrag.Width() / 2;
m_rcOldDrag.top = point.y - m_rcDrag.Height() / 2;
m_rcOldDrag.right = m_rcOldDrag.left + m_rcDrag.Width();
m_rcOldDrag.bottom = m_rcOldDrag.top + m_rcDrag.Height(); ReleaseDC(pDC);
} CScrollView::OnMouseMove(nFlags, point);
}int CImageEditView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
m_rcDrag.SetRect(0, 0, 150, 90); CDC* pDC = GetDC(); m_bmpDrag.CreateCompatibleBitmap(pDC, m_rcDrag.Width(), m_rcDrag.Height());
m_dcDrag.CreateCompatibleDC(pDC); ReleaseDC(pDC); return 0;
}