グラデーションで塗り潰し(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