2011-01-27 3 views
2

私はWinAPIを使ってC++で記述されたコントロールを持っています。私は自動的に正しく描画されているかどうかテストしたいと思います。私は描かれたイメージを保存されたリファレンスイメージと比較するか、特定のピクセルが特定の色を持っているかを単にテストすることができます。私は両方のタイプを実装しています。GDIでのコントロール描画のユニッ​​トテスト

問題は何らかの理由で16ビットの色深度しかない仮想マシンで毎晩テストが実行されるという問題です。これにより、色がわずかにオフになります。私は16ビットの色深度で描かれたときに変更されない色を思いついたが、丸めの仕方はやや複雑で、32bと16bの色深度の両方で機能するようにテストする必要がある。

もう1つのアイデアは、常に32bの色深度を持つオフスクリーンビットマップを作成することでした。テストで毎回同じ環境が使用されるというメリットがありますが、それを動作させることはできませんでした。画面の色の濃さに関係なく32b HBITMAPとHDCを作成するにはどうしたらいいですか?あるいは、一般的な問題を解決するためのヒントがありますか?

ありがとう

答えて

1

32ビット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

私はこのコードを正確に試しましたが、mem_dcを0(画面)から作成すると再び16bになるので動作しません。 –

+0

@Roman:私はmemppを4bpp、8bpp、16bppに32bppのカラーウィンドウで作成しました。アップスケーリングが機能しないことを意味しますか? pls再チェック。また、問題は参照画像との比較結果コードと関連している可能性があります –

+0

このコードは実際に動作し、私はあなたの助けを借りて私のバグを発見しました。 –

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

OleLoadPictureはデスクトップとは異なる色深度で動作しないため、GDI +を使用して画像を読み込むことになりました。 –

0

32ビットイメージまたは16ビットイメージとの比較がOKの場合、テストを合格に変更します。 32ビット版と16ビット版(仮想実行中)の両方をキャプチャします。これは本当に迅速かつ簡単に実装できます。

既知の優れたバージョンのコードの参照画像をキャプチャするための自動方法が既に用意されているはずです。そうしないと、コントロールの外観を少し変更したときに時間が節約されるので、今すぐ実行してください。あなたは今、回帰テストのリファレンスを持っています。

関連する問題