关于利用GDI绘制画面的问题 - 少绘制了一块区域
软件环境:
Windows xp sp3,Visual Stdio 2005 Professional(未安装SP1),GDI
硬件环境:
显卡及驱动,17" 4:3 液晶显示器
问题描述:
我在指定的屏幕分辨率下绘制红绿蓝黑白五种颜色的竖条状画面(五种颜色均分屏幕宽度),但在720*480分辨率下,尤其在色深8bit时,白色很容易被少绘制,存在如下两种现象:
1、有时白色看上去少了一半,但实际上没少,这应该是液晶显示器的自动调整画面问题,如果手动让他调整一下就可以显示正常。
2、有时白色确实少了一半,缺少的那部分将被默认的黑色画刷填充。
我利用截屏或者利用程序检查(719,0)的颜色检查过,确实是这两种现象。
当然,还有第三种是画面的下面少了一部分,这种与上面的2应该类似吧?
那么,第二种情况是如何发生的,如何解决?
我在Paint里的代码如下:
int uWidth = 720;
int uHeight = 480;
int part = (int) uWidth / ALL_MODE_COLOR_NUM; // ALL_MODE_COLOR_NUM为5,ALL_MODE_COLOR为5种颜色的数组
int leaves = (int) uWidth % part;
int nColorIndex = 0;
int nRight = 0;
int left = 0;
for ( int i = 0; i < ALL_MODE_COLOR_NUM; i++, nColorIndex++ )
{
HBRUSH hDataBrush = CreateSolidBrush(ALL_MODE_COLOR[nColorIndex]);
if ( NULL == hDataBrush )
{
throw Win32ApiFailException(GetLastError(), __TFILE__, __TFUNCTION__, __LINE__);
}
BrushResourceDeleter brd(hDataBrush); // 负责删除brush
HBRUSH hDefaultBrush = (HBRUSH) SelectObject(hDC, hDataBrush);
if ( NULL == hDefaultBrush || HGDI_ERROR == hDefaultBrush )
{
throw Win32ApiFailException(GetLastError(), __TFILE__, __TFUNCTION__, __LINE__);
}
BrushResourceRestorer brr(hDC, hDefaultBrush); // 负责恢复brush
int wide = ( nColorIndex + 1 == ALL_MODE_COLOR_NUM ? (part + leaves) : part);
nRight += wide;
RECT rect = {left, 0, nRight, (int) uHeight};
if ( !FillRect(hDC, &rect, hDataBrush) )
{
throw Win32ApiFailException(GetLastError(), __TFILE__, __TFUNCTION__, __LINE__);
}
left += wide;
}