开始我在Form的Paint里直接Canvas画图,发现只要一repaint就会闪烁,很明显是先画了背景再画图片造成的,但我发现就算我截下WM_ERASEBKGND直接返回true也不能阻止其重画背景颜色,后来搜到csdn上也有人问到,最后给出的可用解决方法让我觉得很奇怪:首先截下WM_ERASEBKGND返回false,然后子类化整个form的window,处理窗口消息处理函数中的WM_ERASEBKGND和WM_HSCROLL,WM_VSCROLL…
C, C++, Obj-C
Get flicker free animation in MFC/GDI+
Why still flicker in my animation(GDI+,MFC)?
Many articles talk about using double buffer to eliminate filker, but I found their methodes don’t work.Then I found even I draw one single line in CView::OnDraw method, the window flickers on mouse moving which causes CView::Invalidate(true).
关于TListBox自绘状态下的repaint闪烁问题
又是一个flicker prob.但这个控件的闪烁问题和以往遇到的有些不同,一般情况下只要禁止控件重绘背景(WM_ERASEBKGND这个消息)就可以解决。我先用了简单的设置方式(那个直接设置vcl控件属性禁止重绘背景),但发现没有效果,后来又用了窗口子类化,重写了窗口过程拦下了重绘背景的消息,但是实际运行发现也没有效果,最后我用SPY++查看这个控件时发现,一个TListBox实际上是由2部分组成,一个TScrollBox负责控制2边滚动条的显示,还有一个InnerListBox是实际显示item的控件,以前的几种尝试方式都是针对错了对象的,如果将子类化的hwnd用inner的就没问题了,基本解决了重绘整个控件时的闪烁问题,但是还是有一点小bug:由于TListBox自绘时并不会卡准最后一个Item的下边一定和控件的下边位置一致,所以有可能在控件内空出一部分空间,如果禁用了背景重画,则空出的这部分空间的颜色无法控制,而另一种方式通过打开inner的双缓冲也可以解决闪烁的问题,但是还是这部分空出的空间的颜色会有时正常(拖动滚动条移动时)有时不正常(用滚轮移动时),这个问题还有待解决。
如何使MFC的MDI默认不创建空child窗口
[color=#008000]// Parse command line for standard shell commands, DDE, file open[/color]
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
[color=#008000]// 防止开启后自动创建child[/color]
[color=#0000D0]if[/color] (cmdInfo.m_nShellCommand==CCommandLineInfo::FileNew)
{
[color=#0000D0]if[/color] (cmdInfo.m_strFileName==[color=#808080]””[/color])
{
cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing;
}
}
[color=#008000]// Dispatch commands specified on the command line[/color]
[color=#0000D0]if[/color] (!ProcessShellCommand(cmdInfo))
[color=#0000D0]return[/color] [color=#0000D0]FALSE[/color];
本代码由xTiNt自动着色 http://kbadboy.yeah.net
关于TScrollBox滚动后的内部控件重绘问题
当我在scrollbox内放个paintbox的时候,发现当滚动重绘的时候的行为好像是只更新并添加需要的部分,即滚动出来的新的部分,但这样会导致在滚动刷新的时候出现图像破碎的感觉,为了解决这个问题,我子类化了scrollbox,截获其WM_VSCROLL和WM_HSCROLL,然后invalidate对应的scrollbox,这样就不会出现破碎感了,但不知道会不会导致效率的下降。
[ZT]BCB6中的#Pragma说明
1.#pragma alignment
alignment pragma用于显示一条当前内存对齐(alignment)和枚举(enum)字节大小的消息。例如:
W8035: The alignment is 8 bytes, the enum size is 4 bytes
该消息必须在打开编译器选项”show general messages”或编译器开关”-wmsg”后才能显示。
TdxBarSpinEdit 不能更新当前数字的问题
今天用的时候才发现不像普通的spinedit,不管是自己输入或是通过旁边的按钮都不能更新数字。
You should set the BarManager’s AlwaysSaveText property to TRUE.
Bastian Bauwens
DX-Squad
而如果是MDI子窗体的bar同时有合并操作的话则要同样设置主窗体的bar manager的此属性才可以。
[ZT]Eliminate flicker when painting on a form or a TPaintBox control.
Answer:
A lot of programmers complain about flicker when they draw on a TPaintBox control, when they draw on the form’s Canvas, or when they paint on the Canvas of a control that they have written. One newsgroup post contained a subject line that read: “TPaintBox wicked flicker, can it be stopped.” The answer is yes, and the solution is simple, once you understand what is going on.
用devexpress的TdxPNGImage为TOpenPictureDialog加入png图片预览功能
在需要的地方(整个程序的入口或某个form加载的时候)加入
#include “dxGDIPlusClasses.hpp”
// 不知道这个check有没有必要…
CheckPngCodec();
// 注册png文件类型,为以后的TOpenPictureDialog的预览等其他地方用
TPicture::RegisterFileFormat(__classid(TdxPNGImage),
这样就ok了!很简单。