首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GDI中控件绘图的单元测试

GDI中控件绘图的单元测试
EN

Stack Overflow用户
提问于 2011-01-28 06:49:05
回答 5查看 680关注 0票数 2

我有一个使用WinAPI在C++中编写的控件,我想自动测试它是否被正确绘制。我可以将绘制的图像与保存的参考图像进行比较,也可以简单地测试特定像素是否具有特定的颜色。我已经实现了这两种类型。

问题是,测试现在也是每晚在虚拟机上运行,由于某种原因,虚拟机只有16位颜色深度。这会导致颜色稍微变暗。我试着想出在16bit颜色深度下不会改变的颜色,但舍入方案似乎相当复杂,我需要测试在32b和16b颜色深度下都能起作用。

另一个想法是创建一个始终具有32b颜色深度的屏幕外位图。它的好处是测试每次都使用相同的环境,但我无法让它工作。如何创建32b HBITMAP和HDC而不考虑屏幕颜色深度?或者你有任何其他的技巧如何解决一般的问题吗?

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-11 20:46:08

如何创建32bHBITMAP和HDC而不考虑屏幕颜色深度?

这很简单:

代码语言:javascript
复制
BITMAPINFO bmp_info = {};
bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmp_info.bmiHeader.biWidth = width;
bmp_info.bmiHeader.biHeight = height;
bmp_info.bmiHeader.biPlanes = 1;
bmp_info.bmiHeader.biBitCount = 32;
bmp_info.bmiHeader.biCompression = BI_RGB;

HDC mem_dc = CreateCompatibleDC(0);
void *dummy;
HBITMAP bitmap_handle = CreateDIBSection(mem_dc, &bmp_info, DIB_RGB_COLORS, &dummy, NULL, 0);
SelectObject(mem_dc, bitmap_handle));

现在将您的按钮拖动到此DC上。记住检查错误并释放资源。

或者,自动将按钮引用视图转换为实际桌面模式:

代码语言:javascript
复制
HWND desktop = GetDesktopWindow();
HDC desktop_dc = GetDC(desktop);
HDC mem_dc = CreateCompatibleDC(desktop_dc); 
RECT rect;
GetClientRect(desktop, &rect);
HBITMAP bitmap_handle = CreateCompatibleBitmap(desktop_dc, rect.right - rect.left, rect.bottom - rect.top);
SelectObject(mem_dc, bitmap_handle);

现在通过mem_dc对预加载的镜像进行BitBlt。它将自动转换为当前桌面颜色模式

票数 1
EN

Stack Overflow用户

发布于 2011-01-28 07:07:12

我已经通过绘制到一个WMF (现在的EMF)文件中进行了GDI单元测试。它确实复制了源设备(以及后来的目标设备)的分辨率和DPI,但我不记得颜色深度是否是一个“粘性”属性。即使是这样,因为文件格式允许您捕获/重放GDI序列,所以您最终可能会有一个更准确的单元测试。我们将解释WMF文件,以确保我们生成了我们认为应该生成的内容。

CreateEnhMetaFile是一个起点。

票数 1
EN

Stack Overflow用户

发布于 2011-02-12 05:02:36

使用GDI+创建屏幕外的位图,然后使用GDI绘制它-类似于:

代码语言:javascript
复制
int width=64; // or whatever you need
int height=100;
int stride = width*4;
BYTE buffer[stride*height];
Gdiplus::Bitmap bitmap(width, height, stride, PixelFormat32bppARGB, buffer);
Gdiplus::Graphics g (&bitmap);
HDC dc = g.GetHDC();

// drawing code, using WinAPI, to draw to dc

g.ReleaseHDC();

// Now compare the contents of your buffer

有关gdi / gdi+互操作的更多信息,请访问:http://support.microsoft.com/kb/311221

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4822870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档