请问怎样将 easyx 创建的窗口作为子窗口挂载到主 mfc 界面上实现两者的整合?
举报
将 EasyX 加到 MFC 界面上
举报
这个问题比较复杂,主要是因为很多同学学习 MFC 不够扎实。学习 MFC,要求熟练掌握 C++,以及 Windows 编程中的各种机制。然而,很多学校在讲授 MFC 之前,并没有做好足够的前期课程铺垫,这是导致这个问题的根本原因。
以下,我会尽可能简单的讲。
分多种方案吧:
方案 1. 不使用 MFC,直接用 EasyX 画出所需 UI
很多同学需要用 MFC,只是需要用几个按钮或者菜单。其实按钮就是一个可以接受鼠标点击的矩形,菜单也只是一个或一些稍微复杂点的矩形。通过代码实现这些逻辑,对自己的学习会有很大帮助。
可以参考这个例子:https://codebus.cn/teternity/a/minesweeper
方案 2. 通过进程整合
在 MFC 里面通过创建进程,将 EasyX 编译好的 .exe 作为新的进程在 MFC 程序中加载。
这种方法最简单,但是局限性非常大:虽然可以直接显示 EasyX 程序,但是并不能把 EasyX 的窗口整合进 MFC 窗口内。
方案 3. 通过 DC 复制图像
在这个方案里,直接在 MFC 程序中使用 EasyX。
需要调整:EasyX 不要创建绘图窗口,而是直接创建 IMAGE 对象,然后所有绘图都画到 IMAGE 对象上面,再通过 IMAGE 对象的 HDC 将图像内容贴到 MFC 的窗口的指定区域。
以下是这个方案的范例代码:
void CTestView::OnDraw(CDC* pDC)
{
// 定义 EasyX 的 IMAGE 对象,并将其设置为绘图目标
IMAGE img(300, 300);
SetWorkingImage(&img);
// 在 EasyX 的 IMAGE 对象上画一个圆
circle(150, 150, 50);
// 获取 EasyX 的 IMAGE 对象的 DC 句柄
HDC easyxDC = GetImageHDC(&img);
// 创建 MFC 客户区 DC
CClientDC m_dc(this);
// 获取客户区 DC 的句柄
HDC mfcDC = m_dc.GetSafeHdc();
// 通过句柄,实现从 EasyX 的 IMAGE 到 MFC 客户区的图像拷贝
::BitBlt(mfcDC, 0, 0, 300, 300, easyxDC, 0, 0, SRCCOPY);
}
这种方法看似简单,但是如果 EasyX 程序带有键盘或鼠标交互,那么整合的时候就要考虑相关事件的处理,这恐怕不是一件容易的事。