我想做一个类似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(当前项的记录变量)时,没有任何反应,为什么??
我已经发了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(当前项的记录变量)时,没有任何反应,为什么??
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);
}
}可否?用来判断选择项变化。
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函数可以实现,多谢!