MFC 从对话框的picture控件上矩形截图

时间:2022-08-21 15:23:52
现在图片已经加载成功,picture控件属性FRAME,加载后带有滚动条,想要用鼠标画一块矩形区域并将其加载到预览窗口,可是鼠标在picture控件的图片上不能画矩形,在picture控件外却可以画矩形。求大神指教是图片载入的问题,还是OnLButtonDown的问题,或者是其他什么原因造成的?

14 个解决方案

#1


大神快快来 MFC 从对话框的picture控件上矩形截图

#2


我也遇到相同的问题,坐等大神来 MFC 从对话框的picture控件上矩形截图

#3


重载Picture控件,在里面画图。

#4


引用 3 楼 Mackz 的回复:
重载Picture控件,在里面画图。

对MFC不是很熟,如何重载Picture控件,能不能具体一点,谢谢!

#5


使用MFC类CRectTracker//像皮筋类就可以实现画矩形,通过橡皮筋类得到的Rect来重新对图片进行定位画出来就可以了。 

//.h
CRectTracker m_rectTracker;     //像皮筋类
//.cpp
void CSDIForCWPView::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
m_rectTracker.TrackRubberBand(this,point,TRUE);
m_rectTracker.m_rect.NormalizeRect();
CView::OnLButtonDown(nFlags, point);

this->SendMessage(WM_LBUTTONUP,NULL,NULL);
}
void CSDIForCWPView::OnLButtonUp(UINT nFlags, CPoint point) 
{
   ...
CDC *pDC = GetDC();
CDC dc;

dc.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,m_rectTracker.m_rect.Width()-2,m_rectTracker.m_rect.Height()-2);
CBitmap *pOldBmp;
pOldBmp = dc.SelectObject(&bmp);
dc.BitBlt(0,0,m_rectTracker.m_rect.Width()-2,m_rectTracker.m_rect.Height()-2,
      &m_dcComplex,m_rectTracker.m_rect.left+1,m_rectTracker.m_rect.top+1,SRCCOPY);
dc.SelectObject(pOldBmp);
...
...
}

#6


现在是点击picture控件内的图片,都没有调用OnLButtonDown函数,为什么会这样?

#7


大神指点一下吧 MFC 从对话框的picture控件上矩形截图

#8


顶一下,别沉了

#9


引用 6 楼 zjugrief 的回复:
现在是点击picture控件内的图片,都没有调用OnLButtonDown函数,为什么会这样?

因为你没有设置picture控件的Notify属性

#10


引用 9 楼 zhoujielunzhimi 的回复:
引用 6 楼 zjugrief 的回复:现在是点击picture控件内的图片,都没有调用OnLButtonDown函数,为什么会这样?
因为你没有设置picture控件的Notify属性

你所说的notyfy属性是指将其改为True还是重载picture控件类,以CStatic为基类,设置dwStyle |= SS_NOTIFY;
ps:我试过将Notify属性改为True,改完之后,在picture控件上按下鼠标就开始画矩形,我本来是要实现点击处理图像按钮后在在picture控件上画矩形,现在还没点处理按钮就开始有鼠标响应。请问如何实现我本来的目标。

#11


两种方式都可以。如果只是处理picture中的图片,建议还是继承CStatic比较好。

#12


该回复于2013-04-15 09:00:14被管理员删除

#13


引用 11 楼 zhoujielunzhimi 的回复:
两种方式都可以。如果只是处理picture中的图片,建议还是继承CStatic比较好。

现在可以在picture控件上画矩形框了,问题是不管鼠标从哪个点开始画,它都默认将控件左上角作为矩形的左上角。请问这个问题怎么解决?

#14


楼主,这个问题解决了没?我现在也碰到这种问题了,具体如何处理啊?

#1


大神快快来 MFC 从对话框的picture控件上矩形截图

#2


我也遇到相同的问题,坐等大神来 MFC 从对话框的picture控件上矩形截图

#3


重载Picture控件,在里面画图。

#4


引用 3 楼 Mackz 的回复:
重载Picture控件,在里面画图。

对MFC不是很熟,如何重载Picture控件,能不能具体一点,谢谢!

#5


使用MFC类CRectTracker//像皮筋类就可以实现画矩形,通过橡皮筋类得到的Rect来重新对图片进行定位画出来就可以了。 

//.h
CRectTracker m_rectTracker;     //像皮筋类
//.cpp
void CSDIForCWPView::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
m_rectTracker.TrackRubberBand(this,point,TRUE);
m_rectTracker.m_rect.NormalizeRect();
CView::OnLButtonDown(nFlags, point);

this->SendMessage(WM_LBUTTONUP,NULL,NULL);
}
void CSDIForCWPView::OnLButtonUp(UINT nFlags, CPoint point) 
{
   ...
CDC *pDC = GetDC();
CDC dc;

dc.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,m_rectTracker.m_rect.Width()-2,m_rectTracker.m_rect.Height()-2);
CBitmap *pOldBmp;
pOldBmp = dc.SelectObject(&bmp);
dc.BitBlt(0,0,m_rectTracker.m_rect.Width()-2,m_rectTracker.m_rect.Height()-2,
      &m_dcComplex,m_rectTracker.m_rect.left+1,m_rectTracker.m_rect.top+1,SRCCOPY);
dc.SelectObject(pOldBmp);
...
...
}

#6


现在是点击picture控件内的图片,都没有调用OnLButtonDown函数,为什么会这样?

#7


大神指点一下吧 MFC 从对话框的picture控件上矩形截图

#8


顶一下,别沉了

#9


引用 6 楼 zjugrief 的回复:
现在是点击picture控件内的图片,都没有调用OnLButtonDown函数,为什么会这样?

因为你没有设置picture控件的Notify属性

#10


引用 9 楼 zhoujielunzhimi 的回复:
引用 6 楼 zjugrief 的回复:现在是点击picture控件内的图片,都没有调用OnLButtonDown函数,为什么会这样?
因为你没有设置picture控件的Notify属性

你所说的notyfy属性是指将其改为True还是重载picture控件类,以CStatic为基类,设置dwStyle |= SS_NOTIFY;
ps:我试过将Notify属性改为True,改完之后,在picture控件上按下鼠标就开始画矩形,我本来是要实现点击处理图像按钮后在在picture控件上画矩形,现在还没点处理按钮就开始有鼠标响应。请问如何实现我本来的目标。

#11


两种方式都可以。如果只是处理picture中的图片,建议还是继承CStatic比较好。

#12


该回复于2013-04-15 09:00:14被管理员删除

#13


引用 11 楼 zhoujielunzhimi 的回复:
两种方式都可以。如果只是处理picture中的图片,建议还是继承CStatic比较好。

现在可以在picture控件上画矩形框了,问题是不管鼠标从哪个点开始画,它都默认将控件左上角作为矩形的左上角。请问这个问题怎么解决?

#14


楼主,这个问题解决了没?我现在也碰到这种问题了,具体如何处理啊?