1

我有简单的 win32 应用程序(不是对话框)和这个应用程序中的树视图。一切正常,但如果我在树视图中选择了项目,并且我最小化并恢复应用程序,则所选项目会将蓝色高亮颜色更改为灰色。 如何在不使用自定义绘图的情况下纠正此问题? 如果我在对话框中有树视图,则所选项目始终为蓝色。

代码:

HWND g_hTree;

// Forward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInst;

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: Place code here.
    MSG Msg;

    MyRegisterClass(hInstance);

    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return (int) Msg.wParam;
}


ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TREEVIEWTEST));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_TREEVIEWTEST);
    wcex.lpszClassName  = L"TreeViewTestClass";
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   InitCommonControls();

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(L"TreeViewTestClass", L"Tree View Test", WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

void AddItems();

#define TVS_STYLES  (TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_INFOTIP | TVS_TRACKSELECT | WS_VSCROLL | WS_TABSTOP)
#define ID_TREEVIEW 505

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_CREATE:
        {
            g_hTree = CreateWindowEx(0, WC_TREEVIEWW, L"Test_Tree_View", WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_STYLES, 10, 10, 240, 480, hWnd, (HMENU)ID_TREEVIEW, NULL, NULL);
            AddItems();
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

void AddItems()
{
    TVITEM tvi;
    HTREEITEM htSelected;
    TVINSERTSTRUCT tvinsert;   // struct to config out tree control
    HTREEITEM htParent;           // Tree item handle
    HTREEITEM htBefore;           // .......
    HTREEITEM htRoot;  

    tvinsert.hParent=NULL;          // top most level no need handle
    tvinsert.hInsertAfter=TVI_ROOT; // work as root level
    tvinsert.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
    tvinsert.item.pszText=L"Parent1";
    tvinsert.item.iImage=0;
    tvinsert.item.iSelectedImage=1;

    htParent = TreeView_InsertItem(g_hTree, &tvinsert);

    htRoot = htParent;
    htBefore = htParent;

    tvinsert.hParent=htParent;         // handle of the above data
    tvinsert.hInsertAfter=TVI_LAST;  // below parent
    tvinsert.item.pszText=L"Child 1";

    htParent = TreeView_InsertItem(g_hTree, &tvinsert);

    tvinsert.hParent=htParent;
    tvinsert.item.pszText=L"Child Of Child 1";

    htParent = TreeView_InsertItem(g_hTree, &tvinsert);

    tvinsert.hParent=htBefore;         // handle of the above data
    tvinsert.hInsertAfter=TVI_LAST;  // below parent
    tvinsert.item.pszText=L"Child 2";

    htParent = TreeView_InsertItem(g_hTree, &tvinsert);

    tvinsert.hParent=NULL;          // top most level no need handle
    tvinsert.hInsertAfter=TVI_LAST; // work as root level
    tvinsert.item.pszText=L"Parent2";

    htParent = TreeView_InsertItem(g_hTree, &tvinsert);

}
4

1 回答 1

3

当窗口最小化时,您的树视图控件似乎失去了焦点。您可以尝试处理WM_ACTIVATE和使用SetFocus手动将焦点设置到树视图控件。

于 2012-07-14T08:45:25.237 回答