MFC中点击ListControl时,第一次点击不响应NM_CLICK消息,第二次才响应的问题

这个问题困扰了我三天,先描述一下问题所在。

我创建了一个ListControl,并将这个控件放在了一个对话框上面。具体的创建代码如下:

m_meshlistctrl.Create(WS_CHILD|WS_BORDER|LVS_REPORT|LVS_SINGLESELC,Rect(1,1,300,400), this, IDC_LIST1);    //  IDC_LIST1是我绑定的ListControl资源

m_meshlistctrl.SetWindowPos(this,1,1,300,tabRect.bottom/2-1,SWP_SHOWWINDOW |SWP_NOACTIVATE | SWP_NOZORDER );

m_meshlistctrl.ShowWindow(SW_SHOW);

DWORDdwExStyle = GetExtendedStyle();

        SetExtendedStyle( dwExStyle |LVS_EX_ONECLICKACTIVATE| LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES ); 

我创建完这个ListControl以后 想通过NM_CLICK消息来响应左击ListControl时产生的操作。添加消息响应函数如下:

afx_msg void OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult);//在头文件中添加

ON_NOTIFY(NM_CLICK, IDC_LIST1, &CSimMeshProDlg::OnNMClickList1)   //关联处理单击左键函数

然后问题出现了,当我在ListControl中插入几列数据时,点击ListControl中非数据处时,会默认选中几列数据为蓝色高亮显示。而我并没有设置其为高亮状态(此问题原因已经发现:我在插入数据时这样做的:m_meshlistctrl.InsertItem(LVIF_TEXT | LVIF_STATE, i,"", (i % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0);//导致偶数行默认为选中状态)。并且第一次点击ListControl控件非数据部分时,NM_CLICK消息不会得到触发。而当我第二次点击ListControl控件非数据部位时,NM_CLICK消息才会得到触发。我纠结了两三天,这个问题还是没得到解决,但是由于项目需要,我将ListControl的第一行数据设置为默认选中状态,方法如下:

m_meshlistctrl.SetItemState(0, LVIS_SELECTED|LVIS_FOCUSED,/*LVIS_DROPHILITED|*/LVIS_SELECTED|LVIS_FOCUSED);

这样,尽管点击ListControl非数据部位时,仍需要两次才能触发NM_CLICK消息,但是可以将蓝色高亮显示在第一行。勉强算达到要求。MFC博大精深,还需耐住性子,好好研究。在这里记录一下,有大神如果能够帮我解惑,甚为感激。

下面贴出ListControl的一些常规使用的风格:

         一:设置ListControl的风格

 LONG lStyle;
       lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
      lStyle &= ~LVS_TYPEMASK; //清除显示方式位
      lStyle |= LVS_REPORT; //设置style
       SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
 
      DWORD dwStyle = m_list.GetExtendedStyle();
       dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
       dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
       dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
       m_list.SetExtendedStyle(dwStyle); //设置扩展风格
       注:listview的style请查阅msdn
    

二:选中和取消选中一行

     int nIndex = 0;
     //选中
     m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
     //取消选中
     m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);

三:失去焦点后仍然高亮显示一行或熄灭一行

//获得选中行的索引
m_SecCount = (int)m_lc.GetFirstSelectedItemPosition()-1;
//设置选中行一直高亮显示
m_lc.SetItemState(m_SecCount,LVIS_DROPHILITED,LVIF_STATE);
//取消在失去高亮时候选中行的高亮显示
m_lc.SetItemState(m_SecCount,FALSE,LVIF_STATE);

具体更详细的可以参考:http://blog.sina.com.cn/s/blog_635ff3050101luqx.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值