14.4.3 使用鼠标绘图(9)
绘图模式确定绘图时使用的钢笔颜色如何与背景色相组合,以产生要显示的实体的颜色。绘图模式由这个函数的一个参数指定,它可以是表14-6中的任一个值。
表 14-6
|
绘 图 模 式
|
效 果
|
|
R2_BLACK
|
所有绘图颜色都是黑色
|
|
R2_WHITE
|
所有绘图颜色都是白色
|
(续表)
|
绘 图 模 式
|
效 果
|
|
R2_NOP
|
不进行任何绘图操作
|
|
R2_NOT
|
绘图颜色是屏幕颜色的反色。这将确保输出
清晰可见,因为它防止绘图颜色与背景色相同
|
|
R2_COPYPEN
|
绘图颜色是钢笔颜色。如果不进行设置,
这就是默认的绘图模式
|
|
R2_NOTCOPYPEN
|
绘图颜色是钢笔颜色的反色
|
|
R2_MERGEPENNOT
|
绘图颜色是钢笔颜色和背景色的反色
“相或”以后产生的颜色
|
|
R2_MASKPENNOT
|
绘图颜色是钢笔颜色和背景色的反色
“相与”以后产生的颜色
|
|
R2_MERGENOTPEN
|
绘图颜色是背景色和钢笔颜色的反色
“相或”以后产生的颜色
|
|
R2_MASKNOTPEN
|
绘图颜色是背景色和钢笔颜色的反色
“相与”以后产生的颜色
|
|
R2_MERGEPEN
|
绘图颜色是背景色和钢笔颜色“相或”
以后产生的颜色
|
|
R2_NOTMERGEPEN
|
绘图颜色是R2_MERGEPEN颜色的反色
|
|
R2_MASKPEN
|
绘图颜色是背景色和钢笔颜色“相与”
以后产生的颜色
|
|
R2_NOTMASKPEN
|
绘图颜色是R2_MASKPEN颜色的反色
|
|
R2_XORPEN
|
绘图颜色是钢笔色和背景色“异或”以后
产生的颜色,结果是由钢笔色和背景色中的
RGB成分组成的颜色,但不是这两种颜色
|
|
R2_NOTXORPEN
|
绘图颜色是R2_XORPEN 颜色的反色
|
每种符号都是int类型的预定义值。虽然此处有很多选项,但是可以带来一些特殊效果的选项是最后的R2_NOTXORPEN选项。
将绘图模式设置为R2_NOTXORPEN以后,第一次在默认的白色背景上绘制特定形状时,通常是以指定的钢笔颜色绘制。如果再次绘制的相同形状覆盖在第一次绘制的形状上,那么形状将消失,因为这次形状的颜色对应于钢笔颜色和它自身颜色"异或"以后产生的颜色。这时产生的绘图颜色是白色。利用一个示例可以看得更为清楚一些。
白色是由相同比例、"最大"数量的红色、蓝色和绿色(255, 255, 255)构成的,所以每种成分值的位都是1。为了简化问题,可以把白色表示为(1,1,1)-- 这3个值代表颜色的RGB成分。在相同的方案中,红色定义为(1,0,0),而不是(255, 0, 0)。这些颜色的组合如表14-7所示。
表 14-7
|
计 算 过 程
|
R
|
G
|
B
|
|
背景色(白色,窗口背景色)
|
1
|
1
|
1
|
|
钢笔颜色(红色)
|
1
|
0
|
0
|
|
XOR(产生红色成分)
|
0
|
1
|
1
|
|
NOT XOR(产生红色,绘制颜色)
|
1
|
0
|
0
|
因此,第一次在白色背景上绘制红色直线时,如表14-7的最后一行所示,直线显示的颜色是红色。如果第二次绘制的相同直线覆盖在现有的直线上,那么重写的背景像素将是红色。产生的绘图颜色将作如表14-8所示的计算。
表 14-8
|
计 算 过 程
|
R
|
G
|
B
|
|
背景色(红色最后一次绘制的像素)
|
1
|
0
|
0
|
|
钢笔(红色)
|
1
|
0
|
0
|
|
XOR(产生黑色)
|
0
|
0
|
0
|
|
NOT XOR(产生白色,窗口背景色)
|
1
|
1
|
1
|
如最后一行所示,直线显示的颜色是白色,因为窗口的背景色是白色,所以直线消失。
此处需要注意使用正确的背景色。应当看到,使用白色钢笔在红色背景上绘图的效果不太好,如第一次绘制的形状是红色,其结果是看不见的。它第二次出现时是白色。如果在黑色背景上进行绘制,如同在白色背景上那样,形状将出现,然后消失,但是它们不是以选择的钢笔颜色绘制的。
编写OnMouseMove()处理程序
首先在鼠标移动消息后面添加创建元素的代码。因为打算利用这个处理程序函数绘制元素,所以需要创建一个可在其中绘图的设备上下文。这时最便于使用的类是CClientDC,它是CDC的派生类。这个类型的对象会在工作完成后自动销毁设备上下文。所以可以创建一个CClientDC对象,使用它,然后不再管它。创建CClientDC对象时,可以给CClientDC构造函数传递一个指向设备上下文所在窗口的指针,它创建的设备上下文对应于窗口的工作区,所以如果传递一个指向视图的指针,就得到了我们需要的。