Win32 GUI, мерцающий на, изменяет размер

У меня есть программа GUI Win32 с управлением вкладкой, каждая вкладка, имеющая контроль представлением списка. Существует крупное мерцание каждый раз, когда окно изменено. Я попробовал следующие вещи:

  • Обработка WM_ERASEBKGND в основном wndproc и возвращение TRUE. Никакой эффект.
  • Отфильтровывание всего WM_ERASEBKGND передает в конечном счете цикл. Никакой эффект.
  • Установка WM_CLIPCHILDREN разрабатывает на главном окне. Теперь, когда окно изменено, управление представлением списка просто стирается к белому фону и не перерисовывает.
  • Использование DefWindowPos вместо MoveWindow. Никакой эффект.
  • Передающая ЛОЖЬ для 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_CHILDWS_VISIBLE)
  • Управление представлением списка: WS_CHILD | WS_BORDER | LVS_REPORTWS_VISIBLE)
5
задан wj32 10 January 2010 в 09:30
поделиться

4 ответа

Оказалось, что возникла проблема с Z-порядком - вызов BringWindowToTop в представлении списка решил проблему.

4
ответ дан 14 December 2019 в 08:51
поделиться

Когда ListView закреплен, как в Проводник Windows (и у вас есть хороший количество предметов), изменяя размер основного форма приведет к тому, что все элементы будут мерцание. http://www.codeproject.com/KB/list/listviewxp.aspx

0
ответ дан 14 December 2019 в 08:51
поделиться

Я могу утверждать очевидное, но я думал двойная буферизация - это решение проблемы мерцания 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 при изменении размера?

1
ответ дан 14 December 2019 в 08:51
поделиться

Windows поддерживает операцию дозирования повторных размеров, которая предназначена для того, чтобы избежать мерцания, вызванного тем, когда множество дочерних окон неамийны. См. BegindeferwindowPos для получения дополнительной информации об этом.

Если это не работает, то попробуйте сообщение WM_SETREDRAW . Это выглядит возможно, чтобы остановить рисунок родительского окна - который будет ингибировать все элементы управления дочерним элементом, затем, когда макет закончен, снова включите рисунок и вызовите RedRawWindow, чтобы перекрасить все окно в один проход. Я предпочел подумать, что это то, что посвеченное местоположение окна будет использовать внутренне.

2
ответ дан 14 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: