• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Win32APIでウィンドウを中央に配置する関数の仕組みを教えてください。)

Win32APIでウィンドウを中央に配置する関数の仕組みを教えてください

このQ&Aのポイント
  • Win32APIを使用してウィンドウを中央に配置する関数について教えてください。
  • 具体的な計算式や仕組みについて詳しく教えてください。
  • 関数の呼び出しやウィンドウの位置調整の手順についても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

そんなに難しい事じゃないと思いますよ たとえば幅のほうなら wがGetSystemMetricsでスクリーンの幅になってるので GetWindowRectの仕様によりウインドウのスクリーン上での座標が 左がrc.left 右がrc.right になります。 これで(rc.right - rc.left)は、クライアント外のフレームの幅も含めたウインドウの幅に都合良くなってくれますから スクリーンの幅からウインドウの幅を引けば (w - (rc.right - rc.left)) 残ったのは余白の幅です その余白がウインドウの左と右に等しく割り振られるようにするためには ウインドウの左の座標がその半分になればいいわけですから x = (w - (rc.right - rc.left)) / 2; の位置に、ウインドウを移動すればいいってことになります。 高さのほうも全く同じ原理です。 あと、ウインドウを移動させるだけなら SetWindowPos(hWnd, 0, x, y, 0,0, SWP_NOSIZE); などと書くことも可能ですよ♪ 解析したわけじゃないので厳密には分かりませんが 普通に考えればおそらく最後のSWP_NOSIZEフラグによって、サイズチェックが行われない分 RECT構造体を4回参照することになってる MoveWindow(hWnd, x, y, (rc.right - rc.left), (rc.bottom - rc.top), TRUE); より、若干軽快に動作できるはずです。

HackHack
質問者

お礼

ご回答頂き、ありがとうございます。 >これで(rc.right - rc.left)は、クライアント外のフレームの幅も含めたウインドウの幅に都合良くなってくれますから >スクリーンの幅からウインドウの幅を引けば >(w - (rc.right - rc.left)) >残ったのは余白の幅です 上記の解説を基にもう一度、図を描いて考えてみたところ、 かなり理解できました。(すいません、失礼な言葉使いを致しまして) あと、もう少しで理解できそうです。 >あと、ウインドウを移動させるだけなら >SetWindowPos(hWnd, 0, x, y, 0,0, SWP_NOSIZE); 上記のコードも大変参考になりました。 誠に感謝申し上げます。

関連するQ&A