我在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)
我拖动滚动条到下面,过了取好的时间间隔后,滚动条的位置是没有动,但重新刷新的数据直接填充到了滚动条显示的客户区内,以至于上面出现空白。有什么方法能够让数据从真正的第一行(客户区以外)填充起嘛?或者说让数据与滚动条位置绑定?