S60用スクリーンキャプチャツール「GetPixels」の開発 (2) (2005-11-27)
現在作成中のスクリーンキャプチャツールですが、開発は遅々として進んでいません。スクリーンキャプチャに必要な機能自体はすでに実装が済んでいるのですが、S60用のGUIの実装に時間がかかっています。ちなみに、アプリケーションの名前は「GetPixels」と命名しました(いかにもプログラマ的なセンスだ……)。
それはさておき、「GetPixels」開発において得たノウハウなどを、この場で書いていこうと思います。
スクリーン表示内容の取得
スクリーンキャプチャツールを作成するにあたり、まず何といっても「現在のスクリーンの表示内容を取得する」ことができないと話になりません。それを実現するためには、「スクリーンデバイス」の機能を使うことで、スクリーンの表示内容にアクセスすることができます。
CWsScreenDevice* device = CCoeEnv::Static()->ScreenDevice();
CWsScreenDeviceクラスには、「GetPixel」とか「GetScanLine」といったAPIが用意されているので、これらを使えば簡単にスクリーンの表示内容を取得できます。その後の料理はお好きなように。
スクリーンキャプチャツール内の実際の実装では、まさにスクリーンキャプチャのために用意されているかのような「CopyScreenToBitmap」というAPIを使っています。ビットマップオブジェクトを引数にして、指定されたビットマップにスクリーンの内容をコピーするというAPIです。使用例は以下のとおり。
CFbsBitmap* bitmap = new(ELeave) CFbsBitmap; CleanupStack::PushL(bitmap); User::LeaveIfError(bitmap->Create(device->SizeInPixels(), device->DisplayMode())); device->CopyScreenToBitmap(bitmap); // (bitmapを使って各種処理を行う) CleanupStack::PopAndDestroy(bitmap);
ちなみに、このCopyScreenToBitmapというAPIですが、実行すると指定したビットマップの内容が変化するにもかかわらず、引数の型は「const CFbsBitmap*」とconst修飾されているので注意してください。CFbsBitmapクラス内には実データが含まれていない(実データへの「ポインタ」のみ含まれている)ので、こういう定義でも間違いではないのでしょうが、まぎらわしいものです。
なお、上記のスクリーンデバイス関連の記述は、S60とかUIQといったユーザーインターフェースに関係なく、Synbian OS全般で共通(のはず)です。