首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

MFC中自定义消息的有关问题

2012-01-12 
MFC中自定义消息的问题在VC中自定义消息的时候可以让消息响应函数接收个wParam和lParam利用sendmessage发

MFC中自定义消息的问题
在VC中自定义消息的时候可以让消息响应函数接收个wParam和lParam
利用sendmessage发送这两个参数.
问下这两个参数如何定义和接收啊  
比如我要用sendmessage发送一个int型   或CString型的数据如何去做啊
是否可以发送个结构体?
刚接触VC有些地方不太明白   请帮助指点谢谢

[解决办法]
1. 传整型值可以直接用SendMessage 带回~! 因为: 该函数原型中的两个参数都是int类型
LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );

 在代码中可以这样调用:
SendMessageToParent(pgvItem-> row, pgvItem-> col, GVN_ENDLABELEDIT);


2. 如果要传 多个参数可以将这些参数打成包在一个结构体中处理,例如:
1)先定义一个结构体:
typedef struct tagNM_GRIDVIEW {
NMHDR hdr; // 这个成员是必不可少的
int iRow; // 你想带回的int类型参数 ()
int iColumn; // 你想带回的int类型参数 ()
//CString strInfo; // 你想带回的CString类型参数 用这个
} NM_GRIDVIEW;

2)再定义一个发送消息的函数:
LRESULT SendMessageToParent(int nRow, int nCol, int nMessage); 函数:

它的实现体:
LRESULT CGridCtrl::SendMessageToParent(int nRow, int nCol, int nMessage)
{
if (!IsWindow(m_hWnd))
return 0;

NM_GRIDVIEW nmgv;
nmgv.iRow = nRow; // 这里将你要的东信息传过去
nmgv.iColumn = nCol;
nmgv.hdr.hwndFrom = m_hWnd;
nmgv.hdr.idFrom = GetDlgCtrlID();
nmgv.hdr.code = nMessage;

CWnd *pOwner = GetOwner();
if (pOwner && IsWindow(pOwner-> m_hWnd))
return pOwner-> SendMessage(WM_NOTIFY, nmgv.hdr.idFrom, (LPARAM)&nmgv); // 注意到这里是 WM_NOTIFY 
else
return 0;
}

3)
真正发送消息的语句: SendMessageToParent(nRow, nCol, MSGENDEDIT);
MSGENDEDIT 为自定义的宏 : (例如:整型值 WM_USER+30)


// ――――――以下为响应消息的代码段:
--------------------------------------------
1) 在响应该消息的地方: .h 文件里面:
afx_msg void OnComBoboxEndEdit(NMHDR *pNotifyStruct, LRESULT* pResult);
DECLARE_MESSAGE_MAP()

2) .Cpp 文件里面 :
BEGIN_MESSAGE_MAP... 下面
.
.
ON_NOTIFY(MSGCOMBOXENDEDIT, IDC_GRID, OnComBoboxEndEdit)
END_MESSAGE_MAP()

3)自己的代码取该消息参数: 在OnComBoboxEndEdit 函数中可以取这个消息带回的参数:
void CMovingPageNVis::OnComBoboxEndEdit(NMHDR *pNotifyStruct, LRESULT* pResult)

NM_GRIDVIEW* pNmgv = (NM_GRIDVIEW *)pNotifyStruct; // 这里有个类型转换:
TRACE( "行是%d \n ", pNmgv-> iRow) ;
TRACE( "列%d \n ", pNmgv-> iColumn) ; // 这里就是取你定义的消息带回的参数了! 

LZ将这个代码弄到你的工程中,应该可以解决你的问题! (CString 我也没有实际试验过,LZ自己试验下,多个int肯定是可以的)

热点排行