SetClientRect

http://toshi.my.land.to/table/setclientrect/
* トップ ページ - プログラムのテーブル - SetClientRect :: 概要 / コード / 引数 / 戻り値 / 解説

概要

ウィンドウのサイズを変更する際には、ウィンドウの枠なども含めたサイズを
考慮しなければならず、クライアント領域のサイズを一定にしたい場合は
プログラム側が環境による違いの面倒を見てあげなければなりません。
これは、クライアント領域のサイズを指定するだけで、簡単にウィンドウのサイズを
変更してくれる関数です。

コード

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
Declare Function AdjustWindowRectEx Lib "user32.dll" (ByRef lpRect As RECT,dwStyle As DWord,bMenu As Long,dwExStyle As DWord) As Long
Declare Function SetRect Lib "user32.dll" (ByRef lprc As RECT,xLeft As Long,yTop As Long,xRight As Long,yBottom As Long) As Long

Function SetClientRect (hWnd As HWND,x As Long,y As Long) As Long

    Dim Rect As RECT,bMenu As Long,Rect2 As RECT
    SetRect(Rect,0,0,x,y)
    If GetMenu(hWnd)=0 Then bMenu=0 Else bMenu=1
    AdjustWindowRectEx(Rect,GetWindowLong(hWnd,GWL_STYLE),bMenu,GetWindowLong(hWnd,GWL_EXSTYLE))
    GetWindowRect(hWnd,Rect2)
    SetClientRect=MoveWindow(hWnd,Rect2.left,Rect2.top,Rect.right-Rect.left,Rect.bottom-Rect.top,TRUE)

End Function

引数

hWnd As HWND
ウィンドウ ハンドルを指定します。

x As Long
クライアント領域の幅を指定します。

y As Long
クライアント領域の高さを指定します。

戻り値

成功すると、0 以外の値を返します。
失敗すると、0 を返します。
拡張エラー情報を取得するには、GetLastError API を使用します。

解説

AdjustWindowRectEx API が最も重要なポイントです。
この API が返した必要な領域を基に、MoveWindow API を呼び出しています。

06/07/13 追記
プログラム掲示板にて、Sinryowさんが更に単純明快なコードを紹介してくださいました。

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
Function SetClientRect(hWnd As HWND, width As Long, height As Long) As Long

Dim rcWindow As RECT, rcClient As RECT
Dim difWidth As Long, difHeight As Long

GetWindowRect(hWnd, rcWindow)
GetClientRect(hWnd, rcClient)

difWidth = (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left)
difHeight = (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top)

SetClientRect = MoveWindow(hWnd, rcWindow.left, rcWindow.top, width + difWidth, height + difHeight, TRUE)
End Function

Sinryowさん曰く、
ウィンドウのサイズとクライアント領域のサイズの差を比較し、それを加算してやるという方法です。
ただし、メニューが折り返されて2行になったりするとうまくいきませんが・・・。

とのことです。こちらの方法をお勧めします(爆)

ページの先頭へ戻る
プログラムのテーブルへ戻る
トップ ページへ戻る

* トップ ページ - プログラムのテーブル - SetClientRect :: 概要 / コード / 引数 / 戻り値 / 解説
http://toshi.my.land.to/table/setclientrect/
(C) 2005 - 2010 Toshi, All Rights Reserved.