《电子尺》V1.02程序开发实例
2010-05-12 20:35:30 来源:WEB开发网重载鼠标左击的消息处理函数,两次单击后向父窗口发送一个自定义的消息WM_ENDCLICK
void Target::OnLButtonDown(UINT nFlags, CPoint point)
{//如果第一次按左击
if(bSecond==FALSE)
{
//记录按下的坐标
startPos=point;
//改变标记
bSecond=TRUE;
//恢复原来的屏幕
pDC->BitBlt(0,0,cxScreen,cyScreen,&MemDC,0,0,SRCCOPY);
//定义一个红色的笔
CPen pen(PS_SOLID,2,RGB(255,0,0));
CPen* pOldPen;
//选入红色的笔,并且记录原来的笔
pOldPen=pDC->SelectObject(&pen);
//画一个红色的标记
pDC->MoveTo(point.x-10,point.y);
pDC->LineTo(point.x+10,point.y);
pDC->MoveTo(point.x,point.y-10);
pDC->LineTo(point.x,point.y+10);
//装入原来的笔,用于在其他辅助线
pDC->SelectObject(pOldPen);
//删除红色的笔
::DeleteObject(pen.m_hObject);
//将带有红色标记的屏幕图片保存到MemDC中
MemDC.BitBlt(0,0,cxScreen,cyScreen,pDC,0,0,SRCCOPY);
}
else//如果第二次单击
{
//记录终点坐标
endPos=point;
//调用计算长度的函数
Calculate();
//将当前DC和临时内存DC删除
pDC->DeleteDC();
MemDC.DeleteDC();
//撤销窗口
DestroyWindow();
//向父窗口发送一个自定义的WM_ENDCLICK
pWndParent->PostMessage(WM_ENDCLICK);
}
CWnd::OnLButtonDown(nFlags, point);
}
重载鼠标右击的消息处理函数,测量时按下右键就取消测量,向父窗口发送WM_CANCELCLICK自定义消息。
void Target::OnRButtonUp(UINT nFlags, CPoint point)
{
CWnd::OnRButtonUp(nFlags, point);
//删除不用的DC
pDC->DeleteDC();
MemDC.DeleteDC();
DestroyWindow();
pWndParent->PostMessage(WM_CANCELCLICK);
}
Target类中的Calculate方法用于计算不同单位的长度。不同的单位主要取决于SetMapMode的参数。
void Target::Calculate()
{
//x、y用于记录两点坐标差
double x,y;
x=endPos.x-startPos.x;
y=endPos.y-startPos.y;
//默认情况下,计算的是像素的单位
iLen_p=(int)sqrt(x*x + y*y);
CDC* pDC;
pDC=GetDC();
//将当前窗口的映射模式改为MM_LOMETRIC,这样逻辑坐标的单位为0.1mm
pDC->SetMapMode(MM_LOMETRIC);
POINT tmpStart=startPos;
POINT tmpEnd=endPos;
//将设备坐标改为逻辑坐标
pDC->DPtoLP(&tmpStart);
pDC->DPtoLP(&tmpEnd);
x=tmpEnd.x-tmpStart.x;
y=tmpEnd.y-tmpStart.y;
dLen_m=sqrt(x*x + y*y);
//映射模式改为MM_LOENGLISH的话,逻辑坐标的单位为0.01inch
pDC->SetMapMode(MM_LOENGLISH);
tmpStart=startPos;
tmpEnd=endPos;
pDC->DPtoLP(&tmpStart);
pDC->DPtoLP(&tmpEnd);
x=tmpEnd.x-tmpStart.x;
y=tmpEnd.y-tmpStart.y;
dLen_i=sqrt(x*x + y*y);
ReleaseDC(pDC);
}
这样整个Target类就定义完了,接着再主对话框中调用该类,首先将Target类的对象作为自己的一个成员变量。在主对话框类中最重要的就是接受两个自定义的消息WM_ENDCLICK和WM_CANCELCLICK,分别表示结束测量和取消测量。
具体程序详见源程序,这里就不再说明了。
本文配套源码
更多精彩
赞助商链接