かげさんの111から始まるHistory » 初音ミク冒険記 » ウィンドウ表示位置がおかしくなる問題の対応

« 今週は時間を取れ無さそうだが、ちょっとずつやっていこう | トップページ | マシンを移動してから「PS3のDualshock3が反応しない問題」の対処 »

ウィンドウ表示位置がおかしくなる問題の対応

仕事の都合で忙しくなり、今週の開発は少しか時間が取れないはずだったのだが
昨日、一昨日は、仕事じゃなくで体調不良でダウンしていたという罠・・・shock

みなさんも、健康には気をつけましょう。

さてさて、今日の新年会は、「えびかに合戦」だけでお開きになり
時間ができたので「ウィンドウ表示位置がおかしくなる問題」について
調べてみた。

状況としては、DXライブラリ掲示板(過去ログ)の
GetWindowPositionが使えない」と同じ現象に見える。

GetWindowPositionが正しい値を返してきていない感じなのだ。

ただし、このページに書いてある対処は、実施済みだったので
Windows APIのGetWindowRectを使うことにした。

が、状況は変わらない。
常にではないんだけど、時々、ウィンドウの位置が期待した値が返ってこない。

この段階で、船さんのコメントしてくれた
ウィンドウ位置がおかしくなった時に補正するショートカットキーの追加を検討して
実装しようかなぁ、というところまで行った。

でも、やはり根本原因が分からないので
暫定対処でしか無いのは、なんとなく気持ちが悪い。sad

実は、仕事だとこういう基本的なものは、既に共通部品になっているものを使うので
ウィンドウ位置を覚えるとか、この手のコーディングを改めてするのは久しぶりな感じ。

仕事で使う共通部品では期待した動きをするので
解決方法はあるはずだ。

ということで、追加で調査してみた。

すると、ルーチェ's Homepageのプログラミング小ネタ集に
ウィンドウ位置の正しい復元」という記事があった。happy02

ここの記事は、すごく分かりやすいと思う。
これによるとGetWindowRectのよくある間違いに該当しているようだ。

試しに確認したところ、通常ウィンドウのxボタンで終わらせたり
タイトルメニューの終了から終わらせると、期待したウィンドウ位置がWindowConfig.datに格納される。
しかし、タスクバーから終わらせた時やアイコン化してから終わらせた時は、おかしなことになるようだ。

なお、デバッグウィンドウは大丈夫だと思っていたが
デバッグウィンドウも最大化や最小化をした状態で終わらせるとおかしな値になる。

つまり、ウィンドウが通常状態の時の位置を取得しないとダメということだ。
これにはGetWindowPlacementで、通常位置を取得することで対処する。

ここでDXライブラリのGetWindowPositionを調べてみた。
DxWin.cppによると以下のように呼び出されているので
GetWindowRectのよくある間違いに該当しているようだ。

GetWindowPosition
→NS_GetWindowPosition
→→GetWindowRect

つまり、GetWindowPositionを使っていた時も
内部で最終的にはWindows API GetWindowRectを使ってるから
GetWindowRectで個別にコーディングした時と同じ結果になったということらしい。

実は、GetWindowRectをGetWindowPlacementにするだけだと
アプリケーション終了後に画面解像度を変更された時に対応できない。

これにGetSystemMetricsを使って補正する対処方法があるのだが、
GetSystemMetricsは、プライマリモニタのサイズを返すのでセカンダリモニターも絡むと
プライマリモニターの位置に補正されてしまう。

上記のサイトには、これの対応方法まで載っているものの
プライマリモニタの左側にセカンダリモニタをおいている環境だと
左端のX座標がマイナスになることを考慮していない・・・

かげさんのところだと、新しい机が届いてからは、
まさしくセカンダリモニタがプライマリモニタの左側なので
考慮しないとダメらしい・・・

と厳密にやろうとすると、こういうところまで考えないとダメなんだが、
そもそも、「ウィンドウの位置を移動した後に、その場所を覚えておく」って動きは、
デバッグ設定ファイルで「ゲーム終了時にウィンドウ位置を保存する」
というデバッグオプションにしないと動作しない。

なので、ここまで厳密にやらなくても良いんじゃない?
と考えて、シンプルにGetWindowPlacementで位置を取得するって対応にした。

マルチモニターでのコーディングもやろうと思えばできるので
この問題に対応するチケットには追加情報とかも載せておき
気が向いたら対応するってレベルで良いと思っている。

一通り問題になっていた動作が解決したので、
この問題は、これでOKとしよう。happy01

面白かったら押すべし。→ へぇ~
ランキング [] [] [] [] [] [↑50] [かげさんの111から始まるHistory内]

|

このエントリーへのリンク

このエントリーのリンクを入れるHTML:

トラックバァ~ック!


★アディダスやニューバランス関連のトラックバックスパムが多すぎて★
★超迷惑なので、トラックバックは承認制としました。★
★このため、トラックバックが記事に表示されるまで
★時間がかかることがあります★

この記事にトラバ~る為のURL:

この記事へのトラックバックの一覧です: ウィンドウ表示位置がおかしくなる問題の対応:

コメント

このブログの新着コメントをRSSリーダに登録する為のxml




←名前とメールアドレスは必須です。URLも記入すれば、URLのみが公開されます。メールアドレスのみですと、メールアドレスが公開されてしまいますので、御注意ください。

メールアドレスは書きたくないって人は、掲示板に書き込むって方法もあります。掲示板はメールアドレスなしでもOKです!

↓コメント本文では、「a href」「b」「i」「br/」「p」「strong」「em」「ul」「ol」「li」「blockquote」「pre」のタグが使えます。絵文字をクリックすると、本文にタグを挿入できます。


絵文字を挿入