右键菜单
<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);
基类 .cppBOOL CViewNormal::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
ProcessNotifyMsg(wParam, lParam, pResult);
return CView::OnNotify(wParam, lParam, pResult);
}
子类.cppBOOL 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;
}
837

被折叠的 条评论
为什么被折叠?



