質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Q&A

解決済

4回答

5509閲覧

ウィンドウ位置の再現、どうやっていますか?

yuba

総合スコア5568

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

2グッド

3クリップ

投稿2015/12/24 01:02

編集2015/12/24 07:47

デスクトップアプリによくある動作で「終了時の位置・サイズを記憶しておき、次回起動時に再現する」というものがあります。
ただこの動作には問題があり、終了時と次回起動時でディスプレイ構成が変わっているとデスクトップ領域外にウィンドウが飛んで行ってしまう可能性があるという点です。

# ディスプレイ構成の変更なんてそんなにないんじゃないかと言われると、いえいえ良くあります。
# 最近のタブレット型PC、横倒しにするたびに縦横の画角が入れ替わります。
# ノートマシンならプロジェクタにつないだり切ったりがあります。

さて「位置・サイズがデスクトップ領域外だったら」と言葉で言うのは簡単ですが、実際に条件に落とすのは大変です。

  • 仮想デスクトップ領域に含まれるかどうかで判定しようとすると、仮想デスクトップ内だけどどのディスプレイにも含まれない領域という落とし穴があります
  • どれかのディスプレイ領域に含まれるという条件で反対しようとすると、ディスプレイにまたがって表示されているときにアウト判定されてしまいます

一応これらを考慮した上でたった今ひねり出した判定条件が

  • ウィンドウの矩形内のすべての点が、いずれかのディスプレイ領域(ただし第一ディスプレイについてはタスクバーを除いたワークスペース領域)の矩形に含まれること

= ウィンドウの矩形と各ディスプレイ領域の矩形の重なりの面積の合計が、ウィンドウの面積と等しいこと

となったのですが、ここで疑問は、こんなややこしい判定をどのアプリもやっているものなのか?
何かもっとスマートな定石はないものか?
という点です。

プラットフォーム依存の解決でも構いません、ノウハウをお持ちでしたら教えてください。

--- 追記 ---

条件はこう簡略化してもだいたい問題ないですかね。

●ウィンドウの4隅の点がそれぞれ、いずれかのディスプレイ矩形内に入っている

さらには、ウィンドウ全体が表示されていることまで望まなければ

●次の2つの点が、いずれかのディスプレイ矩形内に入っている
・ウィンドウ左上端
・ウィンドウ左上端から(24,24)

この条件を満たすなら、少なくともウィンドウの存在に気付いて適切な位置に移動することは可能ですから。

--- 追記 ---

「終了時位置再現など邪悪な機能である、搭載しようとすべきでない」などといったご意見でも歓迎です。

--- 追記 ---

プラットフォーム非限定の形で質問をしていましたが実際にはWindows開発でして、しかもWindowsではAPIがちゃんとありました。
SetWindowPlacement関数
画面外にはみ出す場合のみ位置を補正してくれる座標設定関数です。

クリップされている方もいらっしゃり、他プラットフォームの場合についてのノウハウも集まればなお良いのでまだ質問は開いておきます。

Tak1wa, afroscript👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

自己解決

質問欄への追記にあります通り、Windowsにおける正しい作法はSetWindowPlacement関数を使うことでした。

投稿2016/01/14 03:02

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

現在のwindow 位置、大きさを保存する。このとき、画面サイズも取得する。
次回起動時、保存しておいた位置とサイズで復帰する。復帰時の画面サイズの比率で表示位置と大きさを微調整する。100 x 100 以下になった場合は、100x100 の大きさで、画面端に切れないように画面内に収まるように調整する。
1280x1024 、→ 1024x768 なら横 1024/1280 縮小、768/1024縦縮小です。

タブレットの縦横のときは、サイズが16:9とかで、横表示が縦表示になると物凄くコンパクトな画面になっちゃうけど、比率を保ってるから可能な限り前回の画面を復帰してまづ、っていえます、ユーザ要件にもバッチリでづ。
比率で表示開始位置が変化するので、微妙な重なりやオーバーラップで実は開いてる画面が大きい奴の裏に隠れてしまう状況が出てきます。裏に隠れた画面の右数ドットしか見えてないとか、こういう操作性を損ねる状況のときは、更に微調整でづ。

投稿2015/12/24 04:57

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/12/24 05:09

ウィンドウサイズのことも質問文内に挙げてしまっているので若干ミスリードしてしまった感がありますが、ウィンドウサイズの調整の必要はあまりないかと思っています。はみ出ていればユーザーが調整するのは容易ですので。画面内にかすってもいない(もしくは、掴んで移動させるためのタイトルバーが隠れてしまっている)のをとにかく避けなければというのが最大の焦点になります。 で、「微調整する」ですが、これは具体的にどういう数式のことかと考え始めるとかなりややこしいことになるかと思います。だから、coco_bauerさんへの返信の中にもあります通り、不適切な位置に再現してしまいそうなら位置再現自体を放棄して表示位置はOSに任せるのがいいと考えています。
guest

0

終了時に座標を記録するのではなくて、画面のクライアント領域を100とした現在の座標がどこにあたるのかという比率で記憶させて、起動時に画面の領域サイズから再計算して算出するってのはいかがでしょうか?
後は必要に応じて表示するウィンドウの最大/最小の縦/横サイズのチェックを入れる、画面の縦横比が変わった場合にウィンドウの縦横比を変える場合は起動時も同じように対応したほうが良いと思うので矩形な4点を比率で記憶させるのか縦横比を変えないのであれば左上のポイントだけか左の上下のポイントだけかを決めていけばいいかと思います

投稿2015/12/24 04:57

len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/12/24 05:04

アイディアありがとうございます。 比率で終了時位置を表現すれば、どんな環境で起動しても画面をはみ出ることはないということですね。マルチディスプレイ環境では存在したディスプレイの中での位置比率ということになるでしょうか。 次回起動時、該当するディスプレイが存在しなくてもプライマリディスプレイに再現すればいいから動作が決定できなくなることもなさそうです。
guest

0

「位置の再現」をどう解釈するのかが決まれば、対処方法も決まるのではないでしょうか?

例えば、タブレットを画面が横長になる向きで使っていた際に画面右端にあったウィンドウは、タブレットを回して画面を縦長にすると画面(ディスクトップ領域)の外になってしまいます。
しかし画面左上隅とウィンドウの左上隅の位置関係は維持されているので、タブレットの向きが変わっても「位置が再現」されたと解釈できます。

しかし、この解釈はyubaさんには受け入れがたいものなのでしょうね。

私が受けた印象では、
1)「ディスプレイ構成が変わっても、終了時に表示されていたウィンドウはたとえ一部分でも良いので画面(デスクトップ領域)に表示される事」が必須。
2)複数のデスクトップ(仮想を含む)も対象である。
という事かと思います。

想定される画面構成変更の範囲、仮想も含めたデスクトップ領域の数と位置関係といった条件を現実に即して限定し、いくつかの典型例において許容できる「位置の再現」を定義してみては如何でしょうか。

・ウィンドウの一部でも表示できればOKなのか、全体が表示できなければダメなのか、
・デスクトップにウィンドウが表示できない場合に、どのような対処を取るのか(ズーミング、新たなデスクトップ領域の生成、etc.)
など、考えられる事はいろいろあると思いますが、何を優先するのかによって適切解は異なってきますので、まず yubaさんが目指す方向性を明らかにすべきだと思います。(既に方向性が決まっているのなら、それを質問に判りやすく表明してください)

投稿2015/12/24 02:03

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/12/24 02:18 編集

回答ありがとうございます。 仕様の定義の前に要求の定義から述べたいと思います。 1.起動してはみたものの画面上にウィンドウが見当たらないというハマりパターンは避けたい。 2.終了時のウィンドウ位置は、ユーザーが自分の使いやすい位置に動かした結果であるはず。   次回起動時もその場所に出現する方が一般的にユーザーフレンドリー。 1が優先度の高い要求です。 さて、避けたいのは「ハマりパターン」であることから、ウィンドウ全体が表示されているという仕様は過剰であると言えます。 (そのため、追記の中では画面左上24x24の領域が表示されてさえいればと緩めたものを挙げています) 要求は 1’.ユーザーがウィンドウの出現に気付き、マウス操作だけで適切な位置に移動することが可能な出現の仕方をする と咀嚼できます。左上24x24ってのはいい加減かつ恣意的な矩形ですが、まあこんなものでしょう。Macの場合は左上にはボタン類が固まるからもう少し大きな矩形の方が良いかもしれません。 そして、はずれていた場合どうするかです。これは単純で「位置・サイズ調整をしない」で十分と言えます。 新規ウィンドウを表示しようとしたら、基本的にはOSが適切な位置に配置してくれるものですので。それをあえて記憶しておいた位置に飛ばす前に画面外判定をすべきなんですがさて、という話です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問