一、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); }