SSブログ

ウインドウを画面の真ん中に【Xcode】 [Macでゲームをつくろう!]

Xcodeでせっかく作ったウインドウも、自分だけで使うのならまだしも 他の人が使うものを作った場合に 真ん中に表示されないなんて事があったら、ちょっと寂しいですよね.
通常は、インタフェースビルダで 配置して作成した位置がそのまま反映されてしまうのですが、
window.png
これをなんとかして どんな大きさのウインドウでもセンターに表示してみたいですよね。
というところで、AppleScriptで考えてみました.

まずは、表示のベースとなる画面(デスクトップ)の大きさを取得しましょう。

tell application "Finder"
  set disktop_size to bounds of window of desktop
end tell
(ヒント:スクリプトは後ろ(右)の方から読むのが基本ですからね.)

「デスクトップというウインドウ」の表示されている座標を”bounds”で読み取って、変数の|disktop_size|に代入しています。
※ おっと注意です。Desktopはファインダの部品ですので "Finder"の宣言するのをお忘れなくをお忘れなく。

取得した値は、配列変数になっています。
>  { 0, 0, 1280,1024}
この値は、左から画面の原点からみて、x軸の0・y軸の0 のポイントから x軸の1280・y軸の1024 までの表示をしています。ということなので、基本的に0ポイントは変わりないので、配列変数のitem 3を横幅(w)、item 4を高さ(h)で取得すればデスクトップの大きさが測れます。
(基本的にわです。場合によっては、画面の上にあるメニューバーの22ピクセルを差し引かなければいけない場合も有りますが面倒なんで無視します)

 画面の大きさが解ったら、次は表示したいウインドウの大きさを取得します。
今回は”main”と名付けたウインドウを例にあげます。

set meinwindow_size1 to bounds of window "main"
set meinwindow_size2 to size of window "main"
※ちなみに、こちらはFinderとは無関係ですので、ファインダ宣言をした中では使用しないでくださいね。

|meinwindow_size1|という変数には、先ほどのような bounds を使って取得していますから 対角の角と角を調べています。
もうひとつの|meinwindow_size2|はなんでしょう?
 ”size”というスクリプトを使いウインドウの大きさを測っています。
・・・え? サイズが測れるならば、デスクトップの大きさもこれで測れたのでは? と思うでしょうが、実はここにはからくりがあります。前の例の"Finder"は宣言をすると "size"のスクリプトの使い方が変化してしまうのです。つまり、デスクトップの使用している容量を取得しようとしてしまうので、広さを測る意味では使用できないんですね。まぎらわしいです。

さて、測った物の|meinwindow_size1|に代入された数値は使用しません。あくまでも、こんな感じも使えますという事なので、ごめんなさい。
使うのは変数|meinwindow_size2|の { 横幅(w), 高さ(h) }です。

あとは、「デスクトップの横幅」から「ウインドウの横幅」を差し引いて、左右に均等に割り振るために2分の1にします。
高さも同じように計算しておきます。
その数値を座標を入れ込めば、あっという間にウインドウが真ん中に来ますよ。

スクリプトも用意してありますので、参考にしてください。




(* ウインドウをデスクトップの中央へ*)
tell application "Finder"
set disktop_size to bounds of window of desktop
set scr_x1 to item 1 of disktop_size
set scr_y1 to item 2 of disktop_size
set scr_x2 to item 3 of disktop_size
set scr_y2 to item 4 of disktop_size
end tell
set meinwindow_size1 to bounds of window "main"
set meinwindow_size2 to size of window "main"
set win_x to item 1 of meinwindow_size2
set win_y to item 2 of meinwindow_size2
set newWindow_x to ((scr_x2 - win_x) / 2) as integer
set newWindow_y to ((scr_y2 - win_y) / 2) as integer
set newWindow_w to (win_x + newWindow_x) as integer
set newWindow_h to (win_y + newWindow_y) as integer

set bounds of window "main" to {newWindow_x, newWindow_y, newWindow_w, newWindow_h}


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。