如题,默认情况下list control失去焦点后,其中被选定的行的蓝色标记就消失了,设置ShowSelectionAlways属性后,蓝色标记变成灰色,我现在想让被选定的行在list control控件失去焦点后,仍然蓝色高亮度显示,怎么实现?各位大侠,帮帮忙吧

解决方案 »

  1.   

    增加一个变量保存你选中的行m,然后当你判断到失去焦点的时候,然后调用
    m_ListACInfo.SetItemState(m, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED);  
      

  2.   

    那其他控件不是得不到焦点了吗,我在edit中输入数据怎么弄,这样不行的
      

  3.   

    list Control Report风格试了一下 没有你说的问题啊
      

  4.   

    SetItemState任意个都可以设置高粱,和焦点关系不打
      

  5.   

    你在对话框上放一个list Control在放一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了
      

  6.   

    网上搜了一段重绘代码,但是只对没有被选定的行起作用,对选定地行不起作用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; 

    }
      

  7.   

    Always show Selection = true呢
      

  8.   

    调试到pLVCD->clrTextBk = crBkgnd;
    看看值是多少
      

  9.   

    *pResult = CDRF_DODEFAULT; 后边加
    InvalidateRect(NULL); 试试
      

  10.   


    //只能用于一行,多行的话你改改
    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;
    }
      

  11.   


    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);
    }   
      

  12.   

    lpDrawItemStruct,dc是什么,怎么定义?代码加在哪?
      

  13.   

    不会吧,我刚写的。OnNMKillfocusList是clistctrl的控件时间,不是对话框的,i是全局变量
      

  14.   


    我是按你说的做的,你在你的对话框上再放一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了,你看看是不是这样
      

  15.   

    不是,焦点在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++;
    }
    }
      

  16.   

    不管焦点在哪里,clistctrl里面选择的永远是蓝色高亮状态
      

  17.   


    这个是会变灰的,我弄过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试试 看看你有没有进入选中绘图的情况。没有的话说明你条件就没设置对
      

  18.   

    to aizeng
    还是不行啊,还是一样的,你这样试了吗?
    在对话框上放一个list Control和一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了,我要解决的是:点击edit进行输入时,list Control中的行不变灰,仍然高亮度显示
      

  19.   

    在对话框上放一个list Control和一个edit,你选定list Control中的一行,然后再点击edit进行输入,这时你刚才选定的行就灰了
    你的list Control是Report吗
      

  20.   

    要不你把你的程序发我看看[email protected]
      

  21.   

    我在公司,只能上csdn等网站。
      

  22.   


    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; 全局变量
      

  23.   

    问题解决了
    谢谢xianglitian(向立天)和hezhe1008(妖孽)两位大侠
    xianglitian(向立天)的效果比hezhe1008(妖孽)的效果好,
    所以我决定给xianglitian(向立天)200分
    hezhe1008(妖孽)100分xianglitian(向立天)大侠,你到我另一个帖子中冒个泡,我再给你100分