描述:将点画在图片时候,当点比较大的时候,需要将图片所在的控件放大,才能显示在图片上,而且显示的位置也不对,没改一次图片大小,画的点就会换一次位置,原因是坐标是相对于图片的像素大小而言的,也就是像素坐标。要想在mfc控件上显示准确的坐标,一种方法是将控件放大到和图片像素大小一下(显然不靠谱),而另一种方法就需要将坐标进行一个缩放了。
缩放的原理:
只需要将图片坐标系转换成控件坐标系即可,可通过公式控件宽/图片宽=x“/x=y”/y, 即可求出缩放后的坐标(x“,y”),而图片宽,控件宽能求,(x,y)已知。
代码(根据点坐标,在图片上画点):
//获取控件尺寸和位置 CRect rectCtrl; CStatic *p = (CStatic*)GetDlgItem(IDC_STATIC3); //p->MoveWindow(100, 100, 100, 100);//更改控件大小并移动其到指定位置 p->GetWindowRect(rectCtrl); this->ScreenToClient(rectCtrl); //GetDlgItem(IDC_STATIC_TEST)->GetClientRect(rectCtrl); int width = rectCtrl.Width(); int height = rectCtrl.Height(); OnBnClickedButton1(); //获取图片尺寸(pic为图片的类型) int cx = pic.GetWidth(); int cy = pic.GetHeight(); //开始画 OnBnClickedButton2(); CDC *pDC = m_pic.GetWindowDC(); CPen pen(PS_SOLID,4,RGB(255,0,0)); pDC->SelectObject(&pen); //point.x ==col //point.y ==row int i=0; int j=0; for(;i<5,j<5;i++,j++) { //将halcon类型的坐标转换成double类型,画点 double ti = hv_MatchingCol[i].D(); double tj = hv_MatchingRow[j].D(); //主要转换过程 pDC->Ellipse((ti/cx)*width,(tj/cy)*height,(ti/cx)*width+1,(tj/cy)*height+1); }
效果: