我想做一个类似Sourcesafe的Show History中的CListCtrl控件的功能,在控件窗口中,只要有项存在,始终有选择项,不响应右键,当鼠标点击空白区域时,对话框的当前项没有改变。
    我已经发了3个帖子,总结如下,还有一末实现的功能,请高手指点,多谢!
① 从CListCtrl派生一个类CMyListCtrl,在该类中增加:
LRESULT CMyListCtrl::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    switch ( message )
    {
    case WM_RBUTTONDOWN:
    case WM_RBUTTONUP:
    case WM_RBUTTONDBLCLK:
return 1;
    default:
break;
    }
    return CListCtrl::DefWindowProc(message, wParam, lParam);
}
可以屏蔽掉右键作用;
②在初始化对对话框时:
DWORD style;style = m_mylistctrl.GetExtendedStyle();
style &= ~LVS_EX_TRACKSELECT;
style &= ~LVS_EX_GRIDLINES;
m_mylistctrl.SetExtendedStyle( style );
选中第一项;
疑问:
1、当鼠标点击空白区域时,屏蔽掉事件,以至对当前选择项不产生影响;
BOOL CMyListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
NMHDR* pNMHDR = (NMHDR*)lParam;
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
if( phdn->iItem == -1 )
{
*pResult = 1;
        return TRUE;
}

return CListCtrl::OnNotify(wParam, lParam, pResult);
}
2、或者,不采用OnNotify方法,增加LVN_ITEMCHANGED事件的处理,当改变选择项的时候,该处理函数将被调用3次,如果
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
if( phdn->iItem == -1 )
{
    m_mylistctrl.SetItemState( m_curSelItem, LVIS_SELECTED |    LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
}
如果这样处理,当对话框失去焦点时,当前项将不能高亮显示,问题是:前两次调用是当前项失去焦点,在第3次调用时,如何改变iItem呢,因为我用我把phdn->iItem设为m_curSelItem(当前项的记录变量)时,没有任何反应,为什么??

解决方案 »

  1.   

    在选择项变化时,可以使用按钮有效或失效,按如下操作:  加入LVN_ITEMCHANGED消息处理.
     void CYourClassNameHere::OnItemchangedEventList(NMHDR* pNMHDR, LRESULT* pResult)
    {
     NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
     *pResult = 0; if (pNMListView->uChanged == LVIF_STATE)
     {
      if (pNMListView->uNewState)
       GetDlgItem(IDC_DELETE)->EnableWindow(TRUE);
      else
       GetDlgItem(IDC_DELETE)->EnableWindow(FALSE);
     }
    }可否?用来判断选择项变化。
      

  2.   

    这不能实现我的机能
    LVN_ITEMCHANGED消息处理只能获得当前改变的信息,但不能对项的选择产生改变,请各位高手确认??
    这一功能我现在实现了:
    LRESULT CMyListCtrl::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class int count;
    RECT rect;
    POINT msgpoint;
    DWORD msgpos;
    int x_pos, y_pos;    switch ( message )
        {
        case WM_LBUTTONDOWN:
        case WM_LBUTTONUP:
        case WM_LBUTTONDBLCLK:
    count = GetItemCount();
    GetItemRect(count - 1, &rect, LVIR_BOUNDS );
    msgpos = GetMessagePos();
    x_pos = LOWORD( msgpos );
    y_pos = HIWORD( msgpos );
    msgpoint.x = x_pos;
    msgpoint.y = y_pos;
    ScreenToClient( &msgpoint ); 
    if( msgpoint.y > rect.bottom )
    return 1;
    break;
        case WM_RBUTTONDOWN:
        case WM_RBUTTONUP:
        case WM_RBUTTONDBLCLK:
    return 1;
    break;
    default:
    break;
        }

    return CListCtrl::DefWindowProc(message, wParam, lParam);
    }
    还有一问题:
    飞鸟良给我的初始化第一项方法很好
    DWORD style;style = m_mylistctrl.GetExtendedStyle();
    style &= ~LVS_EX_TRACKSELECT;
    style &= ~LVS_EX_GRIDLINES;
    m_mylistctrl.SetExtendedStyle( style );
    但在查找许多网站时:
    m_mylistctrl.SetItemState(1, LVIS_FOCUSED | LVIS_SELECTED, 
        LVIS_FOCUSED | LVIS_SELECTED);
    当打开对话框时,不能看到第一项高亮显示,但当CListCtrl控件获得焦点时,就能实现该初始化项,请问怎样才能在对话框初始化时,实现这一机能,有什么API函数可以实现,多谢!