gpt4 book ai didi

c - 如何使用IPictureDisp::Invoke正确调用Render成员

转载 作者:行者123 更新时间:2023-11-30 15:45:47 24 4
gpt4 key购买 nike

我有一个 23x23 位图,我正在将其从文件加载到 IPictureDisp COM 接口(interface)的实例中。我正在使用 OleLoadPicture 加载图片,并传递 IID_IPictureDisp。请假设它正在工作,并返回一个指向 IPictureDisp 的有效指针,从中我可以毫无问题地获取 IDispatch 指针。

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

问题是由于某种原因,使用 IDispatch::Invoke 调用 Render 方法绘制了 23x23 单色正方形,而不是我期望的图片。此外,单色方 block 的颜色对应于位图左下角像素的颜色(我假设是位图的第零个像素)。

The bitmap I'm trying to render, at 23x23 and blown up to 92x92

What actually paints to the DC. Note that it is a 23x23 image corresponding to the colour of the bottom left pixel of the desired picture

上面的图像是我正在使用的位图(正常大小,放大到其大小的 4 倍,以便您可以看到颜色)。下图是实际渲染的图像。

我认为问题可能与我调用 IDispatch::Invoke 的方式有关。

我想做的是(伪代码):

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

其中 rc 是一个 RECT 结构,如下所示: left => x ;顶部 => y ;右 => x + w ;底部 => 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

最佳答案

好吧,我现在想起来了。 Render 的参数令人困惑。源值以高度值表示,而不是像素。

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

本质上,它只使用几个像素作为源,而不是整个图像。

我的建议是您使用 get_Widthget_Height 获取高度宽度/高度。或者使用 AtlPixelToHiMetric 来转换它们:

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

关于c - 如何使用IPictureDisp::Invoke正确调用Render成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18820068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com