程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 在VC中用GDI+繪制角度可變的顏色漸變效果

在VC中用GDI+繪制角度可變的顏色漸變效果

編輯:vc教程
   GDI+ 是GDI(Windows 早期版本提供的圖形設備接口)的後續版本,是Microsoft Windows XP作系統即後續版本的圖形顯示技術。它已經集成到了.Net開發環境中,所以不管你的OS是什麼版本,只要安裝了.Net框架,就有了GDI+(注意:是.Net框架,而不是.Net開發環境,所以Win98中也可以使用GDI+)。

        現在,言歸正傳。

        在頭文件中加入下面的代碼:

#include <GdiPlus.h>
using namespace Gdiplus;
#pragma comment(lib,"gdiplus.lib")

        注意:在使用GDI+函數時必須進行GDI+的初始化,使用完畢要銷毀GDI+!
        初始化:

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

        銷毀:

ULONG_PTR gdiplusToken = NULL;
GdiplusShutdown(gdiplusToken);

        下面以給一個CTestDlg的對話框繪制背景為例子,用GDI+實現角度可變的顏色漸變效果。用到的變量:

         iRotation:整型,漸變色的角度
         Color1、Color2、Color3:RGB顏色值

        兩種顏色的比較簡單,直接用GDI+提供的LinearGradIEntBrush刷子就行了:

BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)
{
    CDialog::OnEraseBkgnd(pDC);

    //  取得第一種顏色的R,G,B值
    int r1 = GetRValue(Color1);
    int g1 = GetGValue(Color1);
    int b1 = GetBValue(Color1);

    //  取得第二種顏色的R,G,B值
    int r2 = GetRValue(Color2);
    int g2 = GetGValue(Color2);
    int b2 = GetBValue(Color2);

    //  得到繪制區域
    CRect rect;
    GetClIEntRect(&rect);

    //  GDI+對象
    Gdiplus::Graphics graphics(pDC->GetSafeHdc());
       
    //  刷子
    Gdiplus::LinearGradIEntBrush linGrBrush(Gdiplus::Rect(0, 0, rect.Width(), rect.Height()),  //  繪制區域
                                                Gdiplus::Color(255, r1, g1, b1),  //  第一種顏色
                                                Gdiplus::Color(255, r2, g2, b2),  //  第二種顏色
                                                (Gdiplus::REAL)(90 - iRotation));  //  漸變色的角度

    graphics.FillRectangle(&linGrBrush, Gdiplus::Rect(0, 0, rect.Width(), rect.Height()));
 
    return TRUE;
}

      三種顏色比較復雜,也是用GDI+提供的LinearGradIEntBrush刷子,不過需要計算繪制區域的對角線長度,並按照對角線平分為三等分。


具體的看以下代碼:

BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)
{
    CDialog::OnEraseBkgnd(pDC);

    //  取得第一種顏色的R,G,B值
    int r1 = GetRValue(Color1);
    int g1 = GetGValue(Color1);
    int b1 = GetBValue(Color1);

    //  取得第二種顏色的R,G,B值
    int r2 = GetRValue(Color2);
    int g2 = GetGValue(Color2);
    int b2 = GetBValue(Color2);

    //  取得第三種顏色的R,G,B值
    int r3 = GetRValue(Color3);
    int g3 = GetGValue(Color3);
    int b3 = GetBValue(Color3);

    //  得到繪制區域
    CRect rect;
    GetClIEntRect(&rect);

    //  計算對角線長度
    int iHeight = rect.Height();
    int iWidth = rect.Width();
    double dwDiagonal = sqrt((double)(iWidth * iWidth + iHeight * iHeight));

    //  三塊繪制區域
    Rect rectDraw(0, 0, (INT)dwDiagonal, (INT)dwDiagonal);
    Rect rectDraw1(0, 0, (INT)dwDiagonal, ((INT)dwDiagonal)/2);
    Rect rectDraw2(0, ((INT)dwDiagonal) / 2, (INT)dwDiagonal, ((INT)dwDiagonal) / 2);

   //  GDI+對象
   Graphics graphics(pDC->GetSafeHdc());
   Gdiplus::Bitmap bmp(rectDraw.Width, rectDraw.Height);
   Graphics grTmp(&bmp);

    //  用刷子填充區域
    Gdiplus::LinearGradIEntBrush linGrBrush(rectDraw1, Color(r1, g1, b1), Color(r2, g2, b2), 90);
    grTmp.FillRectangle(&linGrBrush, rectDraw1);
    Gdiplus::LinearGradIEntBrush linGrBrush1(rectDraw2, Color(r2, g2, b2),Color(r3, g3, b3), 90);
    grTmp.FillRectangle(&linGrBrush1, rectDraw2);

    //  計算
    dwDiagonal *= 0.5;
    double dwAngle = iRotation * 3.1415926 / 180.0;
    double dwCosAngle = cos(dwAngle);
    double dwSinAngle = sin(dwAngle);
    double dwBeta = atan2((double)iHeight, (double)iWidth);
    double dwDistance = dwDiagonal * sin(fabs(dwAngle) + dwBeta);
    double xc = 0.5 * iWidth - dwDistance * dwSinAngle;
    double yc = 0.5 * iHeight - dwDistance * dwCosAngle;
    double xc1 = 0.5 * iWidth + dwDistance * dwSinAngle;
    double yc1 = 0.5 * iHeight + dwDistance * dwCosAngle;
    double dx = dwDiagonal * dwCosAngle;
    double dy = - dwDiagonal * dwSinAngle;

    //  繪制
    Point ptDestinationPoints[3];
    ptDestinationPoints[0].X = (INT)(xc - dx);
    ptDestinationPoints[0].Y = (INT)(yc - dy);
    ptDestinationPoints[1].X = (INT)(xc + dx);
    ptDestinationPoints[1].Y = (INT)(yc + dy);
    ptDestinationPoints[2].X = (INT)(xc1 - dx);
    ptDestinationPoints[2].Y = (INT)(yc1 - dy);
    graphics.DrawImage(&bmp, ptDestinationPoints, 3);

    return TRUE;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved