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

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

ただいまの
回答率

90.45%

  • UI

    134questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 2,914

yuba

score 5248

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

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

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

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

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

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

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

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

--- 追記 ---

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

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

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

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

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

--- 追記 ---

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

--- 追記 ---

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/24 11:15 編集

    回答ありがとうございます。

    仕様の定義の前に要求の定義から述べたいと思います。

    1.起動してはみたものの画面上にウィンドウが見当たらないというハマりパターンは避けたい。
    2.終了時のウィンドウ位置は、ユーザーが自分の使いやすい位置に動かした結果であるはず。
      次回起動時もその場所に出現する方が一般的にユーザーフレンドリー。

    1が優先度の高い要求です。

    さて、避けたいのは「ハマりパターン」であることから、ウィンドウ全体が表示されているという仕様は過剰であると言えます。
    (そのため、追記の中では画面左上24x24の領域が表示されてさえいればと緩めたものを挙げています)
    要求は

    1’.ユーザーがウィンドウの出現に気付き、マウス操作だけで適切な位置に移動することが可能な出現の仕方をする

    と咀嚼できます。左上24x24ってのはいい加減かつ恣意的な矩形ですが、まあこんなものでしょう。Macの場合は左上にはボタン類が固まるからもう少し大きな矩形の方が良いかもしれません。

    そして、はずれていた場合どうするかです。これは単純で「位置・サイズ調整をしない」で十分と言えます。
    新規ウィンドウを表示しようとしたら、基本的にはOSが適切な位置に配置してくれるものですので。それをあえて記憶しておいた位置に飛ばす前に画面外判定をすべきなんですがさて、という話です。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/24 14:04

    アイディアありがとうございます。

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/24 14:09

    ウィンドウサイズのことも質問文内に挙げてしまっているので若干ミスリードしてしまった感がありますが、ウィンドウサイズの調整の必要はあまりないかと思っています。はみ出ていればユーザーが調整するのは容易ですので。画面内にかすってもいない(もしくは、掴んで移動させるためのタイトルバーが隠れてしまっている)のをとにかく避けなければというのが最大の焦点になります。

    で、「微調整する」ですが、これは具体的にどういう数式のことかと考え始めるとかなりややこしいことになるかと思います。だから、coco_bauerさんへの返信の中にもあります通り、不適切な位置に再現してしまいそうなら位置再現自体を放棄して表示位置はOSに任せるのがいいと考えています。

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる