0

我有一个 23x23 位图,我将其从文件加载到 IPictureDispCOM 接口的实例中。我正在使用OleLoadPicture,通过加载图片IID_IPictureDisp。请假设这正在工作并向我返回一个指向 an 的有效指针IPictureDisp,我可以从中IDispatch毫无问题地获得一个指针。

我还可以用来IDispatch::Invoke获取图片的HeightWidth成员的值,正如预期的那样,它们返回为 23 和 23。

问题是由于某种原因使用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)

哪里rc是一个RECT看起来像这样的结构: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);

调用返回时 的值为hresult0 ( 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我的建议是您使用and获得等量宽度/高度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 回答