|
如题,在CDialogEx中创建一个自己的窗口后,自定义了一个继承于CMFCShellListCtrl的新类,具体如下:
- BEGIN_MESSAGE_MAP(CustomShellListCtrl, CMFCShellListCtrl)
- ON_NOTIFY(NM_RCLICK, IDC_MFCSHELLLIST1, &CustomShellListCtrl::OnNMRClick)
- //ON_NOTIFY(NM_CUSTOMDRAW, IDC_MFCSHELLLIST1, &CustomShellListCtrl::OnNMRClickOnCustomdrawMyList)
- END_MESSAGE_MAP()
- CustomShellListCtrl::CustomShellListCtrl()
- {
-
- }
- CustomShellListCtrl::~CustomShellListCtrl()
- {
- }
- void CustomShellListCtrl::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
- {
- LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
- // TODO: 在此添加控件通知处理程序代码
- *pResult = 0;
- NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
- if (pNMListView->iItem != -1)
- {
- DWORD dwPos = GetMessagePos();
- CPoint point(LOWORD(dwPos), HIWORD(dwPos));
- CMenu menu;
- //添加线程操作
- VERIFY(menu.LoadMenu(IDR_MENU1)); //这里是我们在1中定义的MENU的文件名称
- CMenu* popup = menu.GetSubMenu(0);
- ASSERT(popup != NULL);
- popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
- //下面的两行代码主要是为了后面的操作为准备的
- //获取列表视图控件中第一个被选择项的位置
- POSITION m_pstion = GetFirstSelectedItemPosition();
- //该函数获取由pos指定的列表项的索引,然后将pos设置为下一个位置的POSITION值
- int nIndex = GetNextSelectedItem(m_pstion);
- CString str;
- str.Format(L" m_nIndex = %d", nIndex);
- MessageBox(str, str, 0);
- }
- }
复制代码
然后,在对话框的头文件里添加CustomShellListCtrl m_mfcshelllist;
在OnInitDialog里对m_mfcshelltree做样式设置,具体如下:
- ListView_SetExtendedListViewStyle(m_mfcshelllist.m_hWnd, m_mfcshelllist.GetStyle() & ~LVS_EX_GRIDLINES);
- m_mfcshelllist.SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
复制代码
如果去掉网格线,然后设置样式可选中整行,这样做,结果无法选中整行,只能选第一列。
如果把ListView_SetExtendedListViewStyle(m_mfcshelllist.m_hWnd, m_mfcshelllist.GetStyle() & ~LVS_EX_GRIDLINES);
m_mfcshelllist.SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);这两句代码倒过来,他又可以选中整行,但无法去掉网格线。各位大佬,请问有没有办法既能去掉网格线,又能选整行的呢?
|
上一篇: 关于SDI重绘标题栏、菜单栏、工具栏等。下一篇: 重写CDockablePane类设置样式后,左侧无法拉伸
|