У меня есть программа Win32 GUI с элементом управления вкладками, каждая вкладка имеет элемент управления представлением списка. При изменении размера окна происходит сильное мерцание. Я пробовал следующие вещи:
- Обработка WM_ERASEBKGND в главном wndproc и возврат TRUE. Без эффекта.
- Фильтрация всех сообщений WM_ERASEBKGND в цикле событий. Нет эффекта.
- Установка стиля WM_CLIPCHILDREN в главном окне. Теперь при изменении размера окна элемент управления представления списка просто стирается на белом фоне и не перерисовывается.
- Использование DefWindowPos вместо MoveWindow. Нет эффекта.
- Передача FALSE для bRepaint в MoveWindow. Тот же эффект, что и при настройке WS_CLIPCHILDREN (см. Выше).
Вот код 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
)