关于利用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;
}
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;
}
...全文
相关推荐
c# gdi+ 地图绘制
c# gdi+ 地图绘制 读取坐标点 缩放 漫游 查询。
使用GDI对象绘制UI时需要注意的若干细节问题总结
本文结合多年的项目实践,给大家分享几个使用GDI对象的细节,以供大家借鉴或参考。
C# GDI+实现网格绘制,并显示内容
C# GDI+实现的网格绘制功能,同时,项目包含了GDI+的基本功能介绍和使用项目,工程使用vs2012编写,已通过编译。
三维投影Demo (使用GDI+绘制三维图形轮廓)
本项目展示了如何使用二维的绘图API (DrawLine)绘制三维图形的轮廓,开发语言为C#,项目环境为Visual Studio 2008。 三维旋转矩阵是投影操作中的关键,本项目展示了旋转矩阵的使用,并建立了一个简单的三维场景,用户可以通过拖动鼠标对场景进行旋转。
GDI+ 绘制矩形、箭头、圆形、线
GDI+ 绘制矩形、箭头、圆、线,可以选择画笔颜色、画笔宽度、图形随鼠标移动并且可拉伸。


工具平台和程序库

