本文共 1261 字,大约阅读时间需要 4 分钟。
在Windows应用程序中,消息的传递是核心的操作之一。消息可以用不同的方式定义,以便于在代码中使用。以下是两种常用的方式:
第一种方式是使用#define
预定义符:
#define WM_NET_CMD_STRING (WM_USER + 100)
这种方式简单且直接,适用于需要轻量级定义的场景。
第二种方式是使用枚举(enum):
enum WM_NET_CMD_ID { WM_NET_CMD_STRING = WM_USER + 100, WM_NET_CMD_INT, WM_NET_CMD_FLOAT, WM_NET_CMD_REBOOT, WM_NET_CMD_SHUTDOWN,};
枚举方式提供了更强大的类型安全性,有助于避免命名冲突,并且在代码中更加直观。
在发送消息时,我们可以使用postMessage
函数或sendMessage
函数。postMessage
函数会将消息放置在队列中,立即返回,而sendMessage
函数则会送达目标窗口并立即返回。以下是发送字符串的示例代码:
char *pBuf = new char[1024];memset(pBuf, 0, 1024);memcpy(pBuf, data, len);if (!AfxGetApp()->m_pMainWnd->PostMessage(WM_NET_CMD_STRING, (WPARAM)pBuf, 0)){ delete[] pBuf;}
对于需要发送结构体的消息,方法类似,不过需要将结构体数据复制到目标窗口中。
消息传递是应用程序的核心机制之一。在窗口类中,我们可以使用消息映射(message map)来处理特定的消息。以下是一个示例:
BEGIN_MESSAGE_MAP(CTcpAsyncClientDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_MESSAGE(WM_NET_CMD_STRING, &CTcpAsyncClientDlg::OnNetCmdString)END_MESSAGE_MAP()
当目标窗口接收到特定消息时,我们可以编写回调函数来处理它。以下是处理WM_NET_CMD_STRING
消息的示例代码:
LRESULT CTcpAsyncClientDlg::OnNetCmdString(WPARAM wParam, LPARAM lParam){ char *pBuf = (char *)wParam; CString str = pBuf; m_pTcpAsyncClientDlg->m_listNetInfo.AddString(str); delete[] pBuf; return 0;}
在这段代码中,我们首先将wParam
转换为字符数组,然后将其复制到富文本控件中,并释放内存。
转载地址:http://rwetz.baihongyu.com/