整理: CListCtrl基本操作

右键菜单

<2011_0217>

ListCtrl的初始化

插入数据


插入题头的简洁方法

将题头定义成配置数组, 便于维护

typedef struct _tag_list_ctrl_title
{
    wchar_t szColName[MAX_PATH]; ///< 列名称
    int     iColWidth; ///< 列宽度
    int     iFormat; ///< 对齐方式

    _tag_list_ctrl_title(wchar_t * pcColName, int iColWidth)
    {
        _tcscpy_s(szColName, SIZEOF_WCHAR(this->szColName), pcColName);
        this->iColWidth = iColWidth;

        iFormat = LVCFMT_LEFT;
    }
}TAG_LIST_CTRL_TITLE, *PTAG_LIST_CTRL_TITLE;

/*
[2013-08-31 17:13:07] dwCntProcesses = 0x6D
[2013-08-31 17:13:07] 
Process nIndex[64]
dwPID [5476]
PE OS [X86]
szName [nusb3mon.exe]
szPathName [C:\Program Files (x86)\Renesas Electronics\USB 3.0 Host Controller Driver\Application\nusb3mon.exe]
SizeOfImage [0x1C000]
EntryPoint [0x004034CE]
lpBaseOfDll [0x00400000]
*/
TAG_LIST_CTRL_TITLE g_ArrConfigProcessList[] = 
{
    TAG_LIST_CTRL_TITLE(_T("序号"), 80),
    TAG_LIST_CTRL_TITLE(_T("枚举索引"), 100),
    TAG_LIST_CTRL_TITLE(_T("进程ID"), 100),
    TAG_LIST_CTRL_TITLE(_T("PE平台"), 100),
    TAG_LIST_CTRL_TITLE(_T("进程名称"), 200),
    TAG_LIST_CTRL_TITLE(_T("映像容量"), 100),
    TAG_LIST_CTRL_TITLE(_T("基地址"), 100),
    TAG_LIST_CTRL_TITLE(_T("入口点"), 100),
    TAG_LIST_CTRL_TITLE(_T("进程全路径"), 600),
};

int CViewPE::CtrlInit()
{
    int     iRc = 0;
    DWORD   dwStyle =   0;

    size_t  nIndex = 0;
    size_t  nSize = 0;

    iRc = CViewNormal::CtrlInit();
    if (0 != iRc)
        return iRc;

    dwStyle = WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL | ES_AUTOHSCROLL |
        ES_AUTOHSCROLL | ES_MULTILINE | WS_HSCROLL | WS_VSCROLL;

    if (!m_ProcessList.Create( dwStyle,
        CRect(0,0,0,0),
        this,
        AFX_IDW_PANE_FIRST))
    {
        TRACE0("Failed to create CListCtrl window\n");
        return -1;
    }

    /// 禁止自画
    m_ProcessList.SetRedraw(FALSE);

    m_ProcessList.ModifyStyle(
        LVS_ICON | LVS_LIST | LVS_REPORT | LVS_SMALLICON ,
        0);
    m_ProcessList.ModifyStyle(0, LVS_REPORT);
    m_ProcessList.SetExtendedStyle(LVS_EX_GRIDLINES);
    
    dwStyle = m_ProcessList.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT;
    m_ProcessList.SetExtendedStyle(dwStyle);

    /// 插入题头
    nSize = sizeof(g_ArrConfigProcessList) 
        / sizeof(TAG_LIST_CTRL_TITLE);

    for (nIndex = 0; nIndex < nSize; nIndex++)
    {
        m_ProcessList.InsertColumn(
            nIndex, 
            g_ArrConfigProcessList[nIndex].szColName, 
            g_ArrConfigProcessList[nIndex].iFormat, 
            g_ArrConfigProcessList[nIndex].iColWidth);
    }

    /// 恢复自画
    m_ProcessList.SetRedraw(TRUE);

    return 0;
}




<2011_0410>

CheckBox

选中CheckBox时,也选中该项. 默认处理是不选择该项的,只是选中CheckBox

 

<2013_0901>

在OnNotify中判断右击消息

基类 .h
protected:
    DECLARE_MESSAGE_MAP()

public:
    virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
    virtual BOOL ProcessNotifyMsg(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
基类 .cpp
BOOL CViewNormal::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    ProcessNotifyMsg(wParam, lParam, pResult);
    return CView::OnNotify(wParam, lParam, pResult);
}
子类.cpp
BOOL CViewPE::ProcessNotifyMsg(
    WPARAM wParam, 
    LPARAM lParam, 
    LRESULT* pResult)
{
    /// http://support.microsoft.com/kb/125694/en-us
    /// How To Find Out Which Listview Column Was Right-Clicked

    BOOL            bRc = FALSE;  
    UINT            uMessage = 0;
    MSGFILTER *     lpMsgFilter = (MSGFILTER *)lParam; 
    LPNMHDR         lpNmhdr = (LPNMHDR)lParam;
    CPoint          point;
    CMenu           menu;
    CMenu *         pMenuPopup = NULL;

    bRc = CViewNormal::ProcessNotifyMsg(wParam, lParam, pResult);
    if (bRc)
        return bRc;

    if (lpNmhdr->code == NM_RCLICK)
    {
         if (CTRL_ID_LIST_CTRL == lpNmhdr->idFrom)
         {
             /// View中的ProcessList, 右键按下, 准备弹出菜单
             ::GetCursorPos(&point);
             menu.LoadMenu(IDR_MENU_R_PROCESS_LIST);    ///< 进程列表菜单

             pMenuPopup = menu.GetSubMenu(0);
             ASSERT(NULL != pMenuPopup);

             uMessage = pMenuPopup->TrackPopupMenu(
                 TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD,
                 point.x,
                 point.y, 
                 this);

             pMenuPopup->DestroyMenu(); 
             bRc = PostMessage(uMessage, 0, 0);

             TRACE(L"<< %s = PostMessage(0x%X, 0, 0)\r\n",
                 bRc ? L"TRUE" : L"FALSE",
                 uMessage);

             *pResult = TRUE; ///< 已经处理
             bRc = TRUE;
         }
    }

    return bRc;
}





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值