GDI+画刷(TextureBrush)

发布时间 2023-07-20 16:13:26作者: 左边的翼

一、TextureBrush构造种类

  纹理画刷在官方文档中给出构造种类一共有7种,如下所示:

1 TextureBrush(Image*,WrapMode)
2 TextureBrush(Image*,WrapMode,Rect&)
3 TextureBrush(Image*,wrapMode,RectF&)
4 TextureBrush(Image*,Rect&,ImageAttributes*)
5 TextureBrush(Image*,RectF&,ImageAttributes*)
6 TextureBrush(Image*,WrapMode,INT,INT,INT,INT)
7 TextureBrush(Image*,WrapMode,REAL,REAL,REAL,REAL)

  WrapMode在官方文档中给出5种模式,如下所示:

1 enum WrapMode
2 {
3     WrapModeTile,
4     WrapModeTileFlipX,
5     WrapModeTileFlipY,
6     WrapModeTileFlipXY,
7     WrapModeClamp
8 };

  ImageAttributes在官方文档中内容较多,在下面内容中做简单代码效果演示。

二、构造函数略

  1、TextureBrush(Image*,WrapMode),该构造模式下,代码效果如下所示:

 

  变量定义:

WrapMode m_pCurrentWrapMode;
CComboBox m_pStyle;

  关键代码:

 1 void TextureBrushDlg::DoDataExchange(CDataExchange* pDX)
 2 {
 3     CDialogEx::DoDataExchange(pDX);
 4     DDX_Control(pDX, IDC_COMBO1, m_pStyle);
 5 }
 6 
 7 BEGIN_MESSAGE_MAP(TextureBrushDlg, CDialogEx)
 8     ON_WM_PAINT()
 9     ON_CBN_SELCHANGE(IDC_COMBO1, &TextureBrushDlg::OnSelchangeCombo1)
10 END_MESSAGE_MAP()
11 
12 void TextureBrushDlg::OnPaint()
13 {
14     CPaintDC dc(this);
15     Graphics graphics(dc);
16     Gdiplus::TextureBrush tba(&Image(L".//bb.bmp"),m_pCurrentWrapMode);
17     CRect crt;
18     GetClientRect(&crt);
19     graphics.FillRectangle(&tba, 0, 0, 400, 300);
20 }
21 
22 BOOL TextureBrushDlg::OnInitDialog()
23 {
24     CDialogEx::OnInitDialog();
25     SetWindowPos(NULL, 500, 500, 420, 410, SWP_NOZORDER);
26     m_pStyle.InsertString(0, L"WrapModeTile");
27     m_pStyle.InsertString(1, L"WrapModeTileFlipX");
28     m_pStyle.InsertString(2, L"WrapModeTileFlipY");
29     m_pStyle.InsertString(3, L"WrapModeTileFlipXY");
30     m_pStyle.InsertString(4, L"WrapModeClamp");
31     m_pStyle.SetCurSel(0);
32     m_pCurrentWrapMode = WrapModeTile;
33     return TRUE;
34 }
35 
36 void TextureBrushDlg::OnSelchangeCombo1()
37 {
38     switch (m_pStyle.GetCurSel())
39     {
40     case 0:
41         m_pCurrentWrapMode = WrapModeTile;
42         break;
43     case 1:
44         m_pCurrentWrapMode = WrapModeTileFlipX;
45         break;
46     case 2:
47         m_pCurrentWrapMode = WrapModeTileFlipY;
48         break;
49     case 3:
50         m_pCurrentWrapMode = WrapModeTileFlipXY;
51         break;
52     case 4:
53         m_pCurrentWrapMode = WrapModeClamp;
54         break;
55     default:
56         m_pCurrentWrapMode = WrapModeTile;
57         break;
58     }
59     Invalidate();
60 }

 2、TextureBrush(Image*,WrapMode,Rect&),该构造模式下,Rect形参限定使用Image的一部分进行绘制,代码效果如下所示:

   代码同前面基本一致,在WM_PAINT事件中略做更改,Rect对象限定使用图像某一部分进行绘制,该部分职能在图片大小之内指定(图片大小为100x150,Rect最大只能为(0,0,100,150)),当超出图片范围时,画刷为空白画刷进行绘制

 1 void TextureBrushDlg::OnPaint()
 2 {
 3     CPaintDC dc(this);
 4     Graphics graphics(dc);
 5     //Gdiplus::TextureBrush tba(&Image(L".//bb.bmp"), m_pCurrentWrapMode);
 6     Rect rt(20, 0, 80, 70);
 7     Gdiplus::TextureBrush tba(&Image(L".//bb.bmp"), m_pCurrentWrapMode, rt);
 8     CRect crt;
 9     GetClientRect(&crt);
10     graphics.FillRectangle(&tba, 0, 0, 400, 300);
11 }

 3、TextureBrush(Image*,Rect&,ImageAttributes*)

  经过图像属性设置后,创建画刷进行绘制,原图与图像属性设置后对比如下所示,关于图像属性设置内容繁多,后续章节单独进行介绍:

   关键代码:

void TextureBrushDlg::OnPaint()
{
    CPaintDC dc(this);
    Graphics graphics(dc);
    //设置图片属性后,创建画刷
    Gdiplus::ImageAttributes imgAttr;
    ColorMatrix colorMatrix = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                                1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
                                0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
                                0.0f, 0.0f, 0.0f, 1.0f, 1.0f,
                                0.0f, 0.0f, 0.0f, 0.0f, 1.0f };
    imgAttr.SetColorMatrix(&colorMatrix);
    imgAttr.SetGamma(2.7);
    Rect rt(0, 0, 100, 150);
    Gdiplus::TextureBrush tba(&Image(L".//bb.bmp"),rt,&imgAttr);
    graphics.FillRectangle(&tba, 0, 0, 400, 300);

    //图像原图
    graphics.DrawImage(&Image(L".//bb.bmp"), 100, 0, 100, 150);
}