STed2いじり(8) Direct2D化

公開:2010-10-25 18:51
更新:2020-02-15 04:36
カテゴリ:sted2,c++,windows,audio

とりあえず自作のWindowsラッパクラスとの融合作業は完了した。
WindowsラッパクラスはDirect2DでUIを作るためにWTLの仕組みをすこし拝借して作成したものである。なのでDirect2D周りの初期化コードもふくんでいる。とりあえずそのあたりが動くかどうか確かめてみた画面が下記の画面。従来の描画の上にDirect2Dで水色の文字を描いてみた。

今回はDC描画とDirect2D描画を混在させるため、ID2D1HwndRenderTargetではなくID2D1DCRenderTargetを使用して描いてみた。

とりあえず動くことがわかったので今後はDC描画をDirect2Dに移していくことにする。

元ソースではX68000の画面をエミュレートするためにオフスクリーンビットマップを何枚か持っていて、それをまた別のオフスクリーンビットマップにBitBltし、さらにスクリーンにBitBltしている。これをどうDirect2Dに持っていくかを考えている。少なくともオフスクリーンビットマップのうち、スクリーンにBitBltする手前のはいらなそうだ。Windows7ではすでにOS側でバックバッファを持っているからね。

以下WM_PAINTメッセージのソースコード。ブラシなどのリソースは本来初期化メソッドでつくるべきだと思うがとりあえずべた書き。


case WM_PAINT:
{
//RECT rc;
//if (::GetUpdateRect(hwnd_, &rc, FALSE))
//{
{
// 描画開始
sf::paint_struct ps(hwnd_);
RECT rc;
// クライアント領域を求める
GetClientRect(
hwnd_,
&rc
);
// DC描画
Paint(&rc,ps->hdc);
// Direct2DレンダーターゲットにHDCをバインド
EXCEPTION_ON_ERROR(render_target_->BindDC(
ps->hdc
,
&rc
));
//sf::begin_draw<ID2D1HwndRenderTargetPtr> d(render_target_);
//                  render_target_->BeginDraw();
// Direct2D描画開始。オブジェクトの破棄と同時に描画終了
sf::begin_draw<ID2D1DCRenderTargetPtr> d(render_target_);
ID2D1SolidColorBrushPtr brushr;
render_target_->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Aqua), &brushr);
D2D1_RECT_F layoutRect = D2D1::RectF(rc.left, rc.top, rc.right,rc.bottom);
IDWriteTextFormatPtr write_text_format;
// Text Formatの作成
EXCEPTION_ON_ERROR(write_factory_->CreateTextFormat(
L"メイリオ",                // Font family name.
NULL,                       // Font collection (NULL sets it to use the system font collection).
DWRITE_FONT_WEIGHT_BOLD,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
48.0f,
L"ja-jp",
&write_text_format
));
// テキストの描画
std::wstring t = L"とりあえずDirect2DとDC描画を混在させてみました。";
render_target_->DrawTextW(
t.c_str(),
t.size(),
write_text_format,
layoutRect,
brushr);
} // スコープが外れるとともに描画終了。
//}
}
return 0L;
break;