フォーカスを得たとき点線の枠を描画 <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