Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flicker when moving/resizing window

I have developed an application to display jpeg images. It can display 4 images, one in each quadrant of the screen. It uses 4 windows for that. The windows have no border (frame) nor titlebar. When a new image is loaded, the window size is adjusted for the new image and then the image is displayed.

Especially when the window is made larger, there is often a flicker. With my eyes to slits, it seems that the old contents is moved when resizing before the new contents is displayed.

I consulted many resources and used all tricks:

  • the window has only style CS_DBLCLKS (no CS_HREDRAW or CS_VREDRAW);

  • the background brush is NULL;

  • WM_ERASEBKGND returns 1;

  • WM_NCPAINT returns 0;

  • WM_NCCALCSIZE tells to align to the side not moved (can you tell it to discard the client area?);

  • WM_WINDOWPOSCHANGING returns 0;

  • SetWindowPos has flags SWP_NOCOPYBITS | SWP_DEFERERASE | SWP_NOREDRAW | SWP_NOSENDCHANGING.

Still, the flicker (or the contents move) occurrs when resizing the window. What I want is to:

  • SetWindowPos to new size and position;

  • InvalidateRect (hWnd, NULL, FALSE);

  • UpdateWindow(hWnd);

without any painting, background erasing or content moving until WM_PAINT.

WM_PAINT does:

hDC= BeginPaint (hWnd, &ps);
hMemDC= CreateCompatibleDC (hDC);
hOldBitmap = SelectObject (hMemDC, hNewBitmap);
BitBlt (hDC,...,hMemDC,0,0,SRCCOPY);
SelectObject (hMemDC, hOldBitmap);
DeleteDC (hMemDC);
EndPaint (hWnd, &ps);

Can anyone tell me if/where I make a mistake that causes the old content of the window to be moved?

Hardware etc: Windows 7 on HP Elitebook Core7 64 bits with NVIDIA Quadro K1000m driver 9.18.13.3265 (updated to 341.44).


UPDATE (Jul '17)

I have seen the behavior of the pogram also on another Windows computer (Windows 8/10). It does not seem to be the NVIDIA display driver.

The behavior is the most visible when resizing a window tiled to the centre of the screen (right bottom = w/2, h/2) to the left or left upper corner (0, 0).

I may have problems with the calculations for the WM_NCCALCSIZE message to tell Windows not to do anything. Could anyone give an example calculation for my purpose? See also How do I force windows NOT to redraw anything in my dialog when the user is resizing my dialog?

like image 302
Paul Ogilvie Avatar asked Nov 02 '14 14:11

Paul Ogilvie


People also ask

Why is my computer screen glitching when I move it?

Hardware failure is the likely cause when flicker occurs only when the laptop moves. Most likely, the screen cable is loose or damaged, but the inverter and backlight can also cause this problem.

How do I fix a flickering or flashing window screen?

Screen flickering in Windows is usually caused by display drivers. To update your display driver, you'll need to start your PC in safe mode, uninstall your current display adapter, and then check for driver updates. Start your PC in safe mode, then select and hold (or right-click) Start and select Device Manager.

When I move my mouse My screen flickers Windows 11?

Screen flickering in Windows 11 is usually caused by a display driver issue or incompatible app. To determine whether a display driver or app is causing the problem, check to see if Task Manager flickers.

Why does my screen flicker when I change resolution?

Typically (in Windows) the first flicker happens when the display driver reconfigures the hardware for the new resolution. In many cases the video-chip has to stop displaying. And then, 1 or more display-frames later, start producing output in the new format.


1 Answers

You have an impressive list of anti-flickering tricks :-)

I don't know if this is of importance (since it depends on how your tool windows are created and espacially if they are child windows to a common parent): Try setting window style WS_CLIPCHILDREN in the parent window of the tool windows (if there is one).

If not set the parent window will erase it's (entire) background and then forward the paint messages to the child windows which will cause flickering. If WS_CLIPCHILDREN is set the parent window does nothing to the client area occupied by child windows. As a result the area of child windows isn't drawn twice and there is no chance for flickering.

like image 118
Lukas Thomsen Avatar answered Oct 05 '22 08:10

Lukas Thomsen