SetBkMode(TRANSPARENT)后的问题

Caibird1 2010-12-15 09:34:31
使用SetWindowText, SetDlgItemText之类的函数去修改显示的文字,会发生文字重叠,如果用ShowWindow(SW_HIDE)和ShowWindow(SW_SHOW)的办法解决文字重叠的话频繁修改文字控件文字就会闪动.如何才能让控件文字不闪?
...全文
571 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mdebug 2012-05-29
  • 打赏
  • 举报
回复
解决了。。。。。。。。。。。。。。。
Caibird1 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 varding 的回复:]

引用 8 楼 caibird1 的回复:

引用 5 楼 varding 的回复:

上面是wtl的写法,这个mfc的
C/C++ code
void CSidePanel::UpdateBk( int id )
{
RECT rect;
CWnd *stc = GetDlgItem(id);
stc->GetWindowRect(&rect);
S……
[/Quote]
设置Clip Children后似乎无效..
varding 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 caibird1 的回复:]

引用 1 楼 leeihcy 的回复:

1. 可试试 Invalidate( &rcControl ); 刷新父窗口

2. 如果是 static 控件可以考虑直接在 onerasebkgnd或onpaint上 DrawText出来,不闪

3. 重绘控件吧,做个透明控件,这样能不闪

方法2可行..至于方法3能否给个SDK版的例子?暂时不知道SDK怎么重绘控件……
[/Quote]

要子类化,简单来说就是替换控件的消息处理函数,你想干嘛都可以了

http://www.cnblogs.com/jcily/archive/2009/10/22/1587778.html
varding 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 caibird1 的回复:]

引用 5 楼 varding 的回复:

上面是wtl的写法,这个mfc的
C/C++ code
void CSidePanel::UpdateBk( int id )
{
RECT rect;
CWnd *stc = GetDlgItem(id);
stc->GetWindowRect(&rect);
ScreenToClient(&rect)……
[/Quote]

用这个就不需要ShowWindow了
如果还不行,把主窗口的Clip Children设置成True试试
Caibird1 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 leeihcy 的回复:]

1. 可试试 Invalidate( &rcControl ); 刷新父窗口

2. 如果是 static 控件可以考虑直接在 onerasebkgnd或onpaint上 DrawText出来,不闪

3. 重绘控件吧,做个透明控件,这样能不闪
[/Quote]
方法2可行..至于方法3能否给个SDK版的例子?暂时不知道SDK怎么重绘控件..
Caibird1 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 varding 的回复:]

上面是wtl的写法,这个mfc的
C/C++ code
void CSidePanel::UpdateBk( int id )
{
RECT rect;
CWnd *stc = GetDlgItem(id);
stc->GetWindowRect(&rect);
ScreenToClient(&rect);
InvalidateRect……
[/Quote]
这段代码解决了文字重叠的问题,不过控件文字闪的问题没解决.
leeihcy 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fishion 的回复:]
有就是重载该控件,想办法处理闪的问题,如:可以用相同背景的的颜色填充办法来处理重会闪的问题。但是如果要做透明控件而且更新数据不显,估计你也会碰壁不少,这是MFC的Invalidate的劣性。
[/Quote]


建议你可以看看 VS2008 SP1 中的 MFC 源码,其中button透明的方法;

1. 调用 DrawThemeParentBackground 方法

2. 获取父窗口的背景图,方法很巧妙, 给父窗口发消息,SendMessage( WM_ERASEBKGND, hDC , 0 )
muzizongheng 2010-12-15
  • 打赏
  • 举报
回复
SetWindowText

后调用InvalidateRect和UpdateWindow
varding 2010-12-15
  • 打赏
  • 举报
回复
上面是wtl的写法,这个mfc的
void CSidePanel::UpdateBk( int id )
{
RECT rect;
CWnd *stc = GetDlgItem(id);
stc->GetWindowRect(&rect);
ScreenToClient(&rect);
InvalidateRect(&rect);
UpdateWindow();
}

varding 2010-12-15
  • 打赏
  • 举报
回复
void CxxDlg::UpdateBk( int id )
{
RECT rect;
CWindow stc = GetDlgItem(id);
stc.GetWindowRect(&rect);
ScreenToClient(&rect);
InvalidateRect(&rect);
UpdateWindow();
}

你更新了某个控件,记得调用这个函数就行了,id就是你的控件id
dianhui 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fishion 的回复:]

最好还是不用控件,直接在窗口上DrawText,或者TextOut
[/Quote]

用了Invalidate就会显,不用嘛,重画时又会产生重影,建议最好还是直接在窗口上DrawText,或者TextOut;当然还有就是重载该控件,想办法处理闪的问题,如:可以用相同背景的的颜色填充办法来处理重会闪的问题。但是如果要做透明控件而且更新数据不显,估计你也会碰壁不少,这是MFC的Invalidate的劣性。谁解决了这个问题希望在此留个印,我也想学习学习。
fishion 2010-12-15
  • 打赏
  • 举报
回复
最好还是不用控件,直接在窗口上DrawText,或者TextOut
leeihcy 2010-12-15
  • 打赏
  • 举报
回复
1. 可试试 Invalidate( &rcControl ); 刷新父窗口

2. 如果是 static 控件可以考虑直接在 onerasebkgnd或onpaint上 DrawText出来,不闪

3. 重绘控件吧,做个透明控件,这样能不闪

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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