GDI+ 绘制界面的问题

suokeng 2009-02-27 05:49:23
比较奇怪

一个对话框控件如下布局

+----------+ +--------------------------------+
| | | |
| | | |
| | | |
| | | |
| | | |
| 控 件 | | 自绘Tab控件1 |
| | | |
| | | |
| | | |
| | | |
+----------+ +--------------------------------+
+-------------------------+ +-----------------+
| | | |
| | | |
| | | |
| | | |
+-------------------------+ +-----------------+

上面四个都是用GDI+进行绘制的控件

问题就是当我对自绘tab控件进行选择并重画Tab时,经常会导致其他三个控件刷新(重绘)
通过spy++监控到这三个控件确实收到重绘消息,而其他三个控件相同操作却不会导致另外控件重绘

注:上面两个控件都是一个控件类,会不会控件太大的缘故


为什么?
如何避免
...全文
311 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
捕鲸叉 2009-02-28
  • 打赏
  • 举报
回复
是不是这样?
m_pActiveItem->tabWnd->LockWindowUpdate()
suokeng 2009-02-28
  • 打赏
  • 举报
回复
问题基本上解决了

看来是GDI+环境下用了UnlockWindowUpdate/LockWindowUpdate的问题,去掉闪烁就基本没有了

原来是这样实现的,当用户单击一个tab按钮准备显示相应的页时
代码显示如下:
if (pPage != NULL) {
if (m_pActiveItem == pPage)
return;

if (m_pActiveItem) {
m_pActiveItem->ShowWindow(SW_HIDE);
}

// 冻结本tab控件更新
//LockWindowUpdate();

m_pActiveItem = pPage;

// 冻结当前页面更新
//m_pActiveItem->tabWnd->LockWindowUpdate();

if (m_pActiveItem->tabType == TABTYPE_VDYNC) {
m_pActiveItem->tabWnd->SendMessage(WM_VIRTUAL_TABCHANGED, (WPARAM)m_pActiveItem->tabParam);
if (bReShow) {
BringToTop(m_pActiveItem);
}
}
else {
BringToTop(m_pActiveItem);
}

//分别解锁
//m_pActiveItem->tabWnd->UnlockWindowUpdate();
//UnlockWindowUpdate();

// 重绘tab控件tab区域

InvalidateRect(&rc, FALSE);
}

各位,请问UnlockWindowUpdate/LockWindowUpdate难道不能这样用吗?
suokeng 2009-02-28
  • 打赏
  • 举报
回复
我是楼主,首先感谢各位的关注和回答

四个控件均独立,没有父子关系,四个控件均放置在对话框上,
完全自绘Tab控件上有一些tab页面form,当我单击一个tab时,我需要首先把相关的tab页放置到tab控件客户区最前显示,同时重画tab按钮以指示当前活动的页
感觉就是因为这个重画tab头的动作导致另外三个控件强烈的重画视觉。

用GDI+是因为感觉斜面圆弧的tab按钮用GDI绘制带锯齿,后来改贴图方式,觉得按钮尺寸不灵活,所以采用GDI+
采用GDI时不存在其他三个控件重绘的感觉

会不会是因为GDI+效率的缘故?
因为GDI+和GDI实际上不是同一层的东西,GDI无非一套图形算法而已,画布还是通过GDI来展现,如果AGG 2D图形库。

但是效率再低,其他三个控件没有被操作或者覆盖,不应该导致其重绘啊!!!

to cnzdgs:
我也是这样认为的,但是GDI+有点怪(也许我不会用),这之前前用GDI+做一个按钮控件,整个对话框就放一个GDI+按钮,都会导致整个对话框闪烁。

to Tinary3v0:
只更新操作的Tab控件,没有更新父亲窗口

to jameshooo:
四个控件独立,tab控件带子窗口但不是其他三个窗口,且限制显示在tab控件规定的客户区内。
您提到的方法我试试

谢谢
jameshooo 2009-02-27
  • 打赏
  • 举报
回复
如果其他控件是TAB控件的子控件,那么应该把TAB控件设置成WS_CLIPCHILDREN风格,这样子控件就不会收到重绘消息,通常可以避免子控件闪烁。
Tinary3v0 2009-02-27
  • 打赏
  • 举报
回复
更新的时候是更新的Tab控件的窗口么? 还是连父窗口一起都更新了?

先看看你的更新是针对那个窗口的 另外你特意提到GDI+是什么意思?
有详细点的说明么?
jimeshengxian 2009-02-27
  • 打赏
  • 举报
回复
帮顶
cnzdgs 2009-02-27
  • 打赏
  • 举报
回复
只要你没有刷新其它控件区域,就不会导致其它控件刷新。描述再具体一些。
suokeng 2009-02-27
  • 打赏
  • 举报
回复
我已经使用双缓冲了

15,979

社区成员

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

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