我用默认的画笔画刷画了一条线和一个矩形,同时也输出了一串文字。我们可以看到效果图如下:
【默认画笔画刷所画的线和输出的文字效果】
默认的画笔是黑色,默认的画刷是白色。而客户区作为画板,我用轻灰色画刷LTGRAY_BRUSH来设置了画板的颜色。设置的绘图方式就是画板颜色取反,即R2_NOT。效果图就是上面的。与默认的绘图方式即直接呈现画笔画刷的颜色的效果不一样。R2_NOT就是忽略画笔画刷的颜色,只要画笔画刷经过的地方,就让画板的颜色翻转,即形成反色。尽管我们画笔画刷有自己的颜色,画板也有自己的颜色,然后最终呈现给你的,并不是他们的显色,而是处理之后的颜色。所以你看到的线条不是黑色的,填充的矩形不是白色的,矩形的边框也不是黑色的。那么这些都是什么颜色成分呢?其实都是背景色的翻转色而已。直线和矩形相交的地方,是经过两次翻转,还是背景色。只是背景色的一次翻转和两次翻转(恢复原来的颜色)。
那么从开始绘画,到画笔画刷和画板相互作用(只将作用的位置的像素,去画板颜色取反得到最后留下的颜色)。相互作用这个过程就是绘图方式决定的。那么绘图方式有下面这些:
#define R2_BLACK 1 /* 0 */
#define R2_NOTMERGEPEN 2 /* DPon */
#define R2_MASKNOTPEN 3 /* DPna */
#define R2_NOTCOPYPEN 4 /* PN */
#define R2_MASKPENNOT 5 /* PDna */
#define R2_NOT 6 /* Dn */
#define R2_XORPEN 7 /* DPx */
#define R2_NOTMASKPEN 8 /* DPan */
#define R2_MASKPEN 9 /* DPa */
#define R2_NOTXORPEN 10 /* DPxn */
#define R2_NOP 11 /* D */
#define R2_MERGENOTPEN 12 /* DPno */
#define R2_COPYPEN 13 /* P */
#define R2_MERGEPENNOT 14 /* PDno */
#define R2_MERGEPEN 15 /* DPo */
#define R2_WHITE 16 /* 1 */
#define R2_LAST 16
对于每一种绘图方式的说明,请参考MSDN的说明或者后续相关文章说明。
然而你可以看到,输出的文字并没有受到影响。文字输出和画线填充走的不是一条路。至于文字输出的原理,后续文章将会再分析。这里知道文字没有受到绘图方式的影响,而只是画图操作都受到了影响。