我有一个使用WinAPI在C++中编写的控件,我想自动测试它是否被正确绘制。我可以将绘制的图像与保存的参考图像进行比较,也可以简单地测试特定像素是否具有特定的颜色。我已经实现了这两种类型。
问题是,测试现在也是每晚在虚拟机上运行,由于某种原因,虚拟机只有16位颜色深度。这会导致颜色稍微变暗。我试着想出在16bit颜色深度下不会改变的颜色,但舍入方案似乎相当复杂,我需要测试在32b和16b颜色深度下都能起作用。
另一个想法是创建一个始终具有32b颜色深度的屏幕外位图。它的好处是测试每次都使用相同的环境,但我无法让它工作。如何创建32b HBITMAP和HDC而不考虑屏幕颜色深度?或者你有任何其他的技巧如何解决一般的问题吗?
谢谢
发布于 2011-02-11 20:46:08
如何创建32bHBITMAP和HDC而不考虑屏幕颜色深度?
这很简单:
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上。记住检查错误并释放资源。
或者,自动将按钮引用视图转换为实际桌面模式:
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。它将自动转换为当前桌面颜色模式
发布于 2011-01-28 07:07:12
我已经通过绘制到一个WMF (现在的EMF)文件中进行了GDI单元测试。它确实复制了源设备(以及后来的目标设备)的分辨率和DPI,但我不记得颜色深度是否是一个“粘性”属性。即使是这样,因为文件格式允许您捕获/重放GDI序列,所以您最终可能会有一个更准确的单元测试。我们将解释WMF文件,以确保我们生成了我们认为应该生成的内容。
CreateEnhMetaFile是一个起点。
发布于 2011-02-12 05:02:36
使用GDI+创建屏幕外的位图,然后使用GDI绘制它-类似于:
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
https://stackoverflow.com/questions/4822870
复制相似问题