領域内の塗り潰し(U)          <TOP>


RoundRectで指定した領域内を塗り潰します。

CreateSolidBrush 純色(ソリッドカラー)で論理ブラシを作成

DeleteObject グラフィックスオブジェクトを削除

ExtFloodFill 選択されているブラシで一定の範囲内を塗りつぶす

SelectObject デバイスコンテキストにオブジェクトを選択

RoundRect  角の丸い矩形を描画

GetSystemMetrics 表示要素の寸法とシステム構成の設定を取得

 

フォームにはサイズグリップを表示させています。

フォームをリサイズした場合、同じ比率で枠を作成しランダムな色で塗り潰します。

塗り潰し領域をフォームの中央にくるよう、メニュー・フレーム・ボーダー等の幅を取得計算しています。

 

 

 

 

'================================================================
'= 領域内の塗り潰し(U)
'=    (CreateSolidBrush.bas)
'================================================================
#include "Windows.bi"

' 純色(ソリッドカラー)で論理ブラシを作成
Declare Function Api_CreateSolidBrush& Lib "gdi32" Alias "CreateSolidBrush" (ByVal crColor&)

' グラフィックスオブジェクトを削除
Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&)

' 選択されているブラシで一定の範囲内を塗りつぶす
Declare Function Api_ExtFloodFill& Lib "gdi32" Alias "ExtFloodFill" (ByVal hDC&, ByVal nXStart&, ByVal nYStart&, ByVal crColor&, ByVal fuFillType&)

' デバイスコンテキストにオブジェクトを選択
Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&)

' 角の丸い矩形を描画
Declare Function Api_RoundRect& Lib "gdi32" Alias "RoundRect" (ByVal hDC&, ByVal nLeftRect&, ByVal nTopRect&, ByVal nRightRect&, ByVal nBottomRect&, ByVal nWidth&, ByVal nHeight&)

' 表示要素の寸法とシステム構成の設定を取得
Declare Function Api_GetSystemMetrics& Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

#define FLOODFILLBORDER 0
#define FLOODFILLSURFACE 1

#define SM_CXFRAME 32           'サイズ可変ウィンドウの境界線の、X方向の幅
#define SM_CYFRAME 33           ' 〃Y方向の幅
#define SM_CYSIZE 31            'タイトルバー内のビットマップの高さ
#define SM_CYBORDER 6           'サイズ固定ウィンドウの境界線のY方向の幅

Var Shared Text1 As Object

Var Shared zX As Integer
Var Shared zY As Integer

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var fs As Integer

    fs = 14
    Text1.Attach GetDlgItem("Text1")
    Text1.SetFontSize fs
    Text1.SetWindowSize fs, fs
    Text1.SetFontName "Marlett"
    Text1.SetWindowText "o"

    ShowWindow -1

    zX = Api_GetSystemMetrics(SM_CXFRAME) * 2
    zY = Api_GetSystemMetrics(SM_CYFRAME) * 2 + Api_GetSystemMetrics(SM_CYBORDER) + Api_GetSystemMetrics(SM_CYSIZE)
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_Resize edecl ()
Sub MainForm_Resize()
    Var hBrush As Long
    Var hOldBrush As Long
    Var RndCol As Long
    Var hDC As Long
    Var Ret As Long

    on error goto *Er_Trap

    '/ サイズグリップ表示
    Text1.MoveWindow (Getwidth - Text1.GetWidth) - zX, GetHeight - Text1.GetHeight - zY

    cls

    hDC = Api_GetDC(GethWnd)
    ' Left Top Right Bottom Corner
    Ret = Api_RoundRect(hDC, (GetWidth - zX) / 5, (GetHeight - zY) / 5, (GetWidth - zX) / 5 * 4, (GetHeight - zY) / 5 * 4, 20, 20)

    '/ ランダムなブラシ作成
    Randomize time
    RndCol = rgb(int(rnd(1) * 255 + 1), int(rnd(1) * 255 + 1), int(rnd(1) * 255 + 1))
    hBrush = Api_CreateSolidBrush(RndCol)

    hOldBrush = Api_SelectObject(hDC, hBrush)

    '/ RoundRect内を塗り潰し
    Ret = Api_ExtFloodFill(hDC, (GetWidth - zX) / 2, (GetHeight - zY) / 2, rgb(0, 0, 0), FLOODFILLBORDER)

    Ret = Api_SelectObject(hDC, hOldBrush)

    Ret = Api_DeleteObject(hBrush)
    Ret = Api_ReleaseDC(GethWnd, hDC)
    Exit Sub

*Er_Trap
    resume Next
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End