使用内置 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 里的函数,不显示黑窗口 这三个是不能同时实现。
添加评论
取消回复