您的位置:首页 > 其它

截图功能实现(二)如何框选区域

2013-05-30 13:11 836 查看
用过QQ截图的人都知道在我们按下快捷键截图时,我们可以用鼠标随意框选我们需要的区域,而且选中的区域变成高亮,今天就和大家说说这事如何实现的。
1.橡皮筋类的实现

 
  网上有一个橡皮筋类能够实现这种效果,如果急着用又不想自己写可以网上下过来试试,但是今天说说它的原理,其实框选区域就是在你鼠标左键按下到你左键抬起这个过程中鼠标移动的的这块矩形区域




   如图起点为左上角,终点为右下角,其实我们再框选时,先记录起点,终点为鼠标移动时就是onmousemove时的点这样看起来就好像矩形区域跟随鼠标在调整大小,到鼠标抬起时记录下点。这里我们把起点记为m_ptBegin,终点记为m_ptEnd。图中还标明其他几个点这几个点是可拖拽区域,就像QQ一样鼠标放上去会改变鼠标样子,我是在主对话框的OnSetCursor函数里设置的,具体关于如何改变鼠标的样子可网上查找资料。

   我们已经知道了一个矩形的起点和终点那么这个8个点我们就知道坐标我们都能知道,这里把这几个点记录下来这里用CPointm_ptKeyPoint[8]来存储着8个点。那么我们再鼠标移动的时候判断点十分在这8个点上来改变鼠标的样子,那么如何拖动矩形能,这里分为2种,

   第一种是拖动整个矩形

这个很简单在在我们鼠标左键在矩形区域点击后保存这个点击的坐标记为CPointm_ptInRect,我们已经知道了起点和终点的坐标了,那么我们就可以算出m_ptInRect 与 起点m_ptBegin终点m_ptEnd 的偏移值,那么在移动鼠标的时候保持这2个偏移值就可以拖动整个矩形了。

   第2种拖动某个点改变矩形区域

举个例子,我们点击6这个点要拖动,那么只能让其上下拖动也就是说只能改变矩形的高度,一次我们需要记录这个时候鼠标的Y坐标(X坐标忽略)并把Y坐标设置为终点的Y坐标。拖动其他几个点也是这样的只是在拖动时候记住合理的改变起点和终点坐标。

OK这样我们就可以随意的拖动这个矩形区域了,也差不多实现了橡皮筋类的功能,但是也没有发现框选的区域是高亮,单单上面的做法是无法实现的,那么要这么做呢?
2.高亮矩形区域
void CScreenShotDlg::DrawArea( CDC * pMemDC )
{
CDCdcTemp;
dcTemp.CreateCompatibleDC(pMemDC);
//大小
LONG lWidth= abs(m_BeginPoint.x - m_EndPoint.x);
LONG lHeight= abs(m_BeginPoint.y - m_EndPoint.y);
//关键代码区域
{

CBitmap*pOldBitmap = dcTemp.SelectObject(m_pBitmap);

pMemDC->BitBlt(__min(m_BeginPoint.x,m_EndPoint.x),__min(m_BeginPoint.y,m_EndPoint.y),
lWidth,lHeight,&dcTemp,__min(m_BeginPoint.x,m_EndPoint.x),__min(m_BeginPoint.y,m_EndPoint.y),SRCCOPY);
dcTemp.SelectObject(pOldBitmap);
}

dcTemp.DeleteDC();
}


其实原来很简单,就是创建一个兼容DC把我们前面保存下来的为选入DC,把刚才框选的那个区域找到在兼容DC中的位置调用BitBlt贴到主对话框框选的位置这样就实现了高亮,是不是很简单啊。下面一章讲讲如何实现放大器功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对话框 MFC 截图