MFC消息传递结构体
时间: 2024-12-25 22:22:28 浏览: 11
### MFC 中的消息传递结构体
#### CCreateContext 结构体
`CCreateContext` 是用于在多文档界面 (MDI) 或单文档界面 (SDI) 应用程序中创建新窗口上下文的结构体。此结构体通常由框架填充,并作为参数传递给 `OnNewDocument` 函数和其他类似的函数[^1]。
```cpp
struct CCreateContext {
CDocTemplate* pCurrentDocTemplate;
CDoc* pCurrentDoc;
CFrameWnd* pCurrentFrame;
CRuntimeClass*pNewViewClass;
};
```
该结构体的主要功能是在创建新的视图对象时提供必要的环境信息,包括当前使用的文档模板、关联的文档指针以及父帧窗口等。
#### OnCopyData 消息处理中的结构体传输
为了通过 Windows 的 `WM_COPYDATA` 消息机制来交换复杂的数据类型(如自定义结构体),可以在两个进程之间共享相同布局的结构体定义。当需要跨应用边界传送数据时,这种方式非常有用[^2]。
假设有一个名为 `MyDataStruct` 的结构体:
```cpp
// 定义要复制的数据结构
struct MyDataStruct {
int id;
double value;
};
// 发送端代码示例
void SendData(HWND hWndTo, const MyDataStruct& data) {
COPYDATASTRUCT cds;
cds.dwData = 0; // 可选标识符
cds.cbData = sizeof(MyDataStruct);
cds.lpData = &data;
::SendMessage(hWndTo, WM_COPYDATA, reinterpret_cast<WPARAM>(hWnd()), reinterpret_cast<LPARAM>(&cds));
}
```
接收方则需实现相应的消息映射宏以捕获并解析传入的数据包。
#### 存储于容器内的结构体管理
对于希望在一个对话框或其他类型的窗口内维护多个同种类型的记录项的应用场景来说,可以考虑利用 STL 提供的标准库容器或者 MFC 自带的一些集合类来进行存储和操作这些结构体实例。例如,在初始化阶段将一些初始值存放到列表控件里;而在绘制过程中读取其中的内容以便展示给用户查看[^3]。
```cpp
class CXxDlg : public CDialogEx {
public:
std::vector<MyDataStruct> m_dataList;
protected:
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
};
BOOL CXxDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
MyDataStruct item{1, 3.14}; // 创建一个临时变量赋初值
m_dataList.push_back(item); // 添加到向量末端
return TRUE;
}
void CXxDlg::OnPaint() {
CPaintDC dc(this);
for(const auto& elem : m_dataList){
CString str;
str.Format(_T("ID=%d Value=%.2f"), elem.id, elem.value);
dc.TextOut(10, 10, str);
}
}
```
上述例子展示了如何在对话框生命周期的不同阶段管理和呈现一组结构化数据的方法之一。
阅读全文