【Cocoa】ウインドウの大きさの取得
実はアプリケーション設定の保存と読み込みの勉強をしようと思った。保存対象でありがちなのをと思いウインドウサイズなんかいいんだろうとか考えたんだが、ウインドウサイズの取得方法すらわからない。
そんなわけで今回は、ウインドウサイズの取得方法のまとめ。いろんな記事を参考にはしたのだが、「ズバリこれ!」という記事が見つからず、今回の内容はもしかしたらかなり自己流かもしれない・・・。
ボタンをクリックすると、そのときのウインドウサイズと位置をログに出力するサンプルアプリを作ってみることにする。
■まずプロジェクト作成
普通に。Cocoa Applicationで。
■InterfaceBuilderで作業
MainMenu.xibをダブルクリックしてInterfaceBuilderを起動する。
サイズを取得するきっかけが欲しいので、ウインドウ上にボタンを1個配置する。
次はコントローラクラスの作成。Libraryの「Cocoa」→「Objects &Controllers」→「Object」を、MainMenu.xib(English)ウインドウにドラッグ&ドロップ。Identityインスペクタで、「Class」のところに「AppController(任意名)」と入力しておく。
同じくIdentityインスペクタで、「Class Actions」に「btnClick:(任意名)」を追加。「Class Outlets」に「mainWindow(任意名)」を追加。
ここで、AppControllerをファイル化しておく。MainMenu.xib(English)ウインドウでApp Controllerを選択した状態で、メニューバーの「File」→「Write Class Files...」をクリックして、作成したAppControllerをファイルとして保存しておく。
続いてアクションとアウトレットの関連付けをしておく。
ボタンからAppControllerに向かってcontrol+ドラッグ&ドロップ。「btnClick」を選択する。もう一つ、AppControllerから同じウインドウ内の「Window」に向かってcontrol+ドラッグ&ドロップ。「mainWindow」を選択する。
ここまでできたら、InterfaceBuilderを保存して終了しておく。
■次はXcode側の作業
まず忘れないうちに、保存したAppControllerの継承元クラスを書いておく。「AppController.h」の「@interface」の行に、「NSObject」を追記する。
【AppController.h】
#import <Cocoa/Cocoa.h>
@interface
AppController : NSObject {
IBOutlet id mainWindow;
}
- (IBAction)btnClick:(id)sender;
@end
次にボタンがクリックされたときのコーディング。
先程アウトレットにNSWindowのオブジェクトを関連付けた。なので、ソースの中では、「mainWindow」としてアクセスすることが可能だ。
NSWindowにはインスタンスメソッドのなかに「frame」というのがあって、こいつはNSRect型でウインドウのサイズと位置を返してくれる。NSRect型は構造体で、位置を表す構造体とサイズを表す構造体を持っている。
【AppController.m】
#import "AppController.h"
@implementation AppController
- (IBAction)btnClick:(id)sender {
NSRect rect = [mainWindow frame];
int x = rect.origin.x;
int y = rect.origin.y;
int w = rect.size.width;
int h = rect.size.height;
NSLog([NSString stringWithFormat:
@"x:%d,y:%d,h:%d,w:%d",x,y,h,w]);
}
@end
実際に実行してみる。ウインドウのサイズや位置を変えつつボタンをクリックすると、そのたびにx座標、y座標、高さ、幅をログに出力してくれた。
Macの画面の座標って、左下が(0,0)なんだな。初めて知った。しかも、得られるウインドウの位置情報って、ウインドウの左下隅の座標らしい。Windowsだと左上基準なんだけど。
















最近のコメント