У меня есть программа GUI Win32 с управлением вкладкой, каждая вкладка, имеющая контроль представлением списка. Существует крупное мерцание каждый раз, когда окно изменено. Я попробовал следующие вещи:
Вот код RegisterClassEx:
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);
Обработчик WM_SIZE:
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);
Стили следующие:
WS_OVERLAPPEDWINDOW
WS_CHILD
(и WS_VISIBLE
)WS_CHILD | WS_BORDER | LVS_REPORT
(и WS_VISIBLE
)Оказалось, что возникла проблема с Z-порядком - вызов BringWindowToTop в представлении списка решил проблему.
Когда ListView закреплен, как в Проводник Windows (и у вас есть хороший количество предметов), изменяя размер основного форма приведет к тому, что все элементы будут мерцание. http://www.codeproject.com/KB/list/listviewxp.aspx
Я могу утверждать очевидное, но я думал двойная буферизация - это решение проблемы мерцания Win32. Я разработчик Java, и довольно давно я написал win32, поэтому, пожалуйста, дайте мне знать, если я говорю чушь
Вот как: http://www.gamedev.net/community /forums/topic.asp?topic_id=411559
Вот пример кода Sampe: http://www.codeproject.com/KB/cpp/DoubleBuffering.aspx
Вот вопрос, эквивалентный .NET ( ?): Как предотвратить мерцание текстового поля Windows Forms при изменении размера?
Windows поддерживает операцию дозирования повторных размеров, которая предназначена для того, чтобы избежать мерцания, вызванного тем, когда множество дочерних окон неамийны. См. BegindeferwindowPos для получения дополнительной информации об этом.
Если это не работает, то попробуйте сообщение WM_SETREDRAW . Это выглядит возможно, чтобы остановить рисунок родительского окна - который будет ингибировать все элементы управления дочерним элементом, затем, когда макет закончен, снова включите рисунок и вызовите RedRawWindow, чтобы перекрасить все окно в один проход. Я предпочел подумать, что это то, что посвеченное местоположение окна будет использовать внутренне.