好的,经过所有搜索和检查后,我发现 LockUpdateWindow 是个坏主意 - 例如参见 Raimond Chen OldNewThing的文章。但即使实现 SetRedrawWindow 的想法也不是那么简单——因为我所拥有的只是从主窗口的 IConsole2* pConsole->GetMainWindow() HWND 处理程序收到的。通过将其设置为 SetRedraw = FALSE,它以非常奇怪的方式消失了。尽管为了使该过程仅针对 TreeView 而不是针对整个应用程序(我们的左面板)运行,但我运行了
EnumChildWindows(hWnd, SetChildRedraw, FALSE); //stopping redraw
//... here you do your operations
EnumChildWindows(hWnd, SetChildRedraw, TRUE); //restarting redraw
其中 SetChildRedraw 回调以下一种方式定义:
#define DECLARE_STRING(str) TCHAR str[MAX_PATH]; ZeroMemory(str, sizeof(str));
BOOL CALLBACK SetChildRedraw(HWND hwndChild, LPARAM lParam)
{
RECT rcChildRect; ZeroMemory(&rcChildRect, sizeof(rcChildRect));
DECLARE_STRING(sText)
GetClassName(hwndChild, sText, MAX_PATH);
if (wcsstr(sText, L"SysTreeView32") != NULL)
{
SetWindowRedraw(hwndChild, lParam);
if (lParam == TRUE)
{
GetWindowRect(hwndChild, &rcChildRect);
InvalidateRect(hwndChild, &rcChildRect, TRUE);
}
}
return TRUE;
}