мерцание виртуальной полосы прокрутки CMFCListctrl - PullRequest
0 голосов
/ 03 мая 2018

Я использую виртуальный список управления.

Я обновляю / загружаю данные в список управления для каждой секунды (непрерывно).

Я использую следующий код:

bool CMyListCtrl::Init(CWnd* pParent)
{
    CRect rectDummy;
    if(!Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_SHOWSELALWAYS|LVS_OWNERDATA, 
        rectDummy, pParent, IDC_LIST1))
        return false;

    #define LVS_EX_DOUBLEBUFFER     0x00010000
    SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_DOUBLEBUFFER);
    InsertColumn(0,_T("#"),LVCFMT_LEFT, 20,1);
    InsertColumn(1,_T("Tag Name"),LVCFMT_LEFT, 100,1);
    InsertColumn(2,_T("Data Type"),LVCFMT_LEFT, 50,1);
    InsertColumn(3,_T("Address/Exp"),LVCFMT_LEFT, 50,1);
    InsertColumn(4,_T("# of Characters"),LVCFMT_LEFT, 110,1);
    InsertColumn(5,_T("Initial Value"),LVCFMT_LEFT, 50,1);
    InsertColumn(6,_T("Retentive Flag"),LVCFMT_LEFT, 50,1);
    InsertColumn(7,_T("PLC/Int/Exp"),LVCFMT_LEFT, 50,1);
    InsertColumn(8,_T("Write Tag"),LVCFMT_LEFT, 50,1);
    return true;
}

void CMyListCtrl::UpdateUI(std::vector<CTagList*>* vpTags)
{
    m_vpTags=vpTags;
    if(m_vpTags==NULL) return;

    if(m_iSortedColumn>-1 && m_vpTags->size()>1)
        std::sort(m_vpTags->begin(), m_vpTags->end(), S_TagComparator(m_iSortedColumn,m_bAscending,this));

    SetItemCountEx(m_vpTags->size(),LVSICF_NOSCROLL|LVSICF_NOINVALIDATEALL);
}

void CMyListCtrl::OnLvnGetdispinfo(NMHDR *pNMHDR, LRESULT *pResult)
{
    NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
    *pResult = 0;

    LV_ITEM* pItem = &(pDispInfo)->item;
    CDrawObjLad* pObj = m_vInss[pItem->iItem];
    //update column text
    if(pItem->mask & LVIF_TEXT){
        CString text;
        switch(pItem->iSubItem){
        case 1: text = CUtils::Format(_T("%d"),pItem->iItem+1);break;
        case 2: text = pObj->GetElementName(); break;
        case 3: text = CUtils::Format(_T("%d"),pObj->m_nRow);break;
        case 4: text = CUtils::Format(_T("%c"),0x40+pObj->m_nCol);break;
        }
        lstrcpyn(pItem->pszText, text, pItem->cchTextMax);
    }
}

Кажется, что вертикальная полоса прокрутки элемента управления списком мигает или движется вверх и вниз. Как этого избежать?

Я пытался ON_WM_ERASEBKGND () в элементе управления списком, но это мне не помогло.

...