クライアント領域の表示状態を調べる          <TOP>


クライアント領域の表示状態を調べます。

FindWindow クラス名、キャプション名を与えてウィンドウハンドルを取得

GetClipBox デバイスコンテキストの歌詞領域を描画できる最小境界長方形の寸法を取得

GetClientRect ウィンドウのクライアント領域座標を取得

EqualRect 二つの長方形の寸法を比較して、等しいかどうかを調べる

GetDC デバイスコンテキストを取得

ReleaseDC デバイスコンテキストの解放

 

前もってメモ帳を起動しておき、その領域の表示状態を調べています。

注)

Windows 7 において、Aeroテーマではどの状態でも「完全に見えている」となります。

Windows Vista では、試しておりませんが同様ではないかと・・

'================================================================
'= クライアント領域の表示状態を調べる
'=    (EqualRect.bas)
'================================================================
#include "Windows.bi"

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

' クラス名またはキャプションを与えてウィンドウのハンドルを取得
Declare Function Api_FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$)

' デバイスコンテキストの可視領域を描画できる最小境界長方形の寸法を取得
Declare Function Api_GetClipBox& Lib "gdi32" Alias "GetClipBox" (ByVal hDC&, lprc As RECT)

' ウィンドウのクライアント領域の座標を取得
Declare Function Api_GetClientRect& Lib "user32" Alias "GetClientRect" (ByVal hWnd&, lpRect As RECT)

' 2つの長方形の寸法を比較して、長方形が等しいかどうかを判断
Declare Function Api_EqualRect& Lib "user32" Alias "EqualRect" (lprc1 As RECT, lprc2 As RECT)

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

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

#define ERROR 0                         'エラー
#define NULLREGION 1                    '空のリージョンが作成された
#define SIMPLEREGION 2                  '境界の重ならないリージョンが作成された
#define COMPLEXREGION 3                 'ひとつ以上の長方形からなるリージョンが作成された

Var Shared Text1 As Object
Var Shared Button1 As Object

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

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var ClassName As String
    Var hWindow As Long
    Var hDC As Long
    Var ClientRect As RECT
    Var ClipBoxRect As RECT
    Var Ret As Long

    'クラス名でウィンドウハンドルを取得
    ClassName = "Notepad"

    hWindow = Api_FindWindow(ClassName, ByVal 0)

    'ウィンドウハンドルが取得できた場合は
    If hWindow <> 0 Then

        'クライアント領域に対応するデバイスコンテキストのハンドルを取得
        hDC = Api_GetDC(hWindow)

        '可視領域を描画できる最小境界長方形の寸法を取得
        Select Case Api_GetClipBox(hDC, ClipBoxRect)

            'リージョンは空
            Case NULLREGION
                Text1.SetWindowText "完全に隠れている"

            'リージョンは単一の長方形
            Case SIMPLEREGION

                'ウィンドウのクライアント領域の寸法を取得
                Ret = Api_GetClientRect(hWindow, ClientRect)

                '可視領域を描画できる最小境界長方形の寸法と比較
                If Api_EqualRect(ClipBoxRect, ClientRect) Then
                    Text1.SetWindowText "完全に見えている"
                Else
                    Text1.SetWindowText "単一の長方形に見えるように隠れている"
                End If

            'リージョンは複数の長方形
            Case COMPLEXREGION
                Text1.SetWindowText "複数の長方形に見えるように隠れている"

            'エラー
            Case ERROR
                Text1.SetWindowText "エラーで取得できない"
        End Select

        'デバイスコンテキストを解放
        Ret = Api_ReleaseDC(hWindow, hDC)
    Else
        A% = MessageBox("EqualRect", "メモ帳を起動してください!", 0, 2)
    End If
End Sub

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