コマンドボタンを描画 <TOP>
ピクチャボックスを利用し、コマンドボタンを作成します。
CreateFontIndirect 論理フォントを作成
SelectObject 指定されたデバイスコンテキストのオブジェクトを選択
GetSysColor システムの背景色を取得
SetBkColor デバイスコンテキストの背景色を設定
DrawFrameControl 指定されたタイプとスタイルを備える、ボタンやスクロールバーなどのフレームコントロールを描画
DrawText 文字列を指定領域に出力
GetDC ディスプレイデバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放
'================================================================ '= コマンドボタンを描画 '= フォーカス点線無し '= (DrawFrameControl4.bas) '================================================================ #include "Windows.bi" Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type #define LF_FACESIZE 32 Type LOGFONT lfHeight As Long lfWidth As Long lfEscapement As Long lfOrientation As Long lfWeight As Long lfItalic As byte lfUnderline As byte lfStrikeOut As byte lfCharSet As byte lfOutPrecision As byte lfClipPrecision As byte lfQuality As byte lfPitchAndFamily As byte lfFaceName(LF_FACESIZE) As byte End Type ' 論理フォントを作成 Declare Function Api_CreateFontIndirect& Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) ' 指定されたデバイスコンテキストのオブジェクトを選択 Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&) ' システムの背景色を取得 Declare Function Api_GetSysColor& Lib "user32" Alias "GetSysColor" (ByVal nIndex&) ' デバイスコンテキストの背景色を設定 Declare Function Api_SetBkColor& Lib "gdi32" Alias "SetBkColor" (ByVal hDC&, ByVal crColor&) ' 指定されたタイプとスタイルを備える、ボタンやスクロールバーなどのフレームコントロールを描画 Declare Function Api_DrawFrameControl& Lib "user32" Alias "DrawFrameControl" (ByVal hDC&, lpRect As RECT, ByVal un1&, ByVal un2&) ' 文字列を指定領域に出力 Declare Function Api_DrawText& Lib "user32" Alias "DrawTextA" (ByVal hDC&, ByVal lpStr$, ByVal nCount&, lpRect As RECT, ByVal wFormat&) ' 指定のウィンドウにマウスキャプチャを設定 Declare Function Api_SetCapture& Lib "user32" Alias "SetCapture" (ByVal hWnd&) ' マウスのキャプチャを解放 Declare Function Api_ReleaseCapture& Lib "user32" Alias "ReleaseCapture" () ' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得 Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) #define DT_CENTER &H1 'テキストを水平方向に中央揃えで表示します。 #define DT_VCENTER &H4 'テキストを垂直方向の中央揃え。DT_SINGLELINEと同時に指定する必要がある #define DT_SINGLELINE &H20 'テキストを改行せず、一行で表示 #define BDR_RAISEDOUTER &H1 '外側エッジが凸 #define BDR_SUNKENOUTER &H2 '外側エッジが凹 #define BDR_RAISEDINNER &H4 '内側が凸 #define BDR_SUNKENINNER &H8 '内側が凹 #define BDR_OUTER &H3 ' #define BDR_INNER &HC ' #define BF_RECT &HF '(BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM) #define DFC_BUTTON 4 'ボタンコントロールを描画 #define DFCS_BUTTONPUSH &H10 'プッシュボタン #define DFCS_PUSHED &H200 '押された状態 #define COLOR_BTNFACE 15 'コマンドボタンの表面色 Var Shared Pushed As Integer Var Shared Picture1 As Object Picture1.Attach GetDlgItem("Picture1") '================================================================ '= '================================================================ Declare Sub ButtonDraw edecl () Sub ButtonDraw() Var rc As RECT Var lf As LOGFONT Var hDC As Long Var State As Long Var Caption As String Var rFont As Long Var BkCol As Long 'Picture1のハンドルを取得 hDC = Api_GetDC(Picture1.GethWnd) 'ボタンの色をシステムより取得 BkCol = Api_GetSysColor(COLOR_BTNFACE) 'バックカラーに指定 Ret = Api_SetBkColor(hDC, BkCol) 'ボタンの凹凸を設定 State = DFCS_BUTTONPUSH If Pushed = True Then State = State Or DFCS_PUSHED End If 'キャプションを設定 Caption = "ButtonEx" 'フォントサイズ14P、日本語、イタリック指定 lf.lfHeight = 14 lf.lfCharSet = 128 lf.lfItalic = 1 rFont = Api_CreateFontIndirect(lf) Ret = Api_SelectObject(hDC, rFont) 'ボタンのサイズを設定 rc.Left = 0 rc.Top = 0 rc.Right = Picture1.GetWidth rc.Bottom = Picture1.GetHeight 'ボタンを描画 Ret = Api_DrawFrameControl(hDC, rc, DFC_BUTTON, State) '押されている状態の時は2ドットずらす If Pushed = True Then rc.Left = 2 rc.Top = 2 End If 'ボタンのテキストの表示 Ret = Api_DrawText(hDC, Caption, Len(Caption), rc, DT_CENTER Or DT_VCENTER Or DT_SINGLELINE) 'デバイスコンテキストの解放 Ret = Api_ReleaseDC(Picture1.GethWnd, hDC) End Sub '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Ret = Api_SetCapture(Picture1.GethWnd) ButtonDraw End Sub '================================================================ '= マウスを動かしたとき '================================================================ Declare Sub Picture1_MouseMove edecl(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) Sub Picture1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) Var Ret As Long 'マウスが Picture 上にあるとき If x >= 0 And y >= 0 And x <= Picture1.GetWidth And y <= Picture1.GetHeight Then Ret = Api_SetCapture(Picture1.GethWnd) ButtonDraw 'マウスが Picture1 を外れたとき Else Ret = Api_ReleaseCapture Pushed = False ButtonDraw End If End Sub '================================================================ '= マウスを押したとき '================================================================ Declare Sub Picture1_MouseDown edecl (Button As Integer, Shift As Integer, x As Single, y As Single) Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) Var Ret As Long Ret = Api_SetCapture(Picture1.GethWnd) Pushed = True ButtonDraw SetFocus End Sub '================================================================ '= マウスを離したとき '================================================================ Declare Sub Picture1_MouseUp edecl (Button As Integer, Shift As Integer, x As Single, y As Single) Sub Picture1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) Var Ret As Long Ret = Api_ReleaseCapture Pushed = False ButtonDraw End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End