Macintosh Developer Online (MDOnline)


2001年9月12日発行号 - Cocoaで任意形状のウインドウ



鶴薗さんの連載の今月分は4つの記事に分かれています。今日と明日の2回に分けてお届けすることにしますが、サイトには全文がすでに掲載されています。また、鶴薗さん御自身が作られたPDFファイルも公開することにします。以下のアドレスで、特に認証などはかかっていませんけども、MDOnlineの読者の方だけ御利用できるものとします。このPDFは元原稿なのですが、テキストのみのメール向けに文字の調整をしているだけなので、内容的にはほぼ同じです。PDFの方が見やすいでしょうから、こちらも公開します。
 http://mdonline.jp/figs/01/0026/MDOnline%202001.09.pdf

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥Information
WebObjects 4.5.1へのアップデート受付は、2001年9月いっぱい
 
Macintoshと対象周辺機器の購入で1万円キャッシュバック。複数台ならさらに加算
 デジタルライフキャンペーン
WebObjectsの日本語マニュアルが公開されはじめています
 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

米国の惨事はあまりに衝撃的です。テレビで見ている限りは、こうも簡単にあの高層ビルが倒壊するのかと思ったりもしますが、旅客機もかなりのサイズでもあり、燃料が炎上しての爆発などが発生したのかもしれません。民間機をハイジャックして自爆テロをするなど、フィクションとしても思いも付かないような手口だったのも驚きです。米国は軍事大国だけに、システムが古いとかなんとか言っても、たとえば外国の戦闘機が領空侵犯したような場合には迅速には対処できたでしょう。だけど、さすがにハイジャックされた航空機まではそうした監視対象に入らないというか、入ったところですでに国土の中にあるわけで、対処ができなかったのかもしれません。事件の詳細はまだ分からないことが多いのですが、こうした大きな事件は何かしら教訓を残すものですし、また今後につなげないと払われた犠牲を無駄にすることにもなります。政治的なことなどいろいろありますが、戦争よりテロが頻発するとなると、都市に機能が集中しているということがすでに危ないということなのかもしれません。身近な意味では、「安全」や「危険」の概念を再度考え直さないといけないということもあるかと思います。いずれにしても犯罪者集団が早期に捕ることを願う次第です。
(新居雅行 msyk@mdonline.jp


鶴薗賢吾のCocoaはやっぱり!出張版》#3-ウィンドウの形状変更と透明化(1)

■ 今回のテーマ
今回は、前回に引き続いて、Appleから配付されているサンプルコードの解説です。
RoundTransparentWindowというサンプルで、これは、ウィンドウを特殊な形状にしたり、半透明にしたりするものです。このサンプルコードを読む上で、ポイントになるところをピックアップして解説していきます。まずは、以下のURLからダウンロードして解凍しておいてください。

◇RoundTransparentWindow
 http://developer.apple.com/samplecode/Sample_Code/Cocoa/RoundTransparentWindow.htm

■ このサンプルから学べること
このサンプルを読むことで何が学べるのか、まず、そのポイントを列挙してみました。


Mac OS Xには、Clockアプリケーションという時計のアプリケーションが添付されています。このアプリケーションは、通常のウィンドウとは異なり、丸い形をしています。また、環境設定を開くと分かりますが、ウィンドウ全体の透明度を変えることが出来て、背景が透けて見えるように出来ます。

 

また、このウィンドウにはウィンドウの上部にタイトルバーがありません。そのため、ウィンドウをドラッグして移動する処理は、自分で処理をしているのです。さらに、一般にウィンドウはメニューバーの上にかぶさることは出来ませんが、Clockアプリケーションはメニューバーの上にまでドラッグできます。このサンプルアプリケーションは、これらの実現方法が全て分かるようになっています。

■ アプリケーション概要
さて、このサンプルのアプリケーションがどんな機能を持っているのか、まずは実際に動かして確かめてみましょう。ダウンロードしたファイルの中には、ビルドされたアプリケーションが入っているので、ダブルクリックするだけで、すぐに動かすことが出来ます。

 

起動すると、上図のようにスライダーを1つ持っている丸いウィンドウが表示されます。このスライダーを動かすと、右のように全体の透明度が増していき、また、途中でウィンドウの形状が五角形に変わります。スライダーを戻すと、ウィンドウも最初の状態に戻ります。

 

また、このウィンドウにはタイトルバーがありませんが、ウィンドウ本体をつかんで移動が出来ます。そして、メニューバーの上にも移動させることが出来ます。

■ プロジェクトのファイル構成
では、プロジェクトを構成しているファイルを見ていきます。まず、Project Builderでプロジェクトファイル ( RoundTransparentWindow.pbproj ) を開きます。

 

Classesのところに、「 Controller.h 」と「 Controller.m 」がありますが、これはスライダーを動かした時の動作を受け持つControllerという名前のクラスの定義をしています ( NSObjectのサブクラス )。「 CustomWindow.h 」と「 CustomWindow.m 」は、このウィンドウを実現するためのCustomWindowという名前のクラスを定義しているものです ( NSWindowのサブクラス )。「 CustomView.h 」と「 CustomView.m 」では、ウィンドウの中に円や五角形を描画するためのCustomViewクラスを定義しています ( NSViewのサブクラス )。

Resourcesのところには、「 circle.tif 」と「 pentagram.tif 」という2つの画像がありますが、これがウィンドウの中に表示されるものです。名前のとおりですが、前者が円形で後者が五角形の画像です。どちらの画像も、図形の外側が透明になっているところがポイントです。「 MainMenu.nib 」には、ユーザーインターフェイス等の定義がなされています。


■ MainMenu.nibの構成
次に、MainMenu.nibをダブルクリックして、Interface Builderでその中身を見てみましょう。

 

MainMenu.nibのウィンドウを見ると、先程出てきたControllerクラスのインスタンスがあります。これを作るには、NSObjectのサブクラスを作ってインスタンス化します。このControllerには、スライダー ( NSSlider ) からchangeTransparency : というメッセージが送られます…1。このメッセージを受けると、ウィンドウの透明度を変えます。そのためにウィンドウを参照するアウトレットのitsWindowを持っています…2。

このサンプルではウィンドウの振る舞いを変えるので、NSWindowのサブクラスとしてCustomWindowというクラスを作っておきます。そうするとウィンドウのインスタンスをInfoウィンドウでCustomWindowクラスに切り替えることが出来るのです…3。

そして、ウィンドウ内に描画を行うための独自のビューであるCustomViewをウィンドウ全体を覆うように配置しています。これも、予めCustomViewクラスをNSViewのサブクラスとして予め作っておいて、InfoウィンドウでCustomViewクラスに切り替えます…4。

■ 形状変更の仕組み
ウィンドウ上の各ピクセルは、描画を行うことで色を変えることが出来ますが、色だけでなく透明度も変えることが出来ます。透明色を指定したピクセルは、後ろに隠れているウィンドウやデスクトップが透けて見えるようになります。丸いウィンドウにしたい場合は、正方形のウィンドウを用意しておいて、丸の内側を不透明の色で塗り、丸の外側を透明色で塗ってしまえばよいわけです。このように、ウィンドウ自体は四角形なのですが、透明色で塗ることによってウィンドウの形状を変えることが出来るわけです。さらに、完全に透明になっているピクセルはクリックできなくなるため、背後にあるものをクリックすることになります。つまり、クリックされた時に、そこが透明になっているかどうかをアプリケーションが判断してイベント処理を分ける必要はありません。

[鶴薗賢吾]

関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版


鶴薗賢吾のCocoaはやっぱり!出張版》#3-ウィンドウの形状変更と透明化(2)

■ 形状変更の手順
仕組みは分かりましたが、それを実際にコード上でどう書くのかを見ていきます。ウィンドウを変形するには、以下の2段階の処理を行うことになります。

 1. ウィンドウ全体を完全に透明にする
 2. 不透明にしたい個所を描画する

まず、ウィンドウ上の全てのピクセルを完全に透明にしておいて、その後から描画をすることで、描画したところのみがウィンドウとして見えてくることになります。

■ ウィンドウ全体の透明化手順
ウィンドウ全体を透明化する方法を、さらに詳しくみていきましょう。以下の3段階の処理を行います。

 1. ウィンドウの背景色を透明色にすること
 2. ウィンドウの不透明フラグをNOにすること
 3. ウィンドウのスタイルマスクをNSBorderlessWindowMaskにすること

1.の「 ウィンドウの背景色を透明色にする 」は、以下の1行で行えます。NSWindowのインスタンスに対して、setBackgroundColor : を送って透明色である clearColor を指定します。下のコードの
「 window 」は存在しているNSWindowのインスタンスです。


[ window setBackgroundColor : [ NSColor clearColor ] ];

 ★ NSWindow : 背景色を指定する
  [書式] - (void) setBackgroundColor : (NSColor *) color
  [入力] color : 背景色

2.の「 ウィンドウの不透明フラグをNOにする 」は、以下の1行で行えます。setOpaque : にNOをセットします。

[ window setOpaque : NO ];

3.のウィンドウのスタイルマスクというのは、ウィンドウの大まかな形状を決めるもので、以下の値を足し合わせて指定します。完全に透明にするときには、NSBorderlessWindowMaskを使用します。

ウィンドウの形状指定
enum {
NSBorderlessWindowMask = 0, // 枠が無い
NSTitledWindowMask = 1, // タイトル部分を持つ
NSClosableWindowMask = 2, // クローズボックスを持つ
NSMiniaturizableWindowMask = 4, // 最小化ボタンを持つ
NSResizableWindowMask = 8 // リサイズボックスを持つ
};

このスタイルマスクは、ウィンドウを表示した後から変更することはできません。ウィンドウの初期化段階で指定したものに固定されるためです。初期化の段階でスタイルマスクを指定するためには、NSWindowのサブクラスを作成して、初期化メソッドをオーバーライドすることになります。NSWindowのサブクラスを作っているのはこのためです。

CustomWindowクラスのソースを書き出したら、Project Builderで初期化メソッドを以下のように書き換えます。初期化メソッドの名前は、長いですが、「 initWithContentRect : styleMask : backing : defer : 」といいます。

- (id) initWithContentRect : (NSRect ) contentRect
styleMask : (unsigned int ) aStyle
backing : (NSBackingStoreType) bufferingType
defer : (BOOL ) flag
{

NSWindow* win = [ super initWithContentRect : contentRect
styleMask : NSBorderlessWindowMask
backing : NSBackingStoreBuffered
defer : NO ];

return win;
}

ウィンドウ初期化時には、このメソッドが呼ばれます。MainMenu.nibの中のウィンドウをCustomWindowクラスにしたので、このメソッドが呼ばれるようになります。この中で、スーパークラス、つまりNSWindowの同じ初期化メソッドを呼んでいますが、ここでstyleMaskの箇所のパラメーターをNSBorderlessWindowMaskにすりかえているわけです。これで、スタイルマスクを変えることが出来ます。

このコードに、最初の2段階の処理もこの中に入れてしまいましょう。これで透明ウィンドウを作る初期化メソッドの出来上がりです。

- (id) initWithContentRect : (NSRect ) contentRect
styleMask : (unsigned int ) aStyle
backing : (NSBackingStoreType) bufferingType
defer : (BOOL ) flag
{

NSWindow* win = [ super initWithContentRect : contentRect
styleMask : NSBorderlessWindowMask
backing : NSBackingStoreBuffered
defer : NO ];

[ win setBackgroundColor : [ NSColor clearColor ] ];
[ win setOpaque : NO ];

return win;
}

これと、サンプルコードのCustomWindow.mのソースを比較してみてください。いくつか追加の処理は書かれていますが、ほぼ同様のことが書かれているはずです。個人的には、これだけのためにサブクラスを作るのはちょっと面倒な気もしますので、Interface Builder上でスタイルマスクの指定が出来るようになったらいいのになぁと思います。

[鶴薗賢吾]

関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版


WORLD PC EXPO 2001でMac OS X 10.1をアップルのブースで使ってみることができる

2001年9月19〜22日に幕張メッセで開催されるWORLD PC EXPO 2001で、Mac OS Xの次期バージョン「Mac OS X 10.1」を、会場内のアップルコンピュータのブースで「試せる」ことが、日経BP社のPC-Gazのコーナーで明らかにされた。このときまでにMac OS X 10.1がリリースされていないとすれば、日本で最初に一般ユーザがMac OS X 10.1を使うことができる場になると思われる。なお、PC EXPOのサイトでのアップルコンピュータの展示内容では、Mac OS X 10.1が展示されるかどうかは明確には記載されていない。
ところで、PC EXPO開催まで1週間と迫っているが、現段階ではMac OS X 10.1の発売に関してのアナウンスは一切ないため、PC EXPOでの販売(Public Betaの再来?)はほぼないと言ってよいものと思われる。

関連リンク:[パソコン編]パソコンで注目はなんといってもWindows XP搭載機だ!
カテゴリ:Mac OS X, イベント


UMLモデリングツールのObjectDomain R3はMac OS X対応

Object Domain Systemsは、UMLモデリングツールの「ObjectDomain R3」を近々リリースする。Java2ベースで稼動するアプリケーションで各種のプラットフォームで稼動するが、MacintoshではMac OS Xが対応OSとなる。9種類のUMLダイアグラムをサポートし、Java、C++、IDL、Pythonのソースを生成できる。Java2サポートは、R3の新機能となっている。Shared Packageという独自のメカニズムでサーバを使わなくてもマルチユーザの利用を実現している。ラウンドトリップはJavaではすでに実現しているが、C++でも可能となった。スタンダード版が$495、プロフェッショナル版が$995からとなっている。

関連リンク:Object Domain Systems
カテゴリ:開発ツール


ソフトウエアのユーザーインタフェースの評価を無償で行うサイト

ソフトウエアのユーザビリティをフリーで評価してくれるというサイト「Interface Mafia」が登場した。申し込みを行えば、そのソフトの使い勝手について、ユーザインタフェースデザインについて、場合によってはドキュメントなども含めて評価をし、サイトに評価結果を掲載する。サイト運営グループのボランティアによって評価が行われる。現在は、Mac OS Xを含むMac OS向けソフトウエアのみとなっているが、将来的にはプラットフォームを広げる予定だ。すでにいくつかレビューや論文が掲載されているが、ダイアログボックスのデザインの修正案などが図で示されるなど意欲的なものとなっている。レビューには読者からのコメントをつけることもできるようになっており、さらに意見を広く求めることができる。このグループはソフトウエアのユーザビリティを向上させることを目的としてサイトを運営しているとのことだ。

関連リンク:Interface Mafia
カテゴリ:ユーザインタフェース, サービス


PHPからファイルメーカーProのデータベースにアクセスできるクラスライブラリ

WebサーバのスクリプトシステムPHPから、ファイルメーカーProのデータベースにアクセスを可能にするライブラリ「FX.php」が公開された。Chris Hansen氏とChris Adams氏によるフリーウエアである。ファイルメーカーProのWebコンパニオンを利用すれば、データベースの内容をXML形式で取りだせる。この方法を利用してPHPのプログラムからファイルメーカーProへのデータベースアクセスを実現している。PHPでの他のデータベースサポートのような関数拡張ではなく、PHPのクラスライブラリ、つまりPHPのプログラムとして記述されたテキストファイルとしてFX.phpは提供されているので、基本的には機種に依存するバイナリではない。

関連リンク:Viking.org
カテゴリ:データベース