グラデーションで塗り潰し(U) <TOP>
長方形又は三角形領域をグラデーションで塗りつぶします。
GetSystemMetrics
さまざまなシステムメトリックの値とシステムの現在の構成を取得
GradientFill
長方形又は三角形をグラデーションで塗りつぶす
GetDC
デバイスコンテキストのハンドルを取得
ReleaseDC
デバイスコンテキストを解放
上半分を水平方向に、下半分を縦方向にグラデーションで塗り潰しています。
WindowsXPとWindows2000では、メニューバーの高さが異なるためクライアントエリアの高さを求めて2等分しています。
'================================================================ '= 長方形又は三角形領域をグラデーションで塗りつぶす
'= (GradientFillRect.bas) '================================================================ #include "Windows.bi" Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Type TRIVERTEX x As Long y As Long Red As Integer Green As Integer Blue As Integer Alpha As Integer End Type Type GRADIENT_RECT UpperLeft As Long LowerRight As Long End Type ' さまざまなシステムメトリックの値とシステムの現在の構成を取得 Declare Function Api_GetSystemMetrics& Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex&) ' 長方形又は三角形をグラデーションで塗りつぶす Declare Function Api_GradientFill& Lib "msimg32" Alias "GradientFill" (ByVal hDC&, pVertex As TRIVERTEX, ByVal dwNumVertex&, pMesh As GRADIENT_RECT, ByVal dwNumMesh&, ByVal dwMode&) ' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得 Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) #define SM_CYMIN 29 'ウィンドウの最小高さ #define SM_CYBORDER 6 'サイズ固定ウィンドウの境界線のY方向の幅 #define GRADIENT_FILL_RECT_H &H0 #define GRADIENT_FILL_RECT_V &H1 #define GRADIENT_FILL_TRIANGLE &H2 #define GRADIENT_FILL_OP_FLAG &HFF '================================================================ '= '================================================================ Declare Function CCol(ByVal Col As Byte) As Integer Function CCol(ByVal Col As Byte) As Integer If Col > &H7F Then CCol = (Col * &H100) - &H10000 Else CCol = Col * &H100 End If End Function '================================================================ '= '================================================================ Declare Sub DrawGradient() Sub DrawGradient() Var hDC As Long Var fHeight As Long Var Vertex(1) As TRIVERTEX Var gr As GRADIENT_RECT Var Ret As Long Cls hDC = Api_GetDC(GethWnd) '枠の高さ fHeight = Api_GetSystemMetrics(SM_CYMIN) + Api_GetSystemMetrics(SM_CYBORDER) '上半分横方向グラデーション Vertex(0).x = 0 Vertex(0).y = 0 Vertex(0).Red = CCol(255) Vertex(0).Green = 0 Vertex(0).Blue = 0 Vertex(0).Alpha = 0 Vertex(1).x = GetWidth Vertex(1).y = (GetHeight - fHeight) / 2 Vertex(1).Red = 0 Vertex(1).Green = 0 Vertex(1).Blue = CCol(255) Vertex(1).Alpha = 0 gr.UpperLeft = 0 gr.LowerRight = 1 Ret = Api_GradientFill(hDC, Vertex(0), 2, gr, 1, GRADIENT_FILL_RECT_H) '下半分縦方向グラデーション Vertex(0).x = 0 Vertex(0).y = (GetHeight - fHeight) / 2 Vertex(0).Red = CCol(255) Vertex(0).Green = 0 Vertex(0).Blue = 0 Vertex(0).Alpha = 0 Vertex(1).x = GetWidth Vertex(1).y = (GetHeight - fHeight) Vertex(1).Red = 0 Vertex(1).Green = CCol(255) Vertex(1).Blue = 0 Vertex(1).Alpha = 0 gr.UpperLeft = 0 gr.LowerRight = 1 Ret = Api_GradientFill(hDC, Vertex(0), 2, gr, 1, GRADIENT_FILL_RECT_V) End Sub '================================================================ '= '================================================================ Declare Sub MainForm_Resize edecl () Sub MainForm_Resize() DrawGradient End SUb '================================================================ '= '================================================================ Declare Sub MainForm_QueryClose edecl () Sub MainForm_QueryClose() Ret = Api_ReleaseDC(GethWnd, hDC) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End