前へ Xcc>クォーツの世界 次へ
Add Action で MyView に setDrawCommand アクションを追加し、 DoIt メニューと MyView をコネクトする。

[sender tag]で取り出されるのは、この値か?

setDrawCommand

 Quartz2DBasicsでは setDrawCommand はどうなっているのか、 MyView.m をのぞいてみると

DrawingCommand newCommand = [ sender tag ];
は、呼び出されるきっかけになったメニューを識別するタグを取り出しているみたい。 DrawingCommand が何かを調べるために、文字列を選択してコンテキストメニューから定義へジャンプとやってみると、独自に定義したenumだってことがわかる。前回の項目と同じかどうかを比較するために保存するみたいで timeshock には必要なさそう。
[self setNeedsDisplay:YES];
こいつが重要で自分自身に再描画を要求している。
currentMenuItem = sender;
呼び出し先をメニューオブジェクトに変換して
[currentMenuItem setState:***];
でメニューのチェックをON/Offしてるようですな。ここらへんは無視していいでしょう。

ということで、 timeshock では setNeedsDisplay だけやっておけばよさそう。

で、再描画を依頼された時に呼び出されるのが...

定義へジャンプ

 変数の型なんかを調べたいときに、文字列を選択し右クリック(コントロールキー+クリック)すると出てくる。定義先のソースを表示。検索>定義へジャンプメニューと同じ。

timeshock にコピペして実行。

drawRect

 内部の描画は、すべてここでおこなうのが基本。Quartz2DBasicsでは
CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
によって描画先を取り出して
myDispatchDrawing(context, _drawingCommand);
は、タグと描画先を渡している。

myDispatchDrawing は AppDrawing.c に定義されていて、まったくの C ソースですな。

case kCommandAlphaRects;
drawAlphaRects(context);

っていう部分から、 time shock に必要なのは

static void drawAlphaRects(CGContextRef context)

ということがわかる。とりあえあず drawAlphaRects 以下で呼び出される必要な関数を timeshock 側の MyView.m にコピペ。実行すると左のような状態に。

 う〜ん、座標とか微妙に調整いるね〜。ウインドウの大きさ変えるとわかるけど、左下が原点のような...

timeshockプロジェクト

今日はここまで。

CG***

 drawAlphaRectsを読んでると、 CGRectMake とか CGContextTranslateCTM とか、やたら CG って前置詞が付く関数が出てるわけですが、これが Core Graphics (CG) のAPI みたいですな。