20110922 追記:案の定間違えていました。ソースコード修正しています
以前の記事でOSXとWindowsXP(もしくはDirect2Dが使えない環境)ではフォームのCanvasへの直接描画がOnPaint()以外ではできないと書きましたが、OSXについては無理やり描画することができました。
(FireMonkey HDアプリ。FireMonkey 3Dアプリでは試してませんが、コードを見る限り3Dアプリでは小細工なしに描画できそう)
ただ、副作用なども含めあまり自身が無いので詳しい方の意見が聞きたいのでソースを下記に書きます。
{$ifdef MACOS}
var
win : NSWindow;
view : NSView;
{$endif}
begin
{$ifdef MACOS}
win := TNSWindow.Wrap((FmxHandleToObjC(Handle) as ILocalObject).GetObjectID);
view := TNSView.Wrap(win.contentView);
ContextHandle := THandle(win.graphicsContext.graphicsPort);
{$endif}
with Canvas do
begin
BeginScene;
// painting //
EndScene;
end;
{$ifdef MACOS}
view.displayIfNeeded;
{$endif}
end;
やってるのは、Canvasへの描画の前に、フォームのContextHandleに無理やりCGContextRef を割り当て、
描画が終わったらviewに対して displayIfNeededを送っているだけです。
特にContextHandleに無理やり代入しているあたりが自信無し。
20110922 追記:元のソースではNSGraphicsContextのcurrentContextでGCを得ていましたが、懸念通り複数のフォームがある場合に正しく動作しませんでした。もっと単純にNSWindowのGCを得る方法に修正しています
最近のコメント