2011-01-27 39 views
2

我有一個使用WinAPI用C++編寫的控件,我想自動測試它是否正確繪製。我可以將繪製的圖像與保存的參考圖像進行比較,或者簡單地測試特定像素是否具有特定顏色。我已經實現了這兩種類型。在GDI中控制圖的單元測試

的問題是,現在的測試也由於某種原因只具有16位色彩深度的虛擬機上運行的每一個夜晚。這會導致顏色稍微偏離。我試圖想出在16位顏色深度下繪製時不會改變的顏色,但舍入方案似乎相當複雜,我需要測試在32b和16b顏色深度都能正常工作。

另一個想法是創建一個總是有32b顏色深度的離屏位圖。每次測試都會使用相同的環境會有好處,但我無法實現這一目標。無論屏幕顏色深度如何,我如何創建32b HBITMAP和HDC?或者你有任何其他提示如何解決一般問題?

謝謝

回答

1

無論屏幕顏色深度如何,我如何創建32b HBITMAP和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預裝載的圖像。它會自動轉換爲當前的桌面彩色模式

+0

我試過這段代碼,但似乎是從0(屏幕)創建mem_dc再次使它16b,所以它不起作用。 – 2011-02-11 16:51:12

+0

@Roman:我在我的32bpp顏色窗口上成功創建了mem_dc爲4bpp,8bpp和16bpp。你的意思是升級不起作用嗎?請重新檢查。這個問題也可能與代碼相關,比較你的結果和參考圖像 – 2011-02-11 17:50:55

1

我已經通過繪製到WMF(現在的EMF)文件中完成GDI單元測試。它確實複製了源(和更新目標)設備的分辨率和DPI,但我不記得顏色深度是否是「粘性」屬性。即使是這樣,由於fileformat允許您捕獲/重放GDI序列,因此無論如何您可能會有更準確的單元測試。我們會解釋WMF文件以確保我們生成了我們認爲我們應該做的。

CreateEnhMetaFile是一個起點。

0

可以創建一個32bpp的離屏表面就像你說的,或與您的對比基準圖像執行完全相同的操作來使您在同一BPP同時測試。換句話說,不要做你自己的四捨五入;讓GDI系統對兩個表面進行相同的舍入。

1

怎麼樣使用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

0

更改您的測試通過,如果對32位圖像或反對的16位圖像比較正常。捕獲32位版本和16位版本(虛擬運行)。這非常快速且易於實施。

您應該已經有了一種自動方式來捕獲已知良好版本代碼的參考圖像。如果你不這樣做,那麼現在就這樣做,因爲當你對控件的外觀做一些小改動時,它會爲你節省時間。您現在有了迴歸測試的參考。