1

GDI+ はかなり (ばかばかしいほど) 遅いので、Direct2D に移行することにしました。私は多くのフォーラム (これを含む) で多くのトピックを調べましたが、成功しませんでした (かなり遅いという事実が原因である可能性もあります)。 .

とにかく、私は Direct2D で開く .PNG を持っており、その一部だけを 20ms ごとに描画したいと考えています。

D2D のものを初期化する

ID2D1Factory* d2dFactory = NULL;
IWICImagingFactory* d2dWICFactory = NULL;
IWICBitmapDecoder* d2dDecoder = NULL;
IWICFormatConverter* d2dConverter = NULL;
ID2D1HwndRenderTarget* d2drender = NULL;
IWICBitmapFrameDecode* d2dBmpSrc = NULL;
ID2D1Bitmap* d2dBmp = NULL;

/* initialize all the good stuff */
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,
               __uuidof(ID2D1Factory), NULL, (void**)&d2dFactory);    

D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);

hr = d2dFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),
               D2D1::HwndRenderTargetProperties(zgE->getWnd(), size), &d2drender);

hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, 
                   __uuidof(IWICImagingFactory), (void**)(&d2dWICFactory));

hr = d2dWICFactory->CreateDecoderFromFilename(L"tile_1.png", NULL, GENERIC_READ,
                                      WICDecodeMetadataCacheOnLoad, &d2dDecoder);

hr = d2dWICFactory->CreateFormatConverter(&d2dConverter);

hr = d2dDecoder->GetFrame(0, &d2dBmpSrc);

hr = d2dConverter->Initialize(d2dBmpSrc, GUID_WICPixelFormat32bppPBGRA,
              WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeMedianCut);

hr = d2drender->CreateBitmapFromWicBitmap(d2dConverter, NULL, &d2dBmp);

描く:

/* draw the image */
D2D1_RECT_F rect = D2D1::RectF(x, y, x + size.width, y + size.height);
d2drender->DrawBitmap(d2dBmp, &rect);

ただし、その一部だけを描画することはできません。20 x 20 ピクセルとしましょう。私はDrawBitmap()さまざまなサイズrectの s をいじりましたが、結果は画像をトリミングしていません。

各フレームで画像をレイヤー化したくないので、レイヤー化以外にそれを行う方法はありますか?

4

2 に答える 2

3

ID2D1RenderTarget::DrawBitmap( http://msdn.microsoft.com/en-us/library/windows/desktop/dd371880(v=vs.85).aspx ) は最大 5 つのパラメーターを取り、最後のパラメーターはソースの四角形です。最初の 2 つのパラメーターのみを指定しており、ソースの四角形の既定値はビットマップ全体を使用することです。D2D1::RectF(0, 0, 20, 20)そのため、その部分からのみ描画したい場合は、このパラメーターに を指定するだけで解決できます。

于 2013-08-26T20:33:17.857 に答える