I have a Win32 GUI program with a tab control, each tab having a list view control. There is massive flickering whenever the window is resized. I've tried the following things:
Here's the RegisterClassEx code:
memset(&wcex, 0, sizeof(WNDCLASSEX));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = PhMainWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = PhInstanceHandle;
wcex.hIcon = LoadIcon(PhInstanceHandle, MAKEINTRESOURCE(IDI_PROCESSHACKER));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
//wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MAINWND);
wcex.lpszClassName = PhWindowClassName;
wcex.hIconSm = (HICON)LoadImage(PhInstanceHandle, MAKEINTRESOURCE(IDI_PROCESSHACKER), IMAGE_ICON, 16, 16, 0);
The WM_SIZE handler:
RECT rect;
// Resize the tab control.
GetClientRect(PhMainWndHandle, &rect);
MoveWindow(TabControlHandle, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top, TRUE);
// Resize the list view.
TabCtrl_AdjustRect(TabControlHandle, FALSE, &rect);
MoveWindow(ListViewHandle, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top, TRUE);
The styles are as follows:
WS_OVERLAPPEDWINDOW
WS_CHILD
(and WS_VISIBLE
)WS_CHILD | WS_BORDER | LVS_REPORT
(and WS_VISIBLE
)It turned out there was a problem with the Z-ordering - calling BringWindowToTop on the list view solved the problem.
Windows supports a re-size batching operation that is meant to avoid flicker caused when lots of child windows are indepently resized. See BeginDeferWindowPos for more information on that.
If that is not working, then try the WM_SETREDRAW message. It looks possible to stop drawing of the parent window - which will inhibit all the child controls, then, when the layout is finished, enable drawing again, and call RedrawWindow to repaint the entire window in one pass. I did rather think that this is what Defered window positioning would use internally.
I may be stating the obvious, but I thought double buffering is the solution to Win32 flickers. I'm a Java Developer and it has been a while sine I wrote win32 so please let me know if I'm talking nonsense
Here is the how to: http://www.gamedev.net/community/forums/topic.asp?topic_id=411559
Here is some sampe code: http://www.codeproject.com/KB/cpp/DoubleBuffering.aspx
Here is the .NET equivalent question (?): How to prevent a Windows Forms TextBox from flickering on resize?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With