hATEmATH的网上田园

喂马 劈柴 做一个幸福的人
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789
公告
  • ◇ 欢迎来到这里的每一位朋友。

    ◇ 无需注册即可评论或留言。

    ◇ 文章无"转载(ZT)"字样均为原创。

    ◇ "随笔分类"中包含我的所有随笔

留言簿(13)

随笔分类

随笔档案

文章分类

文章档案

相册

工具网站

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-120 文章-20 评论-434 Trackbacks-0

Static控件背景透明时文字覆盖问题的解决方案

HateMath

 

引子:

    我泡论坛的时间并不长,但印象中已经有好多次在VC区看到类似这样的问题,而且经常议之未果:


请问
static控件设置透明后,再更改文字时会与之前的文字覆盖,怎么解决
pDC->SetBkMode(TRANSPARENT);
设置透明后,要改变控件的文字就会发生文字重叠,如果不使用透明就不会,
请问在透明状态下改变文字如何不发生重叠?

起初不以为意
,闲暇时自己试了一下,发现:文本确实有重叠。如下图(为了更好的说明问题,我特意设置了背景和前景色):

 




初步探究其原因,猜想应该是
static
控件的背景没有得到及时刷新。

那就好办了,解决办法:强制刷新。

方法1GetDlgItem(IDC_STATIC)->UpdateWindow();

无效...
方法
2GetDlgItem(IDC_STATIC)-> RedrawWindow();

无效.......
方法
3GetDlgItem(IDC_STATIC)-> Invalidate ();
无效.........

方法4:还不行?来点小技巧

SetDlgItemText(IDC_STATIC, "             ");//多用几个空格,把原先的文本

SetDlgItemText(IDC_STATIC, "TEST");

郁闷了…….


难道这么个小问题要用高级的方法搞?


这个问题困扰了我好几天,终于在一次上
WC时突然顿悟:static的背景已经是透明的了,那么残留的文本应该是画在static的父窗口上的。顿悟之后就是感叹:自己真笨啊。


办法有了:在给
static
设置新的文本之后(不是之前!)刷新窗口。

void CTestStaticDlg::OnTimer(UINT nIDEvent)

{

       CString strTime;

       CTime time = CTime::GetCurrentTime();

       strTime = time.Format("%y%m%d %H:%M:%S");

 

       GetDlgItem(IDC_STATIC)->SetWindowText(strTime);

       GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow(); //就这两句话而已,呵呵

       CDialog::OnTimer(nIDEvent);

}

编译运行,K.O.


 

(本文附完整实例代码,下载链接:http://blog.vckbase.com/Files/HateMath/TransStatic.rar)

posted on 2005-08-04 18:32 HateMath的网上田园 阅读(4568) 评论(12)  编辑 收藏
Comments
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    pAnic
    Posted @ 2005-08-04 18:57
    事实上,如果gdi内部提供双缓冲,包括闪烁等在内的一切绘图问题都可以迎刃而解,可惜不知盖茨有没这打算。
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    HateMath
    Posted @ 2005-08-04 19:15
    对文章补充一下,其实用RedrawWindow(); 刷的是整个客户区,有轻微闪烁。
    可以只刷static控件所在的RECT区域,不过简洁起见偶没有这样写。:P
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    gaoqing000
    Posted @ 2005-08-04 19:28
    上WC都在想程序,程序员的生活是这样的吗?
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    freedk
    Posted @ 2005-08-04 19:39
    我还以为上WC中掉进去了~~~~~~~~~~~~~
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    hengai
    Posted @ 2005-08-04 19:43
    看来,WC是程序员必不可少的地方。有些问题我也实在WC进行中想到方法解决的
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    从雨
    Posted @ 2005-08-09 11:06
    问一下,我自己画的文本,怎么解决。
    麻烦你看看我的程序,里面的自画按钮老是出现下划线。
    http://cs.zztl.com/news/admin/data/logodialog.rar
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    Kevin
    Posted @ 2006-06-08 09:39
    如果是在以以视频为背景的地方画static呢
  • # re: Kevin
    HateMath
    Posted @ 2006-06-08 11:22
    视频为背景的没有试过,directx背景的写过。
    其实也不是必须用static的,曾写过一个在CS游戏画面上显示时间和狙击枪准星(不开瞄准镜)的小程序,直接用TextOut就可以了。
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    likeprogram
    Posted @ 2006-10-17 09:39
    謝謝,這個問題困擾了我半天。
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    llllllllllllllllll
    Posted @ 2008-07-17 11:09
    如果我是显示在桌面上的呢,麻烦您再到厕所去顿悟一下!
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    hatemath
    Posted @ 2008-07-18 09:20
    这事就不不用跑厕所了,肚子疼刚从那回来。。。
    RedrawWindow,设定重画区域为你显示文字的那个小区域(不然会闪烁)。我以前写过一个全屏打CS时显示当前时间的程序,和你说的类似。
    肚子又疼了。。。
  • # re: Static控件背景透明时文字覆盖问题的解决方案
    |||||||||||||||
    Posted @ 2008-07-31 10:11
    非常感谢!
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]