作者:朱金燦
來源:http://blog.csdn.net/clever101/
我發現使用GDI+來製作畫圖工具的調色盤極為方便(這個工作如果讓GDI來做不知要寫多少代碼)。下面我們學習一下GDI+的線性漸層畫刷:LinearGradientBrush類的用法,具體代碼如下:
CDC *pDC = pView->GetDC();<br /> // 定義一個畫圖對象<br />Gdiplus::Graphics graphics(pDC->m_hDC);</p><p> // 擷取視圖客戶區大小<br /> CRect rt;<br /> pView->GetClientRect(&rt);<br />// 定義一個線性漸層畫刷,按紅黃藍綠的順序四種色彩坡形<br /> LinearGradientBrush linGrBrush(Point(100,0),Point(100,rt.Height()/2),Color(255,255,0,0),Color(255,0,0,255));<br /> Color colors[] = {<br /> Color(255, 255, 0, 0), // red<br /> Color(255, 255, 255, 0), //yellow<br /> Color(255, 0, 0, 255), // blue<br /> Color(255, 0, 255, 0)}; // green<br /> REAL positions[] = {<br /> 0.0f,<br /> 0.33f,<br /> 0.66f,<br /> 1.0f};<br />linGrBrush.SetInterpolationColors(colors, positions,4);<br />// 填充指定地區矩形<br />graphics.FillRectangle(&linGrBrush,rt.Width()/2,0,80,rt.Height()/2);
效果如下:
這個線性漸層畫刷很簡單,就是按垂直方向(即y軸方向)漸層的。我感興趣的是畫刷的兩個參數Point(100,0),Point(100,rt.Height()/2),書上介紹的起點的顏色和終點顏色的位置和要填充的矩形之間的關係是怎樣的?我們看到上面的畫刷的起點和終點的高度和要填充的矩形的高度是一樣的,都是rt.Height()/2。我們把畫刷的高度縮小為原來的一般,看看有什麼效果,即定義為:
LinearGradientBrush linGrBrush(Point(100,0),Point(100,rt.Height()/4),Color(255,255,0,0),Color(255,0,0,255));
如下:
我們發現等於連續用兩個畫刷填充這個矩形。假如填充的目標矩形的高度小於畫刷的高度,又會是怎樣的效果呢?代碼改為:
LinearGradientBrush linGrBrush(Point(100,0),Point(100,rt.Height()/2),Color(255,255,0,0),Color(255,0,255,0));<br /> Color colors[] = {<br /> Color(255, 255, 0, 0), // red<br /> Color(255, 255, 255, 0), //yellow<br /> Color(255, 0, 0, 255), // blue<br /> Color(255, 0, 255, 0)}; // green<br /> REAL positions[] = {<br /> 0.0f,<br /> 0.33f,<br /> 0.66f,<br /> 1.0f};<br />linGrBrush.SetInterpolationColors(colors, positions,4);<br />// 填充指定地區矩形<br />graphics.FillRectangle(&linGrBrush,rt.Width()/2,0,80,rt.Height()/4);<br />
如下:
我們看到這時矩形地區的填充只使用了畫刷的一部分。這時或許我們可以得出一個簡單的結論:用畫刷填充多邊形地區,有點類似於鋪地磚,地磚好比畫刷,空地好比要填充的地區地區。
思考題:
線性漸層畫刷的起點和終點的座標值和要填充的矩形之間是什麼關係?