OK、すべての検索とチェックの結果、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;
}