一旦GWorldに描画して(実際の画面にはあらわれない)、それを実際の画面に転送する事によって、書き込んでいる途中を画面に表示しなくて済むため、ちらつきがほとんどなくなります。
GWorldPtr world, oldWorld; GDHandle oldGDHandle; GetGWorld( &oldWorld, &oldGDHandle ); NewGWorld( &world, 0, &FrontWindow() -> portRect, NULL, NULL, NULL ); SetGWorld( world, NULL ); LockPixels( world -> portPixMap ); //ここに描画処理を書く。 UnlockPixels( world -> portPixMap ); CopyBits( *(BitMapHandle)world->portPixMap, &FrontWindow() -> portBits, &FrontWindow() -> portRect, &FrontWindow() -> portRect, srcCopy, FrontWindow()->visRgn ); SetGWorld( oldWorld, oldGDHandle ); DisposeGWorld( world ); //GWorldのメモリの開放 このサンプルでは、一番前のウインドウの大きさのGWorldを作り、GWorldに描画し(画面には表示されない)、ウインドウにGWorldを内容を転送します(ここで画面に見えるようになる)。GetGWorldとSetGWorldをしないとうまくいかない言う話を小耳に挟んだので取りあえずそれもしてあります。また、CopyBitsの最後の引数をFrontWindow()->visRgnにすることによって、見える部分にのみ転送するようにしてあります。 このGWorldというものは結構難しいので、全ての内容を理解する必要はありません。ただ、こうすればこう動くということだけ分かっていれば使いこなせるし、それでほとんど問題はありません。(使い方が限定されるけど。) 関数の説明 新しくGWorldを用意する pascal QDErr NewGWorld( GWorldPtr *offscreenGWorld, short PixelDepth, const Rect boundsRect, CTabHandle cTable, QDHandle aGDevice, GWorldFlags flags ); 返り値 エラー値 引数 offscreenGWorld 作成したGWorldへのポインタ PixelDepth 1ドットあたりのビット数。 0を指定すると一番色数の多い画面の色深度 boundsRect GWorldの大きさ。(PixelDepthが0だと無視される) cTable カラーテーブル(通常使用では0を指定し、規定値を使う) aGDevice 描画環境で使用するデバイス(通常使用では0を指定) flags フラグ(通常使用では0を指定) 指定したGWorldやデバイスをカレントにする pascal void SetGWorld( CGrafPort port, GDHandle *gdh ); 引数 port 設定するGWorldへのポインタ gdh 設定するデバイスへのハンドル。(portがGWorldではない時のみ) 描画前後の処理 LockPixels( PixMapHandle pm ); UnlockPixels( PixMapHandle pm ); 引数 pm 処理対象となるPixMapへのハンドル ビットマップの転送(転送モードを指定) pascal void CopyBits( const BitMap *srcBits, const BitMap *dstBits, const Rect *srcRect, const Rect *dstRect,short mode, RgnHandle maskRgn ); 引数 srcBits 転送元のビットマップ(BitMapないしPixMap) dstBits 転送先のビットマップ(BitMapないしPixMap) srcRect 転送元の領域をRectで指定。 dstRect 転送先の領域をRectで指定。 mode 転送モード maskRgn マスク用のRegionで、Region内だけが転送される。 マスクをしない時は0を指定。 実は、CopyBitsのmaskRgnはシューティングゲームなどで多用されていますが、その説明はまたの機会に。 |