フォームが指定領域内にあるかを判断          <TOP>


フォームが指定した矩形領域内にあるかどうかを判断します。

RectInRegion 長方形の一部または全部が、リージョンの内側にあるかどうかを判断

GetSystemMetrics さまざまなシステムメトリックスの値とシステムの現在の構成を取得

CreatePolygonRgn 多角形のリージョンを作成

GetWindowRect ウィンドウの座標をスクリーン座標系で取得

DeleteObject 論理オブジェクトを削除

 

例では、ディスプレイの右上から左下に線を引き、フォームがその左上に相当する領域内にあるかどうかを判断しています。

 

'================================================================
'= フォームが指定領域内にあるかを判断
'=    (RectInRegion.bas)
'================================================================
#include "Windows.bi"

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

Type POINTAPI
    x As Long
    y As Long
End Type

' 長方形の一部または全部が、リージョンの内側にあるかどうかを判断
Declare Function Api_RectInRegion& Lib "gdi32" Alias "RectInRegion" (ByVal hRgn&, lpRect As RECT)

' さまざまなシステムメトリックの値とシステムの現在の構成を取得
Declare Function Api_GetSystemMetrics& Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex&)

' 多角形のリージョンを作成
Declare Function Api_CreatePolygonRgn& Lib "gdi32" Alias "CreatePolygonRgn" (lppt As POINTAPI, ByVal nCount&, ByVal nPolyFillMode&)

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

' 論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放
Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&)

#define SM_CXSCREEN 0                   'ディスプレイの幅
#define SM_CYSCREEN 1                   'ディスプレイ高さ
#define INDING 2                        '全域モード(塗りつぶし)

Var Shared hRgn As Long

Var Shared Timer1 As Object
Var Shared Text1 As Object

Timer1.Attach GetDlgItem("Timer1")
Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Timer1_Timer edecl ()
Sub Timer1_Timer()
    Var sWidth As Long
    Var sHeight As Long
    Var rc As RECT
    Var pts(2) As POINTAPI
    Var IsInside As Long
    Var Ret As Long

    sWidth = Api_GetSystemMetrics(SM_CXSCREEN)
    sHeight = Api_GetSystemMetrics(SM_CYSCREEN)

    pts(0).x = 0            '┌───────┐
    pts(0).y = 0            '│       / │
    pts(1).x = sWidth       '│     /    │
    pts(1).y = 0            '│   /┏━┓ │
    pts(2).x = 0            '│  /  ┗━┛ │
    pts(2).y = sHeight      '└───────┘
    hRgn = Api_CreatePolygonRgn(pts(0), 3, INDING)

    Ret = Api_GetWindowRect(GethWnd, rc)

    IsInside = Api_RectInRegion(hRgn, rc)

    If IsInside = 0 Then
        Text1.SetWindowText "フォームは領域 外 にあります"
    Else
        Text1.SetWindowText "フォームは領域 内 にあります"
    End If

    Ret = Api_DeleteObject(hRgn)
End Sub

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