消息映射是MFC的机制,分为框架本身消息(譬如WM_LBUTTONDOWN等)和用户自定义消息;由于处理框架本身消息比较简单。本文只针对用户自定义消息进行讲解。
本文实现的效果图如下:实现的功能为左边的CListCtrl控件在被拖拽结束后通过发送消息给右边的CListCtrl控件以拖拽的文本值插入一行
处理步骤:
1、添加自定义消息宏
#define UM_DRAG_TYPE WM_USER + 0x0001
2、消息发送方声明一个HWND成员变量用于保存消息接收方的句柄
HWND m_hAccpetHwnd;
3、消息发送方的某一个动作开启发送消息
::SendMessage(m_hAccpetHwnd, UM_DRAG_TYPE, (WPARAM)m_nSelItem, (LPARAM)str.AllocSysString());
4、消息接收方头文件添加接收消息处理函数声明
afx_msg HRESULT OnUmDragType(WPARAM wParam, LPARAM lParam);
5、消息接收方在消息宏中添加对该自定义消息的路由
BEGIN_MESSAGE_MAP(CContextListCtrl, CListCtrl)
ON_MESSAGE(UM_DRAG_TYPE, &CContextListCtrl::OnUmDragType)
END_MESSAGE_MAP()
6、对自定义消息函数进行处理
HRESULT CContextListCtrl::OnUmDragType(WPARAM wParam, LPARAM lParam)
{
int index = (int)wParam;
BSTR bStr = (BSTR)lParam;
CString str = bStr;
SysFreeString(bStr);
int count = GetItemCount();
std::vector<CString> &vecType = ((CUserMessageDemoDlg *)GetParent())->GetDargType();
InsertItem(count, vecType[index]);
SetItemText(count, 1, str);
return 0;
}
值得注意的是:本文同时给出了对自定义消息发送字符串的处理,处理代码为:
1、发送方:
str.AllocSysString(); //作为WPARAM或者LPARAM的参数
2、接收方:
BSTR bStr = (BSTR)lParam; //转为BSTR类型
CString str = bStr; //BSTR类型转CString
SysFreeString(bStr); //调用SysFreeString函数释放