{
4
} // TODO: 在此添加命令处理程序代码 m_ptOrigin=point; //保存鼠标按下得到点,也是绘制一个点 CView::OnLButtonDown(nFlags, point);
在鼠标左键弹起消息响应函数中实现绘图,代码如下:
void CWdrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
在上述程序中,设置一个点,用到的函数是SetPixel,这也是CDC类的一个成员方法,该函数的生命形式如下:COLORREF SetPixel (POINT point,COLORREF crColor);该函数是在指定的点设置一个像素。其中第一个参数(point)是指定的点,第二个参数(crColor)是指定的颜色。在程序中设定的颜色在系统颜色表中可能不存在,但系统会选择一种和这个颜色最接近的颜色。RGB是一个宏,它有三个
5 // TODO: 在此添加命令处理程序代码 CClientDC dc(this); switch (m_nDrawType) { case 1: dc.SetPixel(point,RGB(255,0,0)); /*绘制点*/ break; case 2:/*绘制直线*/ dc.MoveTo(m_ptOrigin);/*调用MoveTo函数移动到原点*/ dc.LineTo(point);/*调用LineTo函数绘制到终点。*/ break; case 3:/*绘制矩形*/dc.Rectangle(CRect(m_ptOrigin,point)); break; case 4:/*绘制椭圆*/ dc.Ellipse(CRect(m_ptOrigin,point)); break; CView::OnLButtonUp(nFlags, point);
参数,分别代表红、绿、蓝三种颜色的值。这三个参数BYTE类型,取值范围为0~255。RGB(0,0,0)是黑色,RGB(255,255,255)是白色,将这三个分量设置成为0~255之间的任意值,从而得到各种不同的颜色。这里的RGB(255,0,0)是红色。
绘制直线时,首先调用MoveTo函数移动到原点,然后调用LineTo函数绘制到终点。
绘制矩形时使用Rectangle函数,该函数声明形式为:BOOL Rectangle (LPCRECT lpRect);
该函数有一个指向Crect对象的参数,后者可以利用两个点来构造。需要注意的是该函数需要的是指向Crect对象的指针,而上述代码中传递的却是Crect对象,但运行编译时也能成功通过,运行时也不会报错,这是为什么呢?我们知道C系列的语言都是强类型语言,如果类型不匹配的话,需要进行强制类型转换。但这里为什么没有进行这样的强制类型转换程序也可以通过呢?实际上,Crect类提供了这样一个成员函数:重载LPCRECT操作符,其作用是将Crect转换为LPCRECT类型。因此,当在程序中给Rectangle函数的参数赋值时,如果它发现该参数是一个Crect对象,它就会隐式地调用LPCRECT操作符,将Crect类型的对象转换为LPRECT类型。因此,在给函数传递参数时,如果我们看到的传递的数值类型和所需要的类型不匹配,但编译和运行都正确的情况时,就要想想这其中的缘由了。当然,有的情况下可能是这些类型之间本来就可以互相转换。但是参数是对象类的话,就要考虑了,它选择的对象的构造方法进行的隐式转换,还是有其他重载的操作符。
当用户选择椭圆菜单项时,调用Ellipes函数绘制一个椭圆。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-23014-3.html
包装前就有了呢
及时为IBM排忧解难
小王子加油