使用内置 easyx 的 devc++ 移植村长代码:窗口技巧:利用窗体句柄实现圆形窗口 为例,解决 WinGUI 函数报错"undefined reference to "

村长的圆形窗口代码链接 窗口技巧:利用窗体句柄实现圆形窗口

 undefined reference to `__imp_CreateEllipticRgn'翻译过来就是:没有定义的参数`__imp_CreateEllipticRgn'

首先检测是否有这个头文件:ctrl+鼠标左键源代码里的 CreateEllipticRgn 函数,发现跳转到 wingdi.h,说明编译器里其实是有这个功能代码的

解决方案:

鼠标右键 最右侧的 Project 选项卡,然后点击 Project Option 

 

general 里面有个 Type ,点击里面的 Win32GUI.

然后点击 OK 保存配置,然后按 F12 重新链接项目,再按 F11 编译运行,此时可以看到圆形窗口。

原理:重新设置了编译链接,链接到使用 winGUI 所需要的库里去了。

另:这样设置了项目属性之后,conio.h 头文件会失效,getch(),_getch() 这俩函数会失效。(因为 conio 是 console in out,管黑窗口控制台输入输出,刚才设置之后,就不会链接控制台的输入输出函数)

解决方案:把 initgraph(200, 200); 改成 initgraph(200, 200,1); 可以在项目属性为 winGUI 时,conio.h 也能链接使用。但是会有控制台黑窗口弹出。

可能原因:winGUI 和 windows console 程序都需要 winGDI 支持,devc++ 的 type 属性设定了代码的链接选项。由于 easyx 是用 winGDI 开发的,在链接的时候会加入一点新参数,可能是由于参数默认不同,winGUI 链接参数没有。但是 windows console 参数有,这样导致 easyx 调用控制台的权限比 devc++ 编译器高。导致了在 devc++ winGUI 模式里运行 win32console 的函数,而不是能在 win32console 里运行 winGUI 函数

测试代码如下,如果完成上述两个设置,运行此代码,会有一个圆形窗口和一个黑窗口,右键圆形窗口,窗口不会消失,在按任意键,黑窗口和圆形窗口一起消失。此时说明项目属性配置成功。

#include <graphics.h>
#include <conio.h>

int main()
{
	initgraph(200, 200, 1);				// 初始化图形窗口
	HWND hWnd = GetHWnd();				// 获取窗口句柄

	// 获取窗口边框宽高
	RECT rcClient, rcWind;
	GetClientRect(hWnd, &rcClient);
	GetWindowRect(hWnd, &rcWind);
	int cx = ((rcWind.right - rcWind.left) - rcClient.right) / 2;
	int cy = ((rcWind.bottom - rcWind.top + GetSystemMetrics(SM_CYCAPTION)) - rcClient.bottom) / 2;

	// 设置圆形区域
	HRGN rgn = CreateEllipticRgn(0 + cx, 0 + cy, 200 + cx, 200 + cy);
	SetWindowRgn(hWnd, rgn, true);

	// 画彩虹球
	setlinestyle(PS_SOLID, 2);
	for (int r = 99; r > 0; r--)
	{
		setlinecolor(HSLtoRGB(360 - r * 3.6f, 1, 0.5));
		circle(99, 99, r);
	}

	ExMessage m;						// 定义鼠标消息

	while (true)
	{
		m = getmessage(EX_MOUSE);		// 获取一条鼠标消息

		switch (m.message)
		{
			case WM_LBUTTONDOWN:
				// 如果左键按下,欺骗 windows 点在了标题栏上
				PostMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(m.x, m.y));
				break;

			case WM_RBUTTONUP:			// 按鼠标右键退出程序
				_getch();
				closegraph();
				return 0;
		}
	}
}

结论:

1.devc++ 学习 easyx 如果使用 winGUI 函数 如 setcliprgn(),就必须如上设置项目属性。

2.devc++ 里如果使用 winGUI 函数和 conio.h 里的函数,就必须如上设置项目属性和 initgraph() 函数。

3.devc++ 里 使用 winGUI 函数,使用 conio.h 里的函数,不显示黑窗口 这三个是不能同时实现。