RicardoWee
RicardoWee
2016-08-30 13:31

mfc客户区中listctrl刷新数据时数据行数与滚动条位置不符

5

我在mfc里加了个listctrl,用来加载进程信息,信息太多然后自动出现滚动条。

    m_ProcessList.LockWindowUpdate();
    m_ProcessList.SetRedraw(false);
    m_ProcessList.DeleteAllItems();
//进程信息结构体
PROCESSENTRY32 process;
//返回当前进程快照句柄
HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//访问快照中的第一个进程
PROCESS_MEMORY_COUNTERS pmc;
HANDLE process1;
long unsigned int maxMem = 0;
long unsigned int curMem = 0;
CString name,strID,strfID,strTred,strMem;
int i=0;
process.dwSize = sizeof(process);
BOOL bMore = Process32First(hProcess,&process);
while(bMore)
{
    bMore = Process32Next(hProcess,&process);
    maxMem = 0;
    curMem = 0;
    //打开指定ID的进程,返回进程的句柄
    process1 = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,process.th32ProcessID);
    if(GetProcessMemoryInfo(process1,&pmc,sizeof(pmc)))
    {
        //最大内存使用量
        maxMem = pmc.PeakWorkingSetSize/1024;
        //当前内存使用量
        curMem = pmc.WorkingSetSize/1024;
    }
    name = process.szExeFile;       //文件名
    //将double型改成cstring
    strID.Format(L"%5u",process.th32ProcessID);     //进程ID
    strfID.Format(L"%u",process.th32ParentProcessID);       //父进程ID
    strTred.Format(L"%u",process.cntThreads);       //线程数
    if( curMem >= 0 && curMem <= 1024 )
        strMem.Format(L"%dKB",curMem);      //内存数
    else
    {
        curMem = curMem/1024;
        strMem.Format( L"%dMB", curMem );
    }
    m_ProcessList.InsertItem(i,name);
    m_ProcessList.SetItemText(i,1,strID);
    m_ProcessList.SetItemText(i,2,strTred);
    m_ProcessList.SetItemText(i,3,strfID);
    m_ProcessList.SetItemText(i,4,strMem);
    i++;
    CloseHandle(process1);
}
CloseHandle(hProcess);
m_ProcessList.SetRedraw(true); 
//m_ProcessList.RedrawWindow( NULL, NULL, RDW_NOFRAME && RDW_VALIDATE );
m_ProcessList.UnlockWindowUpdate();
这里用这个函数将数据填入listctrl,然后我设了个settimer, 回调函数ontimer每次都回调这个函数以达到刷新数据的要求。为了避免滚动条被一起delete掉,我特意在ontimer里加了

int pos = m_ProcessList.GetScrollPos( 1 );
m_ProcessList.SetScrollPos( 1, pos );
来保证能使滚动条不位移,这时问题来了![图片说明](https://img-ask.csdn.net/upload/201608/30/1472563505_268366.jpg)
![图片说明](https://img-ask.csdn.net/upload/201608/30/1472563514_95489.jpg)
我拖动滚动条到下面,过了取好的时间间隔后,滚动条的位置是没有动,但重新刷新的数据直接填充到了滚动条显示的客户区内,以至于上面出现空白。有什么方法能够让数据从真正的第一行(客户区以外)填充起嘛?或者说让数据与滚动条位置绑定?
  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

1条回答