2012-06-08 148 views
0

我的应用程序是注入第三方GUI应用程序的dll。有DLL创建子窗口包含应用程序的主窗口上的少数控件。问题是当主窗口重新绘制时,我的窗口及其控件闪烁。我已经阅读了许多关于类似问题的文章,但无法解决它。下面是一些代码子窗口闪烁

hwndContainer = CreateWindowEx(WS_EX_TOPMOST, PANEL_CLASS_NAME, "", WS_CHILD | WS_VISIBLE, 0, 0, width, height, hwnd, 0, g_hInstance, cd); 
CreateWindowEx(WS_EX_TOPMOST, "button", "Click me", WS_CHILD | WS_VISIBLE | WS_TABSTOP, x, y, w, h, hwndContainer, 0, 0, 0); 

... 

case WM_PAINT: 
    PAINTSTRUCT ps; 
    HDC hdc = BeginPaint(hwndPanel, &ps); 
    RECT r; 
    GetClientRect(hwndPanel, &r); 

    SelectObject(hdc, hpenBorder); 
    SelectObject(hdc, GetStockObject(NULL_BRUSH)); 

    RoundRect(hdc, 0, 0, r.right, r.bottom, 5, 5); 

    EndPaint(hwndPanel, &ps); 
    return 0; 

我尝试添加WS_CLIPCHILDREN主窗口风格,处理WM_PAINT主窗口等有什么想法吗?

+0

为了响应'WM_ERASEBKGND',你的容器窗口是否擦除其背景?这是闪烁的常见原因。 – arx

+0

另一个想法。如果在每次背景擦除和上色之前和之后添加一个很短的延迟时间(例如'睡眠(500);'),您通常可以确切地看到正在发生的画面以及闪烁的来源。 – arx

+0

您的CreateWindow是否发生在主UI线程的另一个线程上? Win32通常不会这样。 – Deanna

回答

0

您可能会给WS_CLIPSIBLINGS一个尝试......我已经很长时间了,因为我直接对窗口样式做了任何事情,但我似乎记得这种样式需要帮助减少非顶级窗口中的重绘闪烁。祝你好运。

+0

另外,WS_CLIPCHILDREN。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx – Dan