VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 167|回复: 0

自定义新的CMFCShellListCtrl

[复制链接]
89_avatar_middle
最佳答案
2 
在线会员 发表于 2022-4-12 15:58:40 | 显示全部楼层 |阅读模式
如题,在CDialogEx中创建一个自己的窗口后,自定义了一个继承于CMFCShellListCtrl的新类,具体如下:
  1. BEGIN_MESSAGE_MAP(CustomShellListCtrl, CMFCShellListCtrl)
  2.         ON_NOTIFY(NM_RCLICK, IDC_MFCSHELLLIST1, &CustomShellListCtrl::OnNMRClick)
  3.         //ON_NOTIFY(NM_CUSTOMDRAW, IDC_MFCSHELLLIST1, &CustomShellListCtrl::OnNMRClickOnCustomdrawMyList)
  4. END_MESSAGE_MAP()

  5. CustomShellListCtrl::CustomShellListCtrl()
  6. {
  7.        
  8. }

  9. CustomShellListCtrl::~CustomShellListCtrl()
  10. {

  11. }


  12. void CustomShellListCtrl::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
  13. {
  14.         LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  15.         // TODO:  在此添加控件通知处理程序代码
  16.         *pResult = 0;

  17.         NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  18.         if (pNMListView->iItem != -1)
  19.         {
  20.                 DWORD dwPos = GetMessagePos();
  21.                 CPoint point(LOWORD(dwPos), HIWORD(dwPos));
  22.                 CMenu menu;
  23.                 //添加线程操作
  24.                 VERIFY(menu.LoadMenu(IDR_MENU1));                        //这里是我们在1中定义的MENU的文件名称
  25.                 CMenu* popup = menu.GetSubMenu(0);
  26.                 ASSERT(popup != NULL);
  27.                 popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);

  28.                 //下面的两行代码主要是为了后面的操作为准备的
  29.                 //获取列表视图控件中第一个被选择项的位置  
  30.                 POSITION m_pstion = GetFirstSelectedItemPosition();
  31.                 //该函数获取由pos指定的列表项的索引,然后将pos设置为下一个位置的POSITION值
  32.                 int nIndex = GetNextSelectedItem(m_pstion);

  33.                 CString str;
  34.                 str.Format(L" m_nIndex = %d", nIndex);
  35.                 MessageBox(str, str, 0);
  36.         }

  37. }
复制代码

然后,在对话框的头文件里添加CustomShellListCtrl m_mfcshelllist;
在OnInitDialog里对m_mfcshelltree做样式设置,具体如下:
  1.         ListView_SetExtendedListViewStyle(m_mfcshelllist.m_hWnd, m_mfcshelllist.GetStyle() & ~LVS_EX_GRIDLINES);
  2.         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类设置样式后,左侧无法拉伸
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-10-5 03:12

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表