MFC的图像控件上点击鼠标左键获得的坐标序列,通过内存容器保存。
1.容器<vector>
动态地向容器内部添加数据。
vector容易需要添加头文件:
#include<vecror>
using namespace std; 这个是比较容易忘记和忽略的。
容器变量定义:vector<类型>变量名,如 vector<Point> point_vec;
保存数据到容器里:point_vec.pushback(点变量);//把数据添加到容器的尾部,即“先进先出”
point_vec.pushfront(点变量);//把数据添加到容易的头部,即“后进先出”
容器的大小:point_vec.size();返回容器内的数据个数,如容器内有10个点数据。
2.变量和常量显示到MFC编辑框内
首先得把变量和常量整合到数组或者字符串中:
char str[50]={0};
sprintf(str,"y = %f x+ %f",a,b);
设置编辑框的内容:SetDlgItemText(IDC_EDIT3,CString(str));
3.获取图像控件方形的大小
CRect rect_ctr;
(this->GetDlgItem(IDC_PIC))->GetWindowRect(&rect_ctr);//此处是相对于屏幕的坐上角的坐标
ScreeenToClient(rect_ctl);//使坐标为相对于对话框左上角的坐标
图像控件的坐标:rect_ctl的信息,(left,top) (right,buttom)
4.MFC控件上画线及圆
CWnd* pWND = GetDlgItem(IDC_PIC);//获取控件的句柄
CDC* pDC = pWND->GetDC();//控件的画板
pDC->MoveTo(linePt1.x,linePt1.y);//画笔开始的坐标
pDC->LineTo(linept2.x,linept2.y);//画笔终点坐标
ReleaseDC(pDC); //释放画板
MoveTo的作用相当于拿起笔并下笔,LineTo就是移动笔,画出直线.
5.LMS最小二乘直线拟合
float av_x=0,av_y=0;
float sum_x=0,sum_y=0,sum_xx=0,sum_yy=0,sum_xy=0;
float b=0,a=0;
int i=0;
num = PointArr.size();
for (i=0;i<num;i++)
{
sum_x += PointArr[i].x;
sum_y += PointArr[i].y;
sum_xx +=PointArr[i].x*PointArr[i].x;
sum_yy +=PointArr[i].y*PointArr[i].y;
sum_xy +=PointArr[i].x*PointArr[i].y;
}
av_x = sum_x/num;
av_y = sum_y/num;
a = (num*sum_xy-sum_x*sum_y)/(num*sum_xx-sum_x*sum_x);
b = av_y-a*av_x;
最后拟合的直线方程为 Y = aX+b;a,b分别为斜率和截距;
6.改变图像控件的背景颜色
首先得改变拖动形成的图像控件的属性,<type>改为Enhanced Metafile,
并添加消息响应:HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
在响应函数内科改变背景颜色:
pDC->SetBkColor(RGB(0,0,0));
static CBrush gbrush(RGB(0,0,255));
return gbrush;