【问题标题】:Changing the color of a row in list control in mfc on double click双击更改mfc中列表控件中行的颜色
【发布时间】: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);,以便选择始终可见。还是要改成自定义颜色?
  • 上下文是,在单击列表控件中的项目时,我想添加一个注释并显示该注释已添加,我想更改该行的颜色。从某种意义上说,它应该持续存在,当我重新打开应用程序时,我仍然希望带有注释的行是我设置的颜色。我试着在网上找这个,但没有找到太多

标签: c++ visual-c++ mfc clistctrl


【解决方案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)。
猜你喜欢
  • 2015-04-30
  • 2020-06-22
  • 1970-01-01
  • 2015-12-31
  • 2015-10-10
  • 2013-05-09
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多