控件闪烁的解决方案

土豆吞噬者 2010-05-25 03:44:56
为了实现列表效果 我覆盖了ListBox父类的DrawItem方法
自己画列表项 已经实现 但是目前有一个问题
就是2个我自己写的ListBox之间互相切换
(2个ListBox大小和位置都相同 用Visable属性控制切换)
会出现一点闪烁
看了源代码发现每次绘制一个Item 都要在控件上画一次
有点怀疑 是这个引起的闪烁
我想要它全部Item画完了再显示出来 应该怎么做?
或者说闪烁不是由我这个原因引起的?
不要说把双缓冲属性开启 我试过 那样闪烁更加厉害
顺便问下 自己做第三方控件的时候
什么时候选择继承有句柄的控件
什么时候选择继承无句柄的控件
有句柄的控件和无句柄的控件之间的差别 欢迎大家讨论!
...全文
176 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Harryfin 2010-05-25
  • 打赏
  • 举报
回复
RedrawWindow本身是没有禁止重绘的作用的。它要和SET_REDRAW消息合用才有效果。
guanking 2010-05-25
  • 打赏
  • 举报
回复
在DrawItem里面画完东西后加入
RedrawWindow(0,nil,0,RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN);

说明:
RedrawWindow 导致更新特定的矩形或者给定窗口的区域。不同的操作允许你控制更新过程。

BOOL RedrawWindow(
HWND hWnd, // handle of window
CONST RECT *lprcUpdate, // address of structure with update rectangle
HRGN hrgnUpdate, // handle of update region
UINT flags // array of redraw flags
);



参数:
HWND: 指定窗口的句柄。如果这个参数是NULL,则更新桌面窗口。

lprcUpdate: 到RECT结构的指针。这个矩形包含要更新的客户区的坐标。这个参数可以是NULL。如果这个参数和hrgnUpdate都是NULL,则假设为整个客户区。

hrgnUpdate: 指定要更新的区域句柄。如果这个参数不是NULL,则将忽略lprcUpdate。如果这个参数和lprcUpdate都是NULL,则假设为整个客户区。

flags: 指定定义如何影响窗口,如何进行重绘和影响哪一个窗口的不同标志。

对于flags的值参数如下:

无效标志

RDW_ERASE 受到影响的窗口将在重新绘制的时候收到WM_ERASEBKGND消息。也必须指定RDW_INVALIDATE标志。
RDW_FRAME 导致和更新区域相交的非客户区部分收到WM_NCPAINT消息。也必须指定RDW_INVALIDATE标志。
RDW_INTERNALPAINT 强迫向受到影响的窗口发送WM_PAINT消息,而无论是否存在无效的区域。
RDW_INVALIDATE 导致将hrgnUpdate 或者lprcUpdate所定义的区域标志为无效。如果两个参数者是NULL,则整个客户区是无效的。

有效标志

RDW_NOERASE 导致忽略任何挂的WM_ERASEBKGND消息。
RDW_NOFRAME 导致忽略任何挂的WM_NCPAINT消息。也必须指定RDW_VALIDATE消息。
RDW_NOINTERNALPAINT 导致忽略任何挂的WM_PAINT消息。如果产生的更新区域不是NULL,则仍然将发出WM_PAINT。
RDW_VALIDATE 导致hrgnUpdate 或者lprcUpdate所定义的区域标志为有效。任何挂起的内部WM_PAINT消息仍然将发送给窗口。

重新绘制标志

RDW_ERASENOW 导致完成任何挂起的WM_NCPAINT和WM_ERASEBKGND消息。
RDW_UPDATENOW 导致在从这个函数返回之前,完成任何挂起的WM_NCPAINT,WM_ERASEBKGND和WM_PAINT消息。

子窗口控制标志

RDW_ALLCHILDREN 导致影响所有子窗口。
RDW_NOCHILDREN 导致不影响所有子窗口。

返回值 如果成功,则返回非0,否则返回0。
  • 打赏
  • 举报
回复
同意楼上。
Harryfin 2010-05-25
  • 打赏
  • 举报
回复
ListBox.Items.BeginUpdate;
画东西
ListBox.Items.EndUpdate;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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