Beginning Visual C++ 2010学习笔记之 Chapter16: Drawing in a Window
* Normalized Rectangles: 一个经过normalized的矩形,left值总是小于等于right,top值总是小于等于bottom。只有经过了normalized,InflateRect()函数才会工作正常。例如:
1 m_EnclosingRect = CRect(start, end); 2 m_EnclosingRect.NormalizeRect();
NormalizeRect()函数其实挺好理解,举例如下
1 CPoint point1(200,200); 2 CPoint point2(300,300); 3 4 CRect rect2(point2,point1);
上述代码定义的rect2的属性
left=300, right=200, top=300, bottom=200,因为在定义rect2时point2被放在了前面,所以point2的值被认为是top, left
经过调用rect2.NormalizeRect()后
left=200, right=300, top=200, bottom=300
*SetROP2()函数
这个函数会将pen的颜色及背景颜色相结合以产生最终的效果。可以设置许多的模式,本节的例子用的是R2_NOTXORPEN模式,目的是当移动鼠标时,先删除前一次的绘画,再画出新的绘画。颜色的变化如下:
R G B
背景-白色 1 1 1
笔-红色 1 0 0
XOR-ed 0 1 1
NOT XOR 1 0 0
即背景颜色是白色,笔的颜色是红色,通过NOTXOR后,最终笔的颜色还是红色
R G B
背景-红色 1 0 0
笔-红色 1 0 0
XOR-ed 0 0 0
NOT XOR 1 1 1
如果在已经画好的图案上(红色的)再画一遍的话,即红色的笔画在红色的背景上,通过NOTXOR后,颜色为白色,显示的效果就是把刚画好的图案擦掉了。
*CClientDC
这个类比CDC类的优越性是:它会自动为你创建device context, 并在你完成工作后删除。
*ASSERT_VALID()
这个宏只在debug方式下有效,在release方式下什么也不做。用来校验指针是否为NULL,或object defective in some way.
*summary
示例程序到这一节已经可以用鼠标画出几种形状了,实现的方式总结如下
Document类:定义了Element, Color,通过菜单选择当前的Element及Color,默认的Element是Line, Color是Black
View类:定义了first point, second point, 一个临时的element,及创建element的函数。默认的first point, second point都是(0,0), 临时element是NULL, 创建element时,会根据doucment里选择的element,color,及view里的first point, second point. 响应鼠标事件,鼠标左键按下:记录first point,鼠标移动:记录下second point,如果是CURVE就添加一个点point2,并画到point2,其他图形的话就先擦掉旧的图(通过SetROP2函数),然后再画上新的图(相同的point1, 不同的point2)。鼠标左键抬起:删除临时的element。
由于没有保存画过的element的数据,所以窗口重画后图形就消失了。