|
[リスト11-1] :
AdjustWindowRectEx( lprc, dwStyle, fMenu, dwExStyle ); LPRECT lprc; クライアント領域の矩形 DWORD dwStyle; ウィンドウスタイル BOOL fMenu; ウィンドウがメニューを持つかどうか DWORD dwExStyle; 拡張スタイル
[リスト11-2] :
void MyAdjustWindow( HWND hwnd, BOOL fMenu, int cx, int cy ) { RECT rc; SetRectEmpty( &rc ); rc.right = cx; rc.bottom = cy; AdjustWindowRectEx(&rc,GetWindowLong(hwnd, GWL_STYLE ),fMenu,GetWindowLong(hwnd, GWL_EXSTYLE) ); int cxNew = rc.right - rc.left; int cyNew = rc.bottom - rc.top; SetWindowPos(hwnd,NULL,0,0,cxNew,cyNew, SWP_NOZORDER | SWP_NOMOVE ); }
[リスト11-3] :
int GetSystemMetrics( nIndex ) int nIndex; nIndexに指定する値の例 SM_CXBORDER ウィンドウ枠の幅 SM_CXFRAME サイズ変更できるウィンドウ枠の幅 SM_CXVSCROLL 垂直スクロールバーの(矢印の)幅GetSystemMetrics()に目的のパーツを指定して呼ぶと,返り値にその大きさが返ってきます.
int cxClient = (クライアント領域の幅); int cyClient = (クライアント領域の高さ); int cx = cxClient +GetSystemMetrics(SM_CXFRAME )*2 +GetSystemMetrics(SM_CXVSCROLL ); int cy = cyClient +GetSystemMetrics( SM_SYFRAME )*2 +GetSystemMetrics( SM_CYCAPTION ) +GetSystemMetrics( SM_CYMENU );
[図11-1] :
[図11-2] :
このとき,まず修正前にフレームウィンドウの大きさとビューウィンドウの大きさの差を求めておきます.
この差は,クライアント領域以外の余った部分の大きさということになるので,この大きさに固定クライアント領域の大きさを加えれば,フレームウィンドウの大きさが求まります.
[図11-3] :
この問題は,AdjustWindowRectEx()をビュー用とフレーム用に2段階に分けて計算することで回避できます.
例えば,ビューのクライアント領域(図11-4)から,フレームウィンドウの大きさを求めるには,
(1) AdjustWindowRectEx()で,ビューのクライアントの大きさからビューのウィンドウの大きさを計算する.
(2) ビューのウィンドウの大きさから,フレームのクライアントの大きさを計算する(この例の場合は等しい).
(3) AdjustWindowRectEx()で,フレームのクライアントの大きさからフレームのウィンドウの大きさを計算する.
というようにしなければなりません.
Windows95が出る前に作ったプログラムは,こんなことはわからないので,ずれてしまうことになります.
[図11-4] :