【问题标题】:Console-window has icon, but OpenGL/GLUT window don't have. Why?控制台窗口有图标,但 OpenGL/GLUT 窗口没有。为什么?
【发布时间】:2023-03-26 23:07:02
【问题描述】:

我在Windows下用C/C++/OpenGL/GLUT写了一个程序。我想在我的程序中添加一个图标。我使用 MinGW 和命令提示符来编译我唯一的一个 .cpp 文件。我给自己写了一些 .bat 文件,我可以将其编译为调试模式、发布模式等。

我想在我的程序中添加一个图标。所以,我制作了一个新的 compile bat,如下所示:

windres resource.rc object.o
set PATH=%PATH%;c:\mingw\bin
g++ program.cpp object.o >>>some other settings<<<

我有一个 .ico 文件和一个“资源脚本”语言的资源文件。资源文件如下所示:

#ifndef _resource_rc
#define _resource_rc

MAINICON ICON "icons\\icon1.ico"

#endif

现在,问题是:我编译了这些东西,我得到了一个 release .exe,如果我在文件处理程序中查看它,我可以看到 .exe 文件附近的图标,如果我运行它,那里是角落里的一个图标。但是,我的程序以控制台模式菜单开始。如果你在菜单中移动,并选择一个给定的菜单点,之后,你可以启动一个图形窗口,它是用 OpenGL / GLUT 编写的。问题是,控制台窗口有图标,但 OpenGL / GLUT 窗口没有。它有一个基本的 .exe 图标(蓝色边框,内部为白色矩形),而不是我的特定图标。这不好:-(

如何解决 OpenGL / GLUT 窗口有我的图标,而不是默认图标?

感谢您的回答,对不起,因为我的语法:-)

【问题讨论】:

  • @jamesdlin 不,那个是DLL,你必须调用winapi,这个是可执行文件,可以通过设置GLUT_ICON或0x1000,0x1001,windows方式简单地完成,并且两者都无需调用winapi手动更改图标,这是由链接器完成的。

标签: c++ windows glut


【解决方案1】:

如果这对您很重要,那么以跨平台方式执行此操作的唯一方法是使您的应用程序不是控制台应用程序。使其成为创建控制台的 Windows 应用程序。因此您的主窗口将是 OpenGL 窗口,而控制台窗口将是辅助窗口。

在 Windows 上创建一个控制台窗口并将其连接到标准输入/输出不是一个简单的过程,而是it can be done

【讨论】:

    【解决方案2】:

    对于 MSVC,这很简单!

    你不需要使用winapi。只需简单地创建一个资源文件

    GLUT_ICON ICON logo.ico
    

    logo.ico 是您的图标文件。

    然后将其与您的程序链接

    rc resoure.rc
    link main.obj resource.RES
    

    就是这样! GLUT 将为您设置一切:文件资源管理器中的图标和运行时中的图标。

    你也可以用windows的方式来做。在resource.rc:

    #define ICO_BIG   0x1000
    #define ICO_SMALL 0x1001
    ICON_BIG ICON "logo.ico"
    ICON_SMALL ICON "logo.ico"
    

    一切都会一样。无需手动设置图标。

    【讨论】:

      【解决方案3】:

      您可以通过发送带有所需HICONWM_SETICON message 来明确设置窗口的图标。 (你可以通过调用LoadImage从你的资源中获取HICONs。)

      例如:

      SIZE smallIconSize = { GetSystemMetrics(SM_CXSMICON),
                             GetSystemMetrics(SM_CYSMICON) };
      HICON icon = static_cast<HICON>(LoadImage(hInstance, MAKEINTRESOURCE(MAINICON),
                                                IMAGE_ICON,
                                                smallIconSize.cx, smallIconSize.cy,
                                                0));
      SendMessage(hWnd, WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(icon));
      

      【讨论】:

      • 好的,如何从 FreeGLUT 窗口获取 HWND?
      • @NicolBolas 呃,好问题。我想你可以使用FindWindow,如stackoverflow.com/questions/12748103/…中所述
      • 看起来不错,但这是Win32代码。如果有人使用 OpenGL,他必须使用一些东西与之通信:GLUT、freeGLUT、Win32,……然后,你可以制作一个窗口,使用键盘和鼠标等等。我为此使用 GLUT,而不是 Win32。我可以混合它们吗?我的意思是,我有很多 GLUT 代码,但要更改图标我会使用 Win32 代码,我可以这样做吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多