Pregunta

Tengo un programa Win32 GUI con un control de pestañas, cada ficha que tiene un control de vista de lista. Hay parpadeo masiva cada vez que se cambia el tamaño de la ventana. He intentado lo siguiente:

  • Manipulación WM_ERASEBKGND en el wndproc principal y devolver TRUE. Sin efecto.
  • El filtrado de todos los mensajes WM_ERASEBKGND en el bucle de eventos. Sin efecto.
  • Ajuste del estilo WM_CLIPCHILDREN en la ventana principal. Ahora, cuando se cambia el tamaño de la ventana del control de vista de lista es simplemente borrar en un fondo blanco y no redibuja.
  • Uso DefWindowPos en lugar de MoveWindow. Sin efecto.
  • FALSO Al pasar por bRepaint en MoveWindow. Mismo efecto que establecer WS_CLIPCHILDREN (véase más arriba).

Aquí está el código 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);

El manejador 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);

Los estilos son los siguientes:

  • Ventana principal: WS_OVERLAPPEDWINDOW
  • control de ficha: WS_CHILD (y WS_VISIBLE)
  • control de vista de lista: WS_CHILD | WS_BORDER | LVS_REPORT (y WS_VISIBLE)
¿Fue útil?

Solución

Resultó que había un problema con el orden Z -. BringWindowToTop llamando a la vista de lista resuelto el problema

Otros consejos

Windows es compatible con una operación de procesamiento por lotes cambiar el tamaño que está destinado a evitar el parpadeo causado cuando un montón de ventanas hijas se redimensionan indepently. Ver BeginDeferWindowPos para obtener más información al respecto.

Si eso no funciona, entonces prueba el WM_SETREDRAW mensaje. Parece posible detener el dibujo de la ventana padre - que inhibirá todos los controles secundarios, a continuación, una vez finalizada la presentación, permitirá a dibujar de nuevo, y llamar a RedrawWindow volver a pintar toda la ventana en una sola pasada. Yo más bien creo que esto es lo defered ventana de posicionamiento usaría internamente.

Puede que sea una obviedad, pero pensé doble buffer es la solución a Win32 parpadea. Soy un desarrollador de Java y ha sido un seno mientras escribía Win32 así que por favor, hágamelo saber si estoy hablando sin sentido

Aquí está el cómo: http: //www.gamedev .net / comunidad / foros / topic.asp? topic_id = 411559

Aquí hay un código Sampe: http://www.codeproject.com/KB /cpp/DoubleBuffering.aspx

Aquí es la cuestión equivalente .NET (?): ¿Cómo prevenir un cuadro de texto de Windows Forms de parpadeo en cambio de tamaño?

  

Cuando está acoplado un ListView, como en   Explorador de Windows (y que tienen un buen   cantidad de artículos), el principal cambio de tamaño   forma hará que todos los elementos de   parpadeo.    http://www.codeproject.com/KB/list/listviewxp.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top