当前位置:C++技术网 > 资讯 > GDI+深入学习之影线画刷的学习

GDI+深入学习之影线画刷的学习

更新时间:2016-03-03 20:24:08浏览次数:1+次

影线画刷是使用同样重复的小图案来填充一个区域的。该图案由前景色与背景色组成。对于使用黑白两种颜色的影线画刷而言,前景色是黑色,背景色是透明的白色。单个的画刷构成的元素在视觉上不能产生任何的效果,只有在这些图案一次被排列组合之后,才能形成完整的画刷。首先来看看影线画刷的定义:

HatchBrush{
HatchStyle hatchStyle,
const Color &foreColor,
const Color &backColor
};
在这里,枚举下hatchStyle:
enum HatchStyle
{
    HatchStyleHorizontal,                   // 0
    HatchStyleVertical,                     // 1
    HatchStyleForwardDiagonal,              // 2
    HatchStyleBackwardDiagonal,             // 3
    HatchStyleCross,                        // 4
    HatchStyleDiagonalCross,                // 5
    HatchStyle05Percent,                    // 6
    HatchStyle10Percent,                    // 7
    HatchStyle20Percent,                    // 8
    HatchStyle25Percent,                    // 9
    HatchStyle30Percent,                    // 10
    HatchStyle40Percent,                    // 11
    HatchStyle50Percent,                    // 12
    HatchStyle60Percent,                    // 13
    HatchStyle70Percent,                    // 14
    HatchStyle75Percent,                    // 15
    HatchStyle80Percent,                    // 16
    HatchStyle90Percent,                    // 17
    HatchStyleLightDownwardDiagonal,        // 18
    HatchStyleLightUpwardDiagonal,          // 19
    HatchStyleDarkDownwardDiagonal,         // 20
    HatchStyleDarkUpwardDiagonal,           // 21
    HatchStyleWideDownwardDiagonal,         // 22
    HatchStyleWideUpwardDiagonal,           // 23
    HatchStyleLightVertical,                // 24
    HatchStyleLightHorizontal,              // 25
    HatchStyleNarrowVertical,               // 26
    HatchStyleNarrowHorizontal,             // 27
    HatchStyleDarkVertical,                 // 28
    HatchStyleDarkHorizontal,               // 29
    HatchStyleDashedDownwardDiagonal,       // 30
    HatchStyleDashedUpwardDiagonal,         // 31
    HatchStyleDashedHorizontal,             // 32
    HatchStyleDashedVertical,               // 33
    HatchStyleSmallConfetti,                // 34
    HatchStyleLargeConfetti,                // 35
    HatchStyleZigZag,                       // 36
    HatchStyleWave,                         // 37
    HatchStyleDiagonalBrick,                // 38
    HatchStyleHorizontalBrick,              // 39
    HatchStyleWeave,                        // 40
    HatchStylePlaid,                        // 41
    HatchStyleDivot,                        // 42
    HatchStyleDottedGrid,                   // 43
    HatchStyleDottedDiamond,                // 44
    HatchStyleShingle,                      // 45
    HatchStyleTrellis,                      // 46
    HatchStyleSphere,                       // 47
    HatchStyleSmallGrid,                    // 48
    HatchStyleSmallCheckerBoard,            // 49
    HatchStyleLargeCheckerBoard,            // 50
    HatchStyleOutlinedDiamond,              // 51
    HatchStyleSolidDiamond,                 // 52

    HatchStyleTotal,   
    HatchStyleLargeGrid = HatchStyleCross,  // 4

    HatchStyleMin       = HatchStyleHorizontal,
    HatchStyleMax       = HatchStyleTotal - 1,
};
这些,我们能够在VS编译器里面找到,在这里推荐使用VA_X插件,这个插件能够帮助你在VS编译器里找到某个函数的定义及实现代码。作为一个VC++开发人员并使用VS开发的话,这个插件对比来说,可谓如虎添翼。
既然影线画刷是使用单个的基本图案对区域进行填充的,需要注意的是,基本图案开始被绘制的地方。很明显,基本图案必须以一个特定的像素位置作为排列起点,这个排列起点在GDI+里面称为“RenderingOrigin"。如果设置了绘制原点的位置,画刷将按照该点的位置进行基本图案的排列。
在绘图中设置绘制原点是使用函数SetRanderingOrigin:
Status SetRenderingOrigin(IN INT x, IN INT y)
    {
        return SetStatus(
            DllExports::GdipSetRenderingOrigin(
                nativeGraphics, x, y
            )
        );
    }
这是这个函数的实现代码,我想我就不用说这个函数的定义了吧。
下面,我们测试一个影线画刷使用绘制原点的实例:
void CGDI学习View::On32772()//影线画刷
{
	// TODO: 在此添加命令处理程序代码
	Graphics graphics(this->m_hWnd);
	Color black(255,0,0,0);
	Color white(255,255,255,255);

	HatchBrush hatchbrush(HatchStyle(20),black,white);

	for(int i=0; i<8; i++)
	{
		graphics.FillRectangle(&hatchbrush,0,i*50,100,50);
	}

	for(int i=0; i<8; i++)
	{
		graphics.SetRenderingOrigin(i,0);
		graphics.FillRectangle(&hatchbrush,100,i*50,100,50);
	}
}
代码实现: