list control失去焦点后,如何让被选定的行仍然高亮度显示? 如题,默认情况下list control失去焦点后,其中被选定的行的蓝色标记就消失了,设置ShowSelectionAlways属性后,蓝色标记变成灰色,我现在想让被选定的行在list control控件失去焦点后,仍然蓝色高亮度显示,怎么实现?各位大侠,帮帮忙吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 增加一个变量保存你选中的行m,然后当你判断到失去焦点的时候,然后调用m_ListACInfo.SetItemState(m, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED); 那其他控件不是得不到焦点了吗,我在edit中输入数据怎么弄,这样不行的 list Control Report风格试了一下 没有你说的问题啊 SetItemState任意个都可以设置高粱,和焦点关系不打 你在对话框上放一个list Control在放一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了 网上搜了一段重绘代码,但是只对没有被选定的行起作用,对选定地行不起作用void SocketSetDlg::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult){ NMLVCUSTOMDRAW *pLVCD = reinterpret_cast <NMLVCUSTOMDRAW*>(pNMHDR); *pResult = 0; COLORREF crText, crBkgnd; switch(pLVCD-> nmcd.dwDrawStage) { case CDDS_PREPAINT: *pResult = CDRF_NOTIFYITEMDRAW;// ask for item otifications. break; case CDDS_ITEMPREPAINT: *pResult=CDRF_NOTIFYSUBITEMDRAW; break; case CDDS_ITEMPREPAINT|CDDS_SUBITEM: { int nItem = static_cast<int>(pLVCD-> nmcd.dwItemSpec);// nItem表示item的index if(nItem == num)// 这里加入判断是否被选中的代码 { crText = RGB(255, 255, 0); crBkgnd = RGB(111, 111, 111); // cr1和cr2分别为高亮显示时的文本和背景色,自己查一下 } else { crText = RGB(255, 255, 0); crBkgnd = RGB(111, 0, 111); } pLVCD->clrText = crText; pLVCD->clrTextBk = crBkgnd; *pResult = CDRF_DODEFAULT; break; } default: *pResult = CDRF_DODEFAULT; } } Always show Selection = true呢 调试到pLVCD->clrTextBk = crBkgnd;看看值是多少 *pResult = CDRF_DODEFAULT; 后边加InvalidateRect(NULL); 试试 //只能用于一行,多行的话你改改void CtestDlg::OnNMKillfocusList(NMHDR *pNMHDR, LRESULT *pResult){ // TODO: 在此添加控件通知处理程序代码 i = m_DownLogListCtrl.GetSelectionMark(); m_DownLogListCtrl.SetItemState(i, LVIS_DROPHILITED, LVIS_DROPHILITED); *pResult = 0;}void CtestDlg::OnNMSetfocusList(NMHDR *pNMHDR, LRESULT *pResult){ // TODO: 在此添加控件通知处理程序代码 //UINT nState=m_DownLogListCtrl.GetItemState(i,LVIF_STATE); //nState&=!nState; m_DownLogListCtrl.SetItemState(i, FALSE, LVIF_STATE); *pResult = 0;} if ((lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED)) //ODS_CHECKED ODS_SELECTED { dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); dc.FillSolidRect(&lpDrawItemStruct->rcItem, ::GetSysColor(COLOR_HIGHLIGHT)); //CString str; //str.Format("%d",lpDrawItemStruct->itemID); //MessageBox(str); } lpDrawItemStruct,dc是什么,怎么定义?代码加在哪? 不会吧,我刚写的。OnNMKillfocusList是clistctrl的控件时间,不是对话框的,i是全局变量 我是按你说的做的,你在你的对话框上再放一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了,你看看是不是这样 不是,焦点在edit的时候也可以.int i[100] 是全局变量void CtestDlg::OnNMKillfocusList(NMHDR *pNMHDR, LRESULT *pResult){ // TODO: 在此添加控件通知处理程序代码 POSITION pos = m_DownLogListCtrl.GetFirstSelectedItemPosition(); memset(i, -1, 100); int nCount = 0; while(pos != NULL) { i[nCount] = m_DownLogListCtrl.GetNextSelectedItem(pos); //i = m_DownLogListCtrl.GetSelectionMark(); m_DownLogListCtrl.SetItemState(i[nCount], LVIS_DROPHILITED, LVIS_DROPHILITED); nCount++; } *pResult = 0;}void CtestDlg::OnNMSetfocusList(NMHDR *pNMHDR, LRESULT *pResult){ // TODO: 在此添加控件通知处理程序代码 POSITION pos = m_DownLogListCtrl.GetFirstSelectedItemPosition(); int nCount = 0; while(i[nCount] != -1) { m_DownLogListCtrl.SetItemState(i[nCount], FALSE, LVIF_STATE); *pResult = 0; nCount++; }} 不管焦点在哪里,clistctrl里面选择的永远是蓝色高亮状态 这个是会变灰的,我弄过if(nItem == num)// 这里加入判断是否被选中的代码 { crText = RGB(255, 255, 0); crBkgnd = RGB(111, 111, 111); // cr1和cr2分别为高亮显示时的文本和背景色,自己查一下 } else { crText = RGB(255, 255, 0); crBkgnd = RGB(111, 0, 111); }这段代码 加上MESSAGEBOX试试 看看你有没有进入选中绘图的情况。没有的话说明你条件就没设置对 to aizeng还是不行啊,还是一样的,你这样试了吗?在对话框上放一个list Control和一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了,我要解决的是:点击edit进行输入时,list Control中的行不变灰,仍然高亮度显示 在对话框上放一个list Control和一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了你的list Control是Report吗 要不你把你的程序发我看看[email protected] 我在公司,只能上csdn等网站。 void CCListExDlg::OnNMKillfocusList1(NMHDR *pNMHDR, LRESULT *pResult){ for (int i = 0;i<m_List.GetItemCount();i++) { if (m_List.GetItemState(i,LVIS_SELECTED) == LVIS_SELECTED) { m_List.SetItemState(i, LVIS_DROPHILITED, LVIS_DROPHILITED); m_Count = i; return; } } *pResult = 0;}void CCListExDlg::OnNMSetfocusList1(NMHDR *pNMHDR, LRESULT *pResult){m_List.SetItemState(m_Count, FALSE, LVIF_STATE); *pResult = 0;}int m_Count; 全局变量 问题解决了谢谢xianglitian(向立天)和hezhe1008(妖孽)两位大侠xianglitian(向立天)的效果比hezhe1008(妖孽)的效果好,所以我决定给xianglitian(向立天)200分hezhe1008(妖孽)100分xianglitian(向立天)大侠,你到我另一个帖子中冒个泡,我再给你100分 MFC画图问题 对已编好的C写的程序,利用VC做个界面,有输入输出功能 扇形区域怎么填充上颜色? 调整了一下界面导致debug版本与release版本不同表现 私企还是国企? 如何使按钮自动按下及弹起?救急........... vc7怎么用向导给工具栏上的按钮添加消息响应? 继承CWnd的类为什么可以使用!运算符? ADO连接SQL erver问题 打印预览的问题 判断不规则曲线是否相交 C++bt客户端源代码运行时显示无法启动程序,计算机丢失DSPDLL.dll,请重新安装程序
m_ListACInfo.SetItemState(m, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED);
{
NMLVCUSTOMDRAW *pLVCD = reinterpret_cast <NMLVCUSTOMDRAW*>(pNMHDR);
*pResult = 0; COLORREF crText, crBkgnd;
switch(pLVCD-> nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;// ask for item otifications.
break; case CDDS_ITEMPREPAINT:
*pResult=CDRF_NOTIFYSUBITEMDRAW;
break; case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
{
int nItem = static_cast<int>(pLVCD-> nmcd.dwItemSpec);// nItem表示item的index
if(nItem == num)// 这里加入判断是否被选中的代码
{
crText = RGB(255, 255, 0);
crBkgnd = RGB(111, 111, 111); // cr1和cr2分别为高亮显示时的文本和背景色,自己查一下
}
else
{
crText = RGB(255, 255, 0);
crBkgnd = RGB(111, 0, 111);
}
pLVCD->clrText = crText;
pLVCD->clrTextBk = crBkgnd;
*pResult = CDRF_DODEFAULT;
break;
}
default:
*pResult = CDRF_DODEFAULT;
}
}
看看值是多少
InvalidateRect(NULL); 试试
//只能用于一行,多行的话你改改
void CtestDlg::OnNMKillfocusList(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
i = m_DownLogListCtrl.GetSelectionMark();
m_DownLogListCtrl.SetItemState(i, LVIS_DROPHILITED, LVIS_DROPHILITED); *pResult = 0;
}void CtestDlg::OnNMSetfocusList(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
//UINT nState=m_DownLogListCtrl.GetItemState(i,LVIF_STATE);
//nState&=!nState;
m_DownLogListCtrl.SetItemState(i, FALSE, LVIF_STATE);
*pResult = 0;
}
if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED)) //ODS_CHECKED ODS_SELECTED
{
dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
dc.FillSolidRect(&lpDrawItemStruct->rcItem,
::GetSysColor(COLOR_HIGHLIGHT));
//CString str;
//str.Format("%d",lpDrawItemStruct->itemID);
//MessageBox(str);
}
我是按你说的做的,你在你的对话框上再放一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了,你看看是不是这样
int i[100] 是全局变量void CtestDlg::OnNMKillfocusList(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
POSITION pos = m_DownLogListCtrl.GetFirstSelectedItemPosition();
memset(i, -1, 100);
int nCount = 0;
while(pos != NULL)
{
i[nCount] = m_DownLogListCtrl.GetNextSelectedItem(pos);
//i = m_DownLogListCtrl.GetSelectionMark();
m_DownLogListCtrl.SetItemState(i[nCount], LVIS_DROPHILITED, LVIS_DROPHILITED);
nCount++;
} *pResult = 0;
}void CtestDlg::OnNMSetfocusList(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
POSITION pos = m_DownLogListCtrl.GetFirstSelectedItemPosition();
int nCount = 0;
while(i[nCount] != -1)
{
m_DownLogListCtrl.SetItemState(i[nCount], FALSE, LVIF_STATE);
*pResult = 0;
nCount++;
}
}
这个是会变灰的,我弄过if(nItem == num)// 这里加入判断是否被选中的代码
{
crText = RGB(255, 255, 0);
crBkgnd = RGB(111, 111, 111); // cr1和cr2分别为高亮显示时的文本和背景色,自己查一下
}
else
{
crText = RGB(255, 255, 0);
crBkgnd = RGB(111, 0, 111);
}这段代码 加上MESSAGEBOX试试 看看你有没有进入选中绘图的情况。没有的话说明你条件就没设置对
还是不行啊,还是一样的,你这样试了吗?
在对话框上放一个list Control和一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了,我要解决的是:点击edit进行输入时,list Control中的行不变灰,仍然高亮度显示
你的list Control是Report吗
void CCListExDlg::OnNMKillfocusList1(NMHDR *pNMHDR, LRESULT *pResult)
{
for (int i = 0;i<m_List.GetItemCount();i++)
{
if (m_List.GetItemState(i,LVIS_SELECTED) == LVIS_SELECTED)
{
m_List.SetItemState(i, LVIS_DROPHILITED, LVIS_DROPHILITED);
m_Count = i;
return;
}
}
*pResult = 0;
}void CCListExDlg::OnNMSetfocusList1(NMHDR *pNMHDR, LRESULT *pResult)
{
m_List.SetItemState(m_Count, FALSE, LVIF_STATE);
*pResult = 0;
}int m_Count; 全局变量
谢谢xianglitian(向立天)和hezhe1008(妖孽)两位大侠
xianglitian(向立天)的效果比hezhe1008(妖孽)的效果好,
所以我决定给xianglitian(向立天)200分
hezhe1008(妖孽)100分xianglitian(向立天)大侠,你到我另一个帖子中冒个泡,我再给你100分