MFC CListCtrl

列名、行内容的添加、删除。

据列名、行内容长度设置列宽。

排序。

 

提升权限

BOOL CDemoListCtrlApp::EnableDebugPrivilege()
{  
    HANDLE token;  
    
    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&token))  
    {  
  return FALSE;  
    }  
    TOKEN_PRIVILEGES tkp;  
    tkp.PrivilegeCount = 1;  
    ::LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid);  
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
    if(!AdjustTokenPrivileges(token,FALSE,&tkp,sizeof(tkp),NULL,NULL))  
    {  
 return FALSE;  
    }  
    CloseHandle(token);  
    return TRUE;  
} 

 

取进程全路径

BOOL MFCTool::DosPathToNtPath( LPTSTR pszDosPath, LPTSTR pszNtPath )
{
    TCHAR            szDriveStr[500];
    TCHAR            szDrive[3];
    TCHAR            szDevName[100];
    INT                cchDevName;
    INT                i;

    //检查参数
    if(!pszDosPath || !pszNtPath )
        return FALSE;

    //获取本地磁盘字符串
    if(GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr))
    {
        for(i = 0; szDriveStr[i]; i += 4)
        {
            if(!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\")))
                continue;

            szDrive[0] = szDriveStr[i];
            szDrive[1] = szDriveStr[i + 1];
            szDrive[2] = '\0';
            if(!QueryDosDevice(szDrive, szDevName, 100))//查询 Dos 设备名
                return FALSE;

            cchDevName = lstrlen(szDevName);
            if(_tcsnicmp(pszDosPath, szDevName, cchDevName) == 0)//命中
            {
                lstrcpy(pszNtPath, szDrive);//复制驱动器
                lstrcat(pszNtPath, pszDosPath + cchDevName);//复制路径

                return TRUE;
            }           
        }
    }

    lstrcpy(pszNtPath, pszDosPath);

    return FALSE;
}


BOOL MFCTool::GetProcessFullPath( DWORD dwPID, TCHAR pszFullPath[MAX_PATH] )
{
    TCHAR        szImagePath[MAX_PATH];
    HANDLE        hProcess;
    if(!pszFullPath)
        return FALSE;

    pszFullPath[0] = '\0';
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
    if(!hProcess)
        return FALSE;

    if(!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH))
    {
        CloseHandle(hProcess);
        return FALSE;
    }

    if(!DosPathToNtPath(szImagePath, pszFullPath))
    {
        CloseHandle(hProcess);
        return FALSE;
    }

    CloseHandle(hProcess);

    return TRUE;
}

 

显示进程

void CDemoListCtrlDlg::ShowProcess( CListCtrl& listctrl )
{
    //清除所有内容行
    listctrl.DeleteAllItems();

    //清除所有列名
    while (listctrl.DeleteColumn(0))
    {
    }

    //设置显示模式,网格+选中全行
    listctrl.SetExtendedStyle(listctrl.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

    //内容添加结束前停止生绘
    listctrl.SetRedraw(FALSE);

    //添加列名
    listctrl.InsertColumn(0, "PID");
    listctrl.InsertColumn(1, "NAME");
    listctrl.InsertColumn(2, "FULLPATH");

    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE != hSnap)
    {
        PROCESSENTRY32 item;
        item.dwSize = sizeof(item);
        if (Process32First(hSnap, &item))
        {
            CString str;
            int iLine = 0;
            char chPath[MAX_PATH];
            MFCTool mfctool;
            do 
            {
                str.Format("%d", item.th32ProcessID);
                listctrl.InsertItem(iLine, str);

                listctrl.SetItemText(iLine, 1, item.szExeFile);

                memset(chPath, 0, MAX_PATH);
                mfctool.GetProcessFullPath(item.th32ProcessID, chPath);
                str.Format("%s", chPath);
                listctrl.SetItemText(iLine, 2, str);

                iLine++;
            } while (Process32Next(hSnap, &item));
        }

        CloseHandle(hSnap);
        hSnap = INVALID_HANDLE_VALUE;
    }

    //自动变列宽,据字段名&字段值长度
    int iCount = listctrl.GetHeaderCtrl()->GetItemCount();
    for (int i = 0; i < iCount; i++)
    {
        listctrl.SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
    }

    listctrl.SetRedraw(TRUE);
}

 

右键显示菜单

void CDemoListCtrlDlg::OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    
    //弹出菜单
    CPoint pos;
    if (GetCursorPos(&pos))
    {
        CMenu menu;
        //加载菜单资源
        menu.LoadMenu(IDR_MENU1);
        //目标子菜单是菜单资源第0列
        menu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTBUTTON, pos.x, pos.y, this);
    }

    *pResult = 0;
}

 

右键菜单:刷新

添加菜单资源

xxxDlg.h

class CDemoListCtrlDlg : public CDialog
{
//...
 public:
    afx_msg void OnRefreshList1();   
}

xxxDlg.cpp

BEGIN_MESSAGE_MAP(CDemoListCtrlDlg, CDialog)
//...
    ON_COMMAND(ID_REFRESHLIST1, OnRefreshList1)
END_MESSAGE_MAP()

void CDemoListCtrlDlg::OnRefreshList1()
{
    ShowProcess(m_listctrl);
}

 

排序

静态排序函数

响应消息 ON_NOTIFY(NM_CLICK, IDC_LIST1, &CDemoListCtrlDlg::OnNMClickList1)

xxxDlg.h

    static DWORD m_dwSortColumn;
    static BOOL m_bAscending;//Descending/Ascending
    static int CALLBACK CompareList1(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
    afx_msg void OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult);

 

xxxDlg.cpp

int CALLBACK CDemoListCtrlDlg::CompareList1( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort )
{
    CListCtrl* pListCtrl = (CListCtrl*)lParamSort;

    int iCompare = 0; 
    CString strCompare1 = pListCtrl->GetItemText(lParam1, m_dwSortColumn);
    CString strCompare2 = pListCtrl->GetItemText(lParam2, m_dwSortColumn);

    switch (m_dwSortColumn)
    {
    case 0://by id
        iCompare = atof((char*)strCompare1.GetBuffer(0)) <= atof((char*)strCompare2.GetBuffer(0)) ? -1 : 1; 
        break;
    default://by string
        iCompare = strCompare1.CompareNoCase(strCompare2);
        break;
    }

    if(m_bAscending) 
    {
        return iCompare;
    }
    return -iCompare;
}

void CDemoListCtrlDlg::OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    m_dwSortColumn = pNMListView->iSubItem;
    m_bAscending = !m_bAscending;//Descending or Ascending 

    int iCount = m_listctrl.GetItemCount();
    for (int i = 0; i < iCount; i++)  
    {  
        m_listctrl.SetItemData(i, i);  
    }
    m_listctrl.SortItems(CompareList1, (LPARAM)&m_listctrl);

    *pResult = 0;
}

 

选中某行,取各列内容

void CDemoListCtrlDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    
    //selected line
    int iSelectedLine = m_listctrl.GetSelectionMark();
    if (-1 != iSelectedLine)
    {
        CString str = m_listctrl.GetItemText(iSelectedLine, 0) 
            + "|" 
            + m_listctrl.GetItemText(iSelectedLine, 1)
            + "|" 
            + m_listctrl.GetItemText(iSelectedLine, 2);
        //MessageBox(str);
        SetWindowText(str);
    }

    *pResult = 0;
}

 

posted on 2016-10-27 23:00  NoneButNow  阅读(350)  评论(0编辑  收藏  举报

导航