GDI+画刷(LinearGradientBrush(三))

发布时间 2023-07-25 16:33:48作者: 左边的翼

3、LinearGradientBrush(Rect&,Color&,Color&,LinearGradientMode)

  对四种路径渐变方式进行代码效果展示,如下:

  变量定义:

CDC MemDCIndicator;
CBitmap MemBitmapIndicator;
CDC *pDC;
CComboBox m_pGradientMode;

  关键代码:

 1 void LinearGradientTwoDlg::DoDataExchange(CDataExchange* pDX)
 2 {
 3     CDialogEx::DoDataExchange(pDX);
 4     DDX_Control(pDX, IDC_COMBO1, m_pGradientMode);
 5 }
 6 
 7 BEGIN_MESSAGE_MAP(LinearGradientTwoDlg, CDialogEx)
 8     ON_WM_PAINT()
 9     ON_CBN_SELCHANGE(IDC_COMBO1, &LinearGradientTwoDlg::OnCbnSelchangeCombo1)
10 END_MESSAGE_MAP()
11 
12 void LinearGradientTwoDlg::OnPaint()
13 {
14     CPaintDC dc(this);
15     DrawFunction();
16 }
17 
18 BOOL LinearGradientTwoDlg::OnInitDialog()
19 {
20     CDialogEx::OnInitDialog();
21     m_pGradientMode.InsertString(0,L"LinearGradientModeHorizontal");
22     m_pGradientMode.InsertString(1, L"LinearGradientModeVertical");
23     m_pGradientMode.InsertString(2, L"LinearGradientModeForwardDiagonal");
24     m_pGradientMode.InsertString(3, L"LinearGradientModeBackwardDiagonal");
25     m_pGradientMode.SetCurSel(0);
26     m_pLinearGradientMode = LinearGradientModeHorizontal;
27     return TRUE;            
28 }
29 
30 
31 void LinearGradientTwoDlg::DrawFunction()
32 {
33     CRect rt;
34     GetClientRect(&rt);
35     pDC = GetDC();
36     MemDCIndicator.CreateCompatibleDC(pDC);
37     MemBitmapIndicator.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height() * 2/ 3);
38     MemDCIndicator.SelectObject(&MemBitmapIndicator);
39     MemDCIndicator.FillSolidRect(rt, RGB(100, 100, 100));
40 
41     Graphics graphics(MemDCIndicator);
42     graphics.SetSmoothingMode(SmoothingModeHighQuality);
43     LinearGradientBrush lbr(Rect(0, 0, rt.Width(), rt.Height() * 2/ 3), Color(255, 0, 0), Color(0, 255, 0), m_pLinearGradientMode);
44     graphics.FillRectangle(&lbr, rt.left, rt.top, rt.Width(), rt.Height() * 2/ 3);
45     pDC->BitBlt(rt.left, rt.top, rt.Width(), rt.Height() * 2/ 3, &MemDCIndicator, 0, 0, SRCCOPY);
46     MemDCIndicator.DeleteDC();
47     MemBitmapIndicator.DeleteObject();
48     ReleaseDC(pDC);
49 }
50 void LinearGradientTwoDlg::OnCbnSelchangeCombo1()
51 {
52     switch (m_pGradientMode.GetCurSel()) {
53     case 0:
54         m_pLinearGradientMode = LinearGradientModeHorizontal;
55         break;
56     case 1:
57         m_pLinearGradientMode = LinearGradientModeVertical;
58         break;
59     case 2:
60         m_pLinearGradientMode = LinearGradientModeForwardDiagonal;
61         break;
62     case 3:
63         m_pLinearGradientMode = LinearGradientModeBackwardDiagonal;
64         break;
65     default:
66         break;
67     }
68     Invalidate();
69 }