最近项目需求上需要给列表控件发送一个双击消息,特此总结一下以备以后需要:
//给列表发送双击消息
void CTestDlg:SendDbClickToList()
{
//模拟CListCtrl双击消息
NMITEMACTIVATE NMItemActivate;
NMHDR thdr;
thdr.code = NM_DBLCLK;
thdr.hwndFrom = m_List.m_hWnd;
thdr.idFrom = IDC_LIST;
NMItemActivate.hdr = thdr;
NMItemActivate.iItem = m_List.GetItemCount();
//::SendMessage(m_hWnd, WM_NOTIFY, IDC_LIST, (LPARAM)&NMItemActivate);
SendMessage(WM_NOTIFY, IDC_LIST, (LPARAM)&NMItemActivate);//把消息发给列表所在的父窗口,由父窗口转发,而不是直接发给列表
}
首先我们可以知道在响应列表控件双击消息的函数里需要有将NMHDR类型的指针转换为NMITEMACTIVATE类型的指针
void CTestDlg:::OnDbClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
}
因此我们也需要定义一个NMITEMACTIVATE类型的结构体来作为参数传送给消息响应函数。NMItemActivate结构成员的具体含义可以在msdn查一下。
然后就是使用SendMessage函数发送消息,需要注意的是并不是直接发送给列表本身,而是发送给列表的父窗口,然后由父窗口转发。
SendMessage的第一个参数为消息类型,第二个为列表控件的ID,第三个为我们刚才定义的NMItemActivate结构体的指针。
整个过程我们可以总结一下,自己发送消息给某个控件,如果需要,定义对应的结构体,然后WPARAM参数为控件ID,LPARAM一般为额外的结构体的指针。