現在,言歸正傳。
在頭文件中加入下面的代碼:
#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;
}