第16章 ウィンドウを画面の中央に


前回、出てきたウィンドウを画面の中央におく 関数を解説します。

int SetWinCenter(HWND hWnd) { HWND hDeskWnd; RECT deskrc, rc; int x, y; hDeskWnd = GetDesktopWindow(); GetWindowRect(hDeskWnd, (LPRECT)&deskrc); GetWindowRect(hWnd, (LPRECT)&rc); x = (deskrc.right - (rc.right-rc.left)) / 2; y = (deskrc.bottom - (rc.bottom-rc.top)) / 2; SetWindowPos(hWnd, HWND_TOP, x, y, (rc.right-rc.left), (rc.bottom-rc.top),SWP_SHOWWINDOW); return 0; }

まず、画面の大きさ(解像度)を取得しなくてはいけません。 これがわかったら、自分のウィンドウの大きさを取得します。 自分のウィンドウのx座標は画面の横幅から、自分のウィンドウの 横幅を引いて2で割ったものです。y座標についても同様の ことが言えます。これで、自分のウィンドウが どこに移動したら画面の中央に行けるかがわかります。 では、画面の大きさはどのようにして知ることができるでしょうか。

実は、画面の大きさは「デスクトップウィンドウ」と同じと考える ことができます。

ウィンドの大きさは、GetWindowRect関数で求めることができます。 これは、タイトルバーとか、全部ひっくるめた大きさを求めます。 似たようなものに、GetClientRect関数がありました。 これは、クライアント領域の大きさを求めるものでした。

BOOL GetWindowRect( HWND hWnd, // ウィンドウハンドル LPRECT lpRect // RECT構造体のアドレス );

これで、ウィンドウハンドルhWndを持つウィンドウの 大きさがRECT構造体に格納されます。

RECT構造体について忘れた人は第5章を見て下さい。

ところでデスクトップウィンドウのハンドルはどうやって知るの?

はい。これもちゃんと関数が用意されています。

HWND GetDesktopWindow(VOID)

はい、たったこれだけです。簡単ですね。 デスクトップウィンドウは多分?移動しないので右下隅の 座標のX座標が画面の横幅、Y座標が高さを表します。

デスクトップウィンドウ以外のウィンドウの横幅とか高さは 上のプログラムを見るまでもなくわかりますね。

ウィンドウを移動させる位置が決まったら さっそく移動させます。これには、SetWindowPos関数を使います。

BOOL SetWindowPos( HWND hWnd, // ウィンドウハンドル HWND hWndInsertAfter, // 移動後のZ座標 int X, int Y, int cx, // 横幅 int cy, // 高さ UINT uFlags // 移動後の状態 );

最初の引数は移動するウィンドウのウィンドウハンドルです。

2番目の引数は、移動後のZ座標です。Z座標というのは 画面を見ている人にとって近いか遠いか(ウィンドウの重なり具合 で、下の方にあるか上の方にあるか)という意味です。 直前のウィンドウのハンドルを指定するか、もしくはHWND_BOTTOM、 HWND_TOPなどのあらかじめ決められている値を指定します。

3番目、4番目の引数で移動後の位置を決めます。

5番目、6番目の引数で移動後のウィンドウの大きさを指定します。

最後の引数は、移動後のウィンドウの細かいオプションです。 通常はSWP_SHWOWWINDOWでよいでしょう。

はい、これでSetWinCenter関数の説明を終わります。

この章まで読み進んで「さっぱりわからん!」

という方、次のどれかに当てはまりませんか?

1.構造体の取り扱いとか、構造体へのポインタがよくわからない 2.見たこともないデータ型が次々に出てきて理解できない 3.へんてこな長い関数にうんざりだ 4.プロシージャ関数は一体どこから呼ばれているんだ!? 5.このHPに出ているサンプルのプログラムを入力したいが長すぎてやってられない 6.どんなときにどんなメッセージがでるのかわからん

簡単な解決方法を示します。

1.については、C言語編の構造体やポインタを読んでみてください。

2.については、*.hファイルなどを調べすぎて嫌になっていませんか。これは、unsign int型だとか (char far *)だとかを知る必要はありません。(本当は知らないといけないのかもしれませんが、 とても覚え切れません。でも慣れてくると何となくわかってきます。)知らなくても、そのような型だと 思って下さい。

3.については、慣れるしかありません。長い名前の関数ほど使い方は簡単なことがあります。 それと、名前を見ただけで何となくどんな関数なのか想像がつきます。

4.については不思議に思われると思いますが、単純にWindows様から呼ばれているのだと思いましょう。

5.についてはブラウザ上でマウスをドラッグさせてコピーを取り、ソースエジタに張り付けましょう。
もしくは、プラインドタッチの練習をしてください。プラインドタッチは、英字だけなら1時間も 練習すればできるようになります。(それなりの練習書が売られています)

6.筆者もよくわかりません。VC++の人なら「スパイ」というおまけが付いているので 時々眺めて遊んで下さい。マウス関係のメッセージがやたらめったら出ていることがわかります。

で、一番大事なことは

あまり神経質にならないこと

です。ずぼらでけっこうです。神経質になってあれこれ調べ出すと前に進みません。 前に進まないとおもしろくないのでやる気がなくなります。

あんまり、プロクラムと関係のないことを書いてしまいました。 次章からはまた、本題に戻りましょう。


[SDK Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Apr/09/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。