将 EasyX 加到 MFC 界面上

1

请问怎样将 easyx 创建的窗口作为子窗口挂载到主 mfc 界面上实现两者的整合?

ava
aspirant boy

2020-4-28

2

这个问题比较复杂,主要是因为很多同学学习 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 程序带有键盘或鼠标交互,那么整合的时候就要考虑相关事件的处理,这恐怕不是一件容易的事。

ava
慢羊羊

2020-4-28

技术讨论社区