- 446 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 20:26:02 ]
- これをwin32の質問と見なして良いかどうか微妙ですが、
考えていると脳みそが沸騰して訳が分からなくなったので質問させていただきます。 質問 ・VISTAのAero ON でウィンドウを作成する前にそのサイズを知る方法。 開発環境 SDK/VC++ 2005 問題の解決には、通常GetSystemMetrics()かAdjustWindowRectEx()を使うと思います。 ところが、VISTAのAeroが有効なときは奇妙な現象が起こります。 そこで実験してみました。 dwStyleA = (WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CLIPCHILDREN); dwStyleB = dwStyleA | WS_THICKFRAME; の設定で、100,100 (800x600)をAdjustWindowRectEx すると dwStyleA: 97,76 806x627 border w,h: 3,3 dwStyleB: 92,71 816x637 border w,h: 8,8 という結果が返ります。各borderは、次の式で求めています。 横は(ウィンドウ幅-クライアント幅)/2 縦は(ウィンドウ高-クライアント高-::GetSystemMetrics(SM_CYSMCAPTION))/2 一見して当たり前で、作成されたウィンドウをキャプチャしてサイズを確認した ところ、確かに2000/Xp/VISTA aero off の時は見た目もこの通りになります。 しかし、VISTAのaeroが有効な環境では、dwStyleAでもdwStyleBでも、 見た目はdwStyleBと同じ(!)になるのです。 しかも、GetSystemMetricsもAdjustWindowRectExもAero on/off で同じ値を返します。 もちろん作成後に GetWindowRect()した場合、AdjustWindowRectEx()と 整合性のある値(つまり見た目とは違った値)を返します。 これがAPIのバグでないとしたら、dwm.exeが独自にウィンドウを装飾している ものと思われますが、その値を取得する方法がわかりません。 1.Aero on時に見た目通りのウィンドウサイズを取得する方法は? 2.Aero on時のウィンドウサイズは常に thickframeと同じと見なしていいの? 3.2が良いとした場合、Aero on を手軽に知る方法は?
|

|