关于利用GDI绘制画面的问题 - 少绘制了一块区域

wdz609 2009-04-12 03:57:46
软件环境:
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;
}
...全文
71 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdz609 2009-06-23
  • 打赏
  • 举报
回复
谢谢关心,当我在WM_ACTIVATE消息中增加ShowWindow()、SetForegroundWindow()等的调用后,好像不大出这种现象了。看样子,还是得花大功夫搞懂windows消息机制。
infsafe 2009-04-14
  • 打赏
  • 举报
回复
这不是程序问题吧,个人感觉是显卡或者显示器于GDI函数有些不一致的地方.windows编程里面提到过.
wdz609 2009-04-14
  • 打赏
  • 举报
回复
如果是显卡或显示器与GDI函数有些不一致的地方,那我应该如何做呢?

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧