Beginning Visual C++ 2010学习笔记之 Chapter16: Drawing in a Window

时间:2022-11-17 22:45:44

* 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的数据,所以窗口重画后图形就消失了。