2012-06-08 194 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