フォーカスを得たとき点線の枠を描画          <TOP>


DrawFocusRect フォーカスを得たとき、点線の枠を描画

InflateRect RECT構造体の座標を拡大・縮小

 

DrawFocusRectは、同じ矩形領域を再描画した場合は、その矩形(点線)は消去されます。Xorの関係

InflateRect(rc, -1, -1)を繰り返すことにより点線の太さを変えています。

関連

MiniMiniSpy--は、領域を赤枠で描画していますが、DrawFocusRectで点線で描画する方法もあります。

 

'================================================================
'= フォーカスを得た時、点線の枠を描く
'=    (DrawFocusRect2.bas)
'================================================================
#include "Windows.bi"

Type POINTAPI
    x As Long
    y As Long
End Type

Type RECT
    Left   As Long
    Top    As Long
    Right  As Long
    Bottom As Long
End Type

' ウィンドウの座標をスクリーン座標系で取得
Declare Function Api_GetWindowRect& Lib "user32" Alias "GetWindowRect" (ByVal hWnd&, lpRect As RECT)

' カーソルの現在のスクリーン座標の取得
Declare Function Api_GetCursorPos& Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI)

' 指定の座標位置にあるウィンドウハンドルを取得
Declare Function Api_WindowFromPoint& Lib "user32" Alias "WindowFromPoint" (ByVal xPoint&, ByVal yPoint&)

' ウィンドウ全体のデバイスコンテキストを取得
Declare Function Api_GetWindowDC& Lib "user32" Alias "GetWindowDC" (ByVal hWnd&)

' 指定されたデバイスコンテキストを削除
Declare Function Api_DeleteDC& Lib "gdi32" Alias "DeleteDC" (ByVal hDC&)

' ペン、ブラシ、フォント、ビットマップ、リージョン、パレットのいずれかの論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放。オブジェクトを削除した後は、指定されたハンドルは無効になる
'Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&)

' フォーカスを得た時、点線の枠を描く
Declare Function Api_DrawFocusRect& Lib "user32" Alias "DrawFocusRect" (ByVal hDC&, lpRect As RECT)

' RECT構造体の座標値を拡大・縮小
Declare Function Api_InflateRect& Lib "user32" Alias "InflateRect" (lpRect As RECT, ByVal x&, ByVal y&)

' RECT構造体の値を設定
Declare Function Api_SetRect& Lib "user32" Alias "SetRect" (lpRect As RECT, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)

Var Shared Text1 As Object
Var Shared Edit1 As Object
Var Shared Check1 As Object
Var Shared Radio1 As Object
Var Shared Button1 As Object
Var Shared Timer1 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Check1.Attach GetDlgItem("Check1") : Check1.SetFontSize 14
Radio1.Attach GetDlgItem("Radio1") : Radio1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
Timer1.Attach GetDlgItem("Timer1")

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Timer1.SetInterval 40
    Timer1.Enable -1
End Sub

'================================================================
'=
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    Var hWnd As Long
    Var hDC As Long
    Var rc As RECT
    Var pa As POINTAPI
    Var Ret As Long

    'カーソル位置のスクリーン座標を取得
    Ret = Api_GetCursorPos(pa)

    '座標を含むウィンドウのハンドルを取得
    hWnd = Api_WindowFromPoint(pa.x, pa.y)

    '矩形領域を取得
    Ret = Api_GetWindowRect(hWnd, rc)

    'デバイスコンテキストを取得
    hDC = Api_GetWindowDC(hWnd)
    Ret = Api_SetRect(rc, 0, 0, rc.Right - rc.Left, rc.Bottom - rc.Top)

    If hWnd <> 0 Then
        '太さ(lw)を設定し点線枠を描画
        For lw = 0 To 1
            Ret = Api_DrawFocusRect(hDC, rc)
            Ret = Api_InflateRect(rc, -1, -1)
        Next
    End If

    Ret = Api_DeleteDC(hDC)
End Sub

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