文章类型: VC&C++
关键词: VC,CDC,TextOut,解决,输出,重叠,SetBkMode
内容摘要: VC CDC TextOut 输出重叠,使用SetBkMode进行解决输出重叠问题

VC中的CDC输出重叠TextOut清除,使用SetBkMode解决TextOut输出重叠问题

2018/11/27 10:22:40    来源:apple    阅读:

问题描述:先调用TextOut(0,0,"123456789");在程序视图中如期出现了字符串“123456789”。
接着,在次调用TextOut(0,0,"987654");但是此时程序视图中除了显示“987654”之外,还有上一次字符的尾巴,看上去就像两次调用的结果重叠了,后面一次覆盖在前一次的上面。看下面的两种解决方案,

方法一:

在每次TextOut输出之前添加,且两句都必须有!
InvalidateRect(&rc);
UpdateWindow();

这种办法是可以解决CDC的TextOut输出重叠问题,但还有一种方法也许是更好的解决办法

方法二:

使用函数SetBkMode进行解决,在TextOut输出的前面,添加下面的语句,

m_bkMemDC.SetBkMode(OPAQUE);

这样就可以解决内容修改后m_bkMemDC的TextOut输出的文字重叠(由于输出的背景模式前面设置了“TRANSPARENT”,所以这里的修改输出后出现了交叉覆盖)问题”。这里使用的参数OPAQUE方式是用当前背景的画刷的颜色输出显示文字的背景,而TRANSPARENT是使用透明的输出,也就是文字的背景是不改变的。

其中有一个用户提出的“如何在TEXTOUT输出前清除之前的显示,要不然每次的输出结果都在上面”,有个用户给出下面的回答,我认为是正确的。

SetBkMode
The SetBkMode function sets the background mix mode of the specified device context. The background mix mode is used with text, hatched brushes, and pen styles that are not solid lines. 

int SetBkMode(
  HDC hdc,      // handle of device context
  int iBkMode   // flag specifying background mode
);
 
Parameters
hdc 
Handle to the device context. 
iBkMode 
Specifies the background mode. This parameter can be either of the following values: Value Description 
OPAQUE Background is filled with the current background color before the text, hatched brush, or pen is drawn. 
TRANSPARENT Background remains untouched. 


Return Values
If the function succeeds, the return value specifies the previous background mode.

If the function fails, the return value is zero. 

Windows NT: To get extended error information, callGetLastError.

Remarks
The SetBkMode function affects the line styles for lines drawn using a pen created by the CreatePen function. SetBkMode does not affect lines drawn using a pen created by the ExtCreatePen function. 

The iBkMode parameter can also be set to driver-specific values. GDI passes such values to the device driver and otherwise ignores them.

Windows CE: The iBKMode parameter is stored internally as a single byte.

QuickInfo
  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in wingdi.h.
  Import Library: Use gdi32.lib.

See Also
Painting and Drawing Overview, Painting and Drawing Functions, CreatePen, ExtCreatePen, GetBkMode 


下面给出了SetBkMode函数用法详解,

输出的字符串时,发现存在背景色,这样的输出是破坏背景的。那需要使用什么方法来保持背景不变,而又能输出红色的字符串呢?比如按钮的文字颜色是黑色的,而背景是灰色的。这就需要使用SetBkMode函数来设置DrawText函数的输出方式,显示设备共有两种输出方式:OPAQUE和TRANSPARENT。OPAQUE的方式是用当前背景的画刷的颜色输出显示文字的背景,而TRANSPARENT是使用透明的输出,也就是文字的背景是不改变的。

函数SetBkMode声明如下:
WINGDIAPI int   WINAPI SetBkMode(__in HDC hdc, __in int mode);
hDC是当前设备的句柄。
mode是要设置的模式。
函数返回值是前一次设置的模式。

调用这个函数的例子如下:

void CCaiWinMsg::OnDraw(HDC hDC)
{
  //
std::wstring strShow(_T("C++窗口类的实现,2007-08-27"));
  
//设置输出字符串的颜色.
COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));

RECT rcText;    
rcText.left = 10;
rcText.top = 10;
rcText.right = 300;
rcText.bottom = 80;

//创建黑色的画刷,
HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));

//用黑色的画刷填充四边形的颜色.
FillRect(hDC,&rcText,hbrush);

//删除画刷.
DeleteObject(hbrush);

rcText.left = 10;
rcText.top = 10;
rcText.right = 300;
rcText.bottom = 40;

//显示字符串在四边形的中间位置.
DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
       DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);

rcText.left = 10;
rcText.top = 40;
rcText.right = 300;
rcText.bottom = 80;
//设置透明背景
int nOldMode = SetBkMode(hDC,TRANSPARENT);

//显示字符串在四边形的中间位置.
DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
       DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);

//恢复原来的模式.
SetBkMode(hDC,nOldMode);

//恢复原来的颜色.
  SetTextColor(hDC,crOld);
}

//设置透明背景。
 /* 对透明的理解:在窗体或控件输出的字符串或图形是有背景色的。而窗体或控件也是有背景色的。这两种背景色一般是不同的,
    这样输出图形或字符串时,两种背景(窗体或控件的背景色、符串或图形的背景色)重叠在一起了,影响美观,为了不让这两种
    背景重叠,可以设置背景模式为TRANSPARENT(透明的),即让输出的字符串或图形的背景色不可见。可以这样理解:把输出的
    字符串或图形的背景色看成是一物体,窗体或控件看成另一物体,字符串或图形在窗体或控件前面挡住窗体或控件了(因为输出
    的字符串或图形是画在窗体或控件上的,所以可以这么类比),但是透过字符串或图形能看到窗体或控件。即字符串或图形的背
    景色所代表的物体是透明的

 */

↑ 上一篇文章:VC 7>c1xx : fatal error C1083: 无法打开源文件: “ ***.cpp”: No such file or directory 关键词:VC,c1xx,fatal,error,C1083,无法.. 发布日期:2018/11/22 14:24:33
↓ 下一篇文章:VC对话框大小和位置设置 关键词:VC,对话框,大小,位置,设置 发布日期:2018/11/28 11:26:18
相关文章:
CDC::TextOut() 设置输出的字体颜色及大小 关键词:CDC,TextOut,设置,输出,字体,颜色,大小 发布日期:2018-11-29 16:29
vc++调试出现输入框:please enter the path for DBGHEAP.C的解决办法 关键词:vc++,调试出现输入框,please,enter,the,path,for,DBGHEAP.C.. 发布日期:2017-08-31 11:48
VC++ 6.0 Build配置中没有Release的解决办法 关键词:VC++,6.0,Build配置中没有Release的解决办法,build,vc++,prepr.. 发布日期:2017-05-09 14:46
相关目录:.NETVC&C++软件开发
我要评论
正在加载评论信息......