【问题标题】:wxWidgets Title bar iconwxWidgets 标题栏图标
【发布时间】:2013-03-03 17:51:29
【问题描述】:

我想更改显示在框架左上角的默认图标。 我尝试了很多方法——xpm、ico、bmp、 按照建议使用SetIcon(wxIcon(wxT("icon.xpm"))); here.
我尝试了不同的图标尺寸,16x16、24x24 和 32x32。
我还尝试在 resource.rc 文件中添加 MYICON1 ICON "Logo.ico",在 resource.h 文件中添加 #define MYICON1 101,在框架构造函数中添加 SetIcon(wxIcon(MYICON1));

顺便说一句,我在 Visual Studio 2010 上使用 wxwidgets 2.8

编辑:

我也试过在resource.rc文件中添加MYICON1 ICON "Logo.ico",在resource.h文件中添加#define MYICON1 101,在框架构造函数中添加SetIcon(wxIcon(MYICON1));..

使用这种方法,我在 wxIcon(int) 构造函数中遇到错误..

1>xsframe.cpp(17):错误 C2248:“wxString::wxString”:无法访问在“wxString”类中声明的私有成员
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wx/string.h(682) : 参见 'wxString::wxString' 的声明
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wx/string.h(659) : 见 'wxString' 的声明

PS,xsframe 是我的主框架。我正在尝试更改谁的图标。

【问题讨论】:

    标签: icons wxwidgets


    【解决方案1】:

    SetIcon(wxICON(MYICON1));

    在文件 gdicmn.h 中,第 166 行

    /* Useful macro for creating icons portably, for example:
    
        wxIcon *icon = new wxICON(sample);
    
      expands into:
    
        wxIcon *icon = new wxIcon("sample");      // On Windows
        wxIcon *icon = new wxIcon(sample_xpm);    // On wxGTK/Linux
     */
    

    【讨论】:

      【解决方案2】:

      我引用了here 的 Vaclav 的回答:

      您可以使用 wxFrame::SetIcon 设置主框架的图标。应用 可以通过向 .rc 文件中添加新的图标资源来更改图标:

      appicon ICON "myapp.ico"
      #include "wx/msw/wx.rc"
      

      请注意,此图标必须是 .rc 文件中的第一个图标并且 当您按字母顺序对图标进行排序时,必须是第一个。这是 因为 MS 开发人员无法决定如何 确定应用程序的图标:它是Windows 9x下.rc文件中的第一个 以及 NT 下按字母顺序排列的第一个(反之亦然)。

      大多数人通常会错过这一点。希望能解决问题。

      【讨论】:

        【解决方案3】:

        你在resource.rc文件中写了: MYICON1 ICON "Logo.ico" 和 SetIcon(wxIcon(MYICON1));到框架构造函数

        这就是我使用的方法。

        您需要做一个额外的步骤。在resource.h文件中你需要定义MYICON1 像这样的东西:

        #define MYICON1  101
        

        您必须确保图标文件包含所有必需的分辨率 - 我始终确保它具有 16by16、32by32 和 256by256 越多越好!

        如果应用程序图标是资源文件中的第一个图标是个好主意。

        我建议升级到 wxWidgets v2.9.4 - 很多事情开始变得更好。

        【讨论】:

        • 是的,我忘了提……我实际上在 resource.h 文件中定义了MYICON1。我在 wxIcon() 构造函数中的 seticon 函数中遇到错误。1>xsframe.cpp(17): error C2248: 'wxString::wxString' : cannot access private member declared in class 'wxString' 1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wx/string.h(682) : see declaration of 'wxString::wxString' 1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wx/string.h(659) : see declaration of 'wxString'
        • 那么,第 17 行发生了什么?请发布详细信息,而无需在每个步骤中询问。
        • 在第 17 行有 SetIcon(wxIcon(MYICON1)); 我也尝试使用其他尺寸的 logo.ico,16x16、32x32 和 256x256。但很明显,问题出在 wxIcon(int) 构造函数调用上。我检查了头文件,wxString(int); 在私有部分。那么如何访问它呢?
        • 您是否在同一个 ico 文件中包含所有图标大小?
        • 是的。同一个ico文件中有3个图标..但问题不存在。我不明白为什么要调用 wxString(int)。 wxIcon不应该有一个int重载的构造函数吗??
        【解决方案4】:

        使用图标的字符串名称,而不是数字标识符。以任何 wxWidgets 示例为例。

        【讨论】:

        • 你的意思是SetIcon(wxIcon(wxT("icon.xpm"))); 对吗?我试过了..没有帮助...没有错误,但图标是相同的默认值..我不知道是否有必要,但在调用 set icon 之前我也 wxInitializedAllImageHandlers() ..没有帮助..它与我在 Windows 8 上运行它有什么关系吗?
        • SetIcon() 在 Windows 8 下工作正常。OTOH "icon.xpm" 不是有效的图标名称。如果您使用 XPM,则必须将图标本身的名称用于 wxIcon ctor,例如icon_xpm(请查看您的 icon.xpm 文件以确保)。但是对于应用程序图标,您几乎总是使用.ico,因为无论如何它都需要以 ICO 格式存在于您的资源中。在这种情况下,.rc 文件中有“foo ICON foo.ico”,您应该在代码中使用 wxIcon("foo")
        • 我试过了。它也没有工作。在我的.rc 文件中我有MYICON ICON "Logo2.ico" 和我的框架构造函数SetIcon(wxIcon(_("MYICON1"))); 但是,发布文件夹中的.exe 确实显示了图标(资源管理器文件图标)。即使我删除了 seticon(),它仍然存在。似乎只是.rc 文件中的图标设置了应用程序图标.. 那么我该怎么处理标题栏图标呢?
        • 你现在谈论的是一个完全不同的图标...请下定决心。此外,在资源中使用“MYICON”并在代码中使用“MYICON1”也无济于事。你很困惑,因为你试图一次做太多事情,冷静下来,再次检查一切,它会奏效的。
        • 对此感到抱歉.. 我删除了所有内容并重新开始.. 首先我在资源文件中添加了图标(在资源视图中打开 resource.rc > 右键单击​​ > 添加资源 > 图标 > 导入 > 选择logo.ico > open) 顺便说一句,logo.ico 有 3 个图标,16x16、32x32 和 256x256。这在我的resource.rc 文件中添加了IDI_ICON1 ICON "logo.ico",在我的resource.h 文件中添加了#define IDI_ICON1 106。接下来我打开我的框架构造函数,将#include "resource.h" 添加到该页面,然后将SetIcon(wxIcon(_("IDI_ICON1"))); 添加到构造函数,就在Centre(); 之前我哪里出错了?
        【解决方案5】:

        一种快速而肮脏、非便携式、仅适用于 Windows 的解决方案(在 Windows 7、wxWidgets 3.0.4、vc110 中为我工作):

        #ifdef __WXMSW__
        #include "wx/msw/private.h" //for wxGetInstance()
        #endif
        ...
        
        //in Frame's constructor:
        HWND hWnd = this->GetHandle();
        HINSTANCE hInstance = wxGetInstance();
        
        HICON hIcon = ExtractIcon(hInstance, L"someicon.ico", 0);
        SetClassLongPtr(hWnd, GCLP_HICONSM, (LONG_PTR)hIcon);
        

        对在窗口上做一些其他技巧有用吗?

        【讨论】:

          猜你喜欢
          • 2014-12-29
          • 2014-08-28
          • 1970-01-01
          • 2015-02-21
          • 2010-12-16
          • 2023-04-08
          • 2011-09-24
          • 1970-01-01
          相关资源
          最近更新 更多