0

IPictureDispファイルからCOM インターフェイスのインスタンスにロードする 23x23 ビットマップがあり ます。OleLoadPictureを使用して画像を読み込んでいIID_IPictureDispます。これが機能していて、 への有効なポインターを返していると仮定してください。そこから問題なくポインターIPictureDispを取得できます。IDispatch

期待どおり、23 と 23 として返される画像のとメンバーIDispatch::Invokeの値を取得するために使用することもできます。HeightWidth

問題は、何らかの理由IDispatch::Invokeでメソッドを呼び出すために使用するRenderと、期待する画像ではなく 23x23 のモノクロの正方形が描画されることです。さらに、モノクロの正方形の色は、ビットマップの左下のピクセルの色に対応しています (ビットマップの 0 番目のピクセルであると想定しています)。

レンダリングしようとしているビットマップは 23x23 で、最大 92x92 です

実際に DC に描画されるもの。 目的の画像の左下のピクセルの色に対応する 23x23 の画像であることに注意してください。

上の画像は私が使用しているビットマップです (通常のサイズで、色が見えるように 4 倍に拡大されています)。下の画像が実際にレンダリングしたものです。

問題は、私が を呼び出す方法に関係している可能性が高いと思いますIDispatch::Invoke

私がやりたいことは(疑似コード)です:

pic.Render(hdc, x, y, w, h, 0, h-1, w, -h, &rc)

wherercRECT次のような構造です: left => x ; top => y ; right => x + w ; bottom => y + h.

最終的に呼び出される C コードは、次と同等です。

// NOTE: x = 0, y = 0, w = 23, h = 23, and -h => 0xffffffe9 in a 32-bit int
DISPPARAMS args = { NULL, NULL, 0, 0 };
args.cArgs = 10;
args.rgvarg = (VARIANT *)alloca(10 * sizeof(VARIANT));
int values[10] = { (int)hdc, x, y, w, h, 0, h-1, w, -h, (int)&rc };
for (int k = 0; k < 10; ++k)
{
    V_VT(args.rgvarg[10-k-1]) = VT_I4;
    V_I4(args.rgvarg[10-k-1]) = values[k];
}

VARIANT result;
VariantInit(&result);

// assume dispid is the correct DISPID for the "Render" method
HRESULT hresult = idisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &args, &result, NULL, NULL);

呼び出しが戻るときの値hresultは 0 ( S_OK) ですが、レンダリングされた画像は、画像の左下隅の色のみを使用して、私が示したモノクロ画像です。

どのように悪用していIDispatch::Invokeますか?

4

2 に答える 2

1

よし、今思い出した。のパラメータRenderは紛らわしいです。ソース値は、ピクセル単位ではなく、himetric 値です。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms693441%28v=vs.85%29.aspx

基本的に、画像全体ではなく、いくつかのピクセルのみをソースとして使用しています。

get_Width私の提案は、 と を使用して高さの幅/高さを取得することですget_Height。またはAtlPixelToHiMetricそれらを変換するために使用します:

http://msdn.microsoft.com/en-CA/library/8ca5swet%28v=vs.90%29.aspx

于 2013-09-16T04:59:45.197 に答える
0

画像を正しく読み込んでいるとは限りません。それを調べて見てください。実際には画像の読み込みコードであったのに、レンダリング コードであると想定したこのような問題がありました。ソース データが完全な品質であることを確認し、読み込まれたデータを調べる方法を見つけてください。あなたが見つけたものに驚くかもしれないと思います。

于 2013-09-16T03:54:59.450 に答える