デスクトップアプリによくある動作で「終了時の位置・サイズを記憶しておき、次回起動時に再現する」というものがあります。
ただこの動作には問題があり、終了時と次回起動時でディスプレイ構成が変わっているとデスクトップ領域外にウィンドウが飛んで行ってしまう可能性があるという点です。
# ディスプレイ構成の変更なんてそんなにないんじゃないかと言われると、いえいえ良くあります。
# 最近のタブレット型PC、横倒しにするたびに縦横の画角が入れ替わります。
# ノートマシンならプロジェクタにつないだり切ったりがあります。
さて「位置・サイズがデスクトップ領域外だったら」と言葉で言うのは簡単ですが、実際に条件に落とすのは大変です。
- 仮想デスクトップ領域に含まれるかどうかで判定しようとすると、仮想デスクトップ内だけどどのディスプレイにも含まれない領域という落とし穴があります
- どれかのディスプレイ領域に含まれるという条件で反対しようとすると、ディスプレイにまたがって表示されているときにアウト判定されてしまいます
一応これらを考慮した上でたった今ひねり出した判定条件が
- ウィンドウの矩形内のすべての点が、いずれかのディスプレイ領域(ただし第一ディスプレイについてはタスクバーを除いたワークスペース領域)の矩形に含まれること
= ウィンドウの矩形と各ディスプレイ領域の矩形の重なりの面積の合計が、ウィンドウの面積と等しいこと
となったのですが、ここで疑問は、こんなややこしい判定をどのアプリもやっているものなのか?
何かもっとスマートな定石はないものか?
という点です。
プラットフォーム依存の解決でも構いません、ノウハウをお持ちでしたら教えてください。
--- 追記 ---
条件はこう簡略化してもだいたい問題ないですかね。
●ウィンドウの4隅の点がそれぞれ、いずれかのディスプレイ矩形内に入っている
さらには、ウィンドウ全体が表示されていることまで望まなければ
●次の2つの点が、いずれかのディスプレイ矩形内に入っている
・ウィンドウ左上端
・ウィンドウ左上端から(24,24)
この条件を満たすなら、少なくともウィンドウの存在に気付いて適切な位置に移動することは可能ですから。
--- 追記 ---
「終了時位置再現など邪悪な機能である、搭載しようとすべきでない」などといったご意見でも歓迎です。
--- 追記 ---
プラットフォーム非限定の形で質問をしていましたが実際にはWindows開発でして、しかもWindowsではAPIがちゃんとありました。
SetWindowPlacement関数
画面外にはみ出す場合のみ位置を補正してくれる座標設定関数です。
クリップされている方もいらっしゃり、他プラットフォームの場合についてのノウハウも集まればなお良いのでまだ質問は開いておきます。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。