双击更改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
,它在创建对话框时显示ID
、Firstname
和Lastname
。在下面的代码中,我通过获取单击项目的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_MAP
、END_MESSAGE_MAP
)。以上是关于双击更改mfc中列表控件中行的颜色的主要内容,如果未能解决你的问题,请参考以下文章