双击更改mfc中列表控件中行的颜色

Posted

技术标签:

【中文标题】双击更改mfc中列表控件中行的颜色【英文标题】:Changing the color of a row in list control in mfc on double click 【发布时间】:2018-10-06 07:24:30 【问题描述】:

我有一个名为m_listCtrl 的列表控件CListCtrl,它在创建对话框时显示IDFirstnameLastname。在下面的代码中,我通过获取单击项目的position 并更改该行第一列的值来处理double click

//This is in the message map and IDC_LISTNAMES is the list control
ON_NOTIFY(NM_DBLCLK, IDC_LISTNAMES,  OnDoubleClick)


void CSqlMfcTestDlg::OnDoubleClick(NMHDR* pNMHDR, LRESULT* pResult) 


  POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
  if (pos == NULL)
  
    TRACE(_T("No items were selected!\n"));
  
  else
  
    while (pos)
    
        int nItem = m_listCtrl.GetNextSelectedItem(pos);

        itemClicked = nItem;
        CString idString = m_listCtrl.GetItemText(nItem, 0);
        CString textString = m_listCtrl.GetItemText(nItem, 1);
        MessageBox(L"Item Clicked is : " + textString);
        m_listCtrl.SetItemText(nItem,0, idString+L"(Clicked)");


    
  


我想添加一条语句来更改该行的颜色,而不是 m_listCtrl.SetItemText(nItem,0, idString+L"(Clicked)");

【问题讨论】:

您的代码说 `OnDoubleClick()' 是一个对话框处理程序。在 ListCtrl 对象上尝试一下。 我有一个对话框,其中有一个列表控件,我已将m_listCtrl 样式设置为ListView_SetExtendedListViewStyle(m_listCtrl, LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); 代码工作正常,但不是更改列表控件中的值,而是我想找到一种改变该行颜色的方法 现在将 m_listCtrl 声明为 MyListCtrl,其中 MyListCtrl 是从 CListctrl 派生的类。之后为 MyListCtrl 添加新的消息处理程序。您当前的代码只会拦截对话框控件上的双击。 如果选中,该行会改变颜色。在OnInitDialog 中添加m_listCtrl.ModifyStyle(0, LVS_SHOWSELALWAYS);,以便选择始终可见。还是要改成自定义颜色? 上下文是,在单击列表控件中的项目时,我想添加一个注释并显示该注释已添加,我想更改该行的颜色。从某种意义上说,它应该持续存在,当我重新打开应用程序时,我仍然希望带有注释的行是我设置的颜色。我试着在网上找这个,但没有找到太多 【参考方案1】:

看到这个sn-p:

class MyListCtrl: public CListCtrl

   private:
      int m_row;
   public:
      afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult); // write your custom code in the definition
      afx void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
; 

class CSqlMfcTestDlg: public CDialogEx 

   private:
      MyListCtrl m_listCtrl;    
;

定义(未测试):

void MyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)

  LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
  int iRow = lplvcd->nmcd.dwItemSpec;

  switch(lplvcd->nmcd.dwDrawStage)
  
     case CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:
    
         if(iRow == m_row)
         lplvcd->clrTextBk =  RGB(0,0,255);
    
  

void MyListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)

    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    m_row = GetSelectionMark();
    RedrawItems(m_row, m_row);

【讨论】:

您可以按照问题中显示的方式捕获 listview 的双击消息。如果您在CListCtrl 中执行此操作,则需要ON_NOTIFY_REFLECT 消息处理程序。 @BarmakShemirani:注意,谢谢。 OP想要改变选中行的颜色,所以自定义绘制应该更容易。 应显示所需的消息映射条目(BEGIN_MESSAGE_MAPEND_MESSAGE_MAP)。

以上是关于双击更改mfc中列表控件中行的颜色的主要内容,如果未能解决你的问题,请参考以下文章

mfc怎么修改静态文本控件文字颜色

使列表控件中的单个项目可编辑(C++、MFC)

在 MFC 控件中更改背景和标题的颜色

更改 SysLink 控件的背景颜色 - MFC

MFC 中,按钮和其他(比如:图片框、列表框)控件怎么响应鼠标移动消息?

即使焦点在另一个控件上,如何更改列表视图选定的行背景颜色?