簡體   English   中英

在樹狀視圖中替換項目時,如何修復油漆偽影?

[英]How to fix paint artifacts when replacing items in Tree View?

我在選項卡控件的內容區域中有一個樹形視圖(樹形視圖是選項卡控件的同級)。 當我刪除樹視圖項目,添加新的樹視圖項目並選擇其中之一時,樹視圖無法正確繪制; 新創建的所選項目上方的所有內容均為灰色。 在刪除和插入項目后,有什么方法可以使樹形視圖正確地繪制所有內容嗎?

更換物品之前更換物品后

觀察:

  • 如果樹視圖項目太少而沒有滾動條出現,則樹視圖看起來不錯。
  • 如果樹視圖旁邊沒有選項卡控件,則樹視圖看起來確定。
  • 如果樹視圖是選項卡控件的子級,則樹形視圖看起來不錯(但Tab鍵無法使用GetNextDlgTabItem / IsDialogMessage在選項卡控件和樹形視圖之間導航)。
  • 如果在插入新節點后未在樹視圖中選擇任何項目,則樹視圖看起來確定。

將項目插入樹中時,我先調用TreeView_InsertItem,再調用TreeView_SelectItem。 完整樣本要點 在示例程序中, Ctrl + R加速器將替換所有樹節點並產生偽像。

您在這里有錯誤:

ACCEL accel[1]***; //change to accel[2]
accel[0].fVirt = FCONTROL | FVIRTKEY;
accel[0].key = 'R';
accel[0].cmd = IDM_REGENERATETREE;
accel[1].fVirt = FCONTROL | FVIRTKEY;
accel[1].key = 'S';
accel[1].cmd = IDM_SELECTRANDOM;
HACCEL haccel = CreateAcceleratorTable(accel, 2);

嘗試保存以前的項目狀態時導致顯示問題。 如果從addTreeItem刪除previousStates ,則不會出現顯示問題。 為了正確保存狀態,您可能需要std :: map和每個樹項的一些用戶標識。 至少您應該使用std :: vector使其易於遵循。

為了獲得更好的視覺效果,可以將TVS_LINESATROOT添加到TreeView,將WS_CLIPCHILDREN添加到主窗口。

編輯:

保存以前的項目狀態不應在addTreeItem完成。 例如,剛插入的新項目還沒有子級,因此無法擴展。 簡化addTreeItem ,如下所示:

HTREEITEM addTreeItem(HWND htree, HTREEITEM par, HTREEITEM after, LPCTSTR str, LPARAM lp) 
{
    TVINSERTSTRUCT tvins;
    tvins.hParent = par;
    tvins.hInsertAfter = after;
    tvins.itemex.mask = TVIF_TEXT | TVIF_PARAM;
    tvins.itemex.pszText = const_cast<LPTSTR>(str);
    tvins.itemex.lParam = lp;
    HTREEITEM node = TreeView_InsertItem(htree, &tvins);
    return node; 
}

要保存以前的項目狀態,每個項目應具有不同的ID。 在本示例中,每個節點的項目名稱都不同,因此我們可以將其用於地圖。 但是,如果這是目錄結構,它將無法正常工作,我們必須使用全路徑而不是節點名稱。

void RootWindow::RegenerateTree()
{
    if (!m_hwndTreeView) return;
    if (!IsWindow(m_hwndTreeView)) return;
    HWND hwnd = m_hwndTreeView;

    //this will stop treeview from updating after every insert
    SetWindowRedraw(hwnd, 0);

    std::map<std::wstring, UINT> state;
    const int maxtext = 260;
    wchar_t buf[maxtext];
    std::wstring selection;

    UINT count = TreeView_GetCount(hwnd);
    if (count)
    {
        for (HTREEITEM item = TreeView_GetRoot(hwnd); item; item = nextItem(hwnd, item))
        {
            TVITEM tv{ 0 };
            tv.mask = TVIF_TEXT | TVIF_STATE;
            tv.stateMask = TVIF_TEXT | TVIF_STATE;
            tv.cchTextMax = maxtext;
            tv.pszText = buf;
            tv.hItem = item;
            if (TreeView_GetItem(hwnd, &tv))
                state[buf] = TreeView_GetItemState(hwnd, item, 
                TVIS_SELECTED | TVIS_EXPANDED);
        }
    }
    TreeView_DeleteAllItems(hwnd);

    addTreeItem...
    addTreeItem...
    addTreeItem...

    //restore previous item state here:
    if (count)
    {
        for (HTREEITEM item = TreeView_GetRoot(hwnd); item; item = nextItem(hwnd, item))
        {
            TVITEM tvitem{ 0 };
            tvitem.hItem = item;
            tvitem.mask = TVIF_TEXT;
            tvitem.cchTextMax = maxtext;
            tvitem.pszText = buf;
            if (TreeView_GetItem(hwnd, &tvitem))
                TreeView_SetItemState(hwnd, item, state[buf], 
                TVIS_SELECTED | TVIS_EXPANDED);
        }
    }

    SetWindowRedraw(hwnd, 1);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM