2010-12-22 2 views
0

Ich schreibe wxWidgets Anwendung, wo ich die .ICO-Datei als Header importieren. Ich versuche, einen wxMemoryFSHandler zu verwenden, um dieses Symbol (und auch andere) als Dateien zugänglich zu machen. Ich verwende den folgenden Code, dies zu tun:Gibt es eine Möglichkeit, ein Symbol aus einem Speicherdateihandler zu laden?

wxFileSystem::AddHandler(new wxMemoryFSHandler); 
wxMemoryFSHandler::AddFileWithMimeType(
    "app_inactive.ico", 
    CsiWebAdmin_ico, 
    sizeof(CsiWebAdmin_ico), 
    "image/vnd.microsoft.icon"); 

Leider, wenn ich versuche, ein Symbol aus dieser „Datei“ zu laden, wie unten dargestellt, es funktioniert nicht. Als ich die MSW-Quelle (wx 2.8.10) durchging, kann ich sehen, dass der Loader nie versucht hat, den virtuellen Dateinamen aufzulösen.

wxIcon icon("memory:app_inactive.ico"); 

Ich habe auch versucht, die folgenden:

wxIcon icon(wxIconLocation("memory:app_inactive.ico")); 

und haben die gleichen Ergebnisse auftreten.

Ich weiß, dass ich Ressourcen verwenden kann, um diese Dateien zu laden, aber ich würde immer noch das gleiche Dilemma gegenüberstehen, wenn die Zeit kam, meine Anwendung auf GTK zu portieren. Gibt es etwas Offensichtliches, dass ich vermisse?

Antwort

1

Ich habe festgestellt, dass es keine Möglichkeit gab, den Icon-Set direkt aus dem virtuellen Dateisystem zu laden. Ich habe jedoch herausgefunden, ein Mittel, um dies zu tun, wie folgt:

wxFileSystem file_system; 
Csi::SharedPtr<wxFSFile> ico_file(
    file_system.OpenFile(
     make_wxString(config->get_control()->get_attr_wstr(L"icon")))); 
if(ico_file != 0) 
{ 
    wxIconBundle icons; 
    wxInputStream *stream(ico_file->GetStream()); 
    size_t image_count(wxImage::GetImageCount(*stream, wxBITMAP_TYPE_ICO)); 
    wxImage image; 
    for(size_t i = 0; i < image_count; ++i) 
    { 
     if(image.LoadFile(*stream, wxBITMAP_TYPE_ICO, i)) 
     { 
     wxIcon icon; 
     icon.CopyFromBitmap(wxBitmap(image)); 
     icons.AddIcon(icon); 
     } 
    } 
    SetIcons(icons); 
} 
0

Ein Beispiel zum Einbetten von Symbolen in eine ausführbare Datei finden Sie unter png2wx.pl. Es ist dann als C-Symbol verfügbar, z. B.

 
wxMenuItem *w = some_menu->Append(id, _("text")); 
w->SetBitmap(*_img_exit_icon); 
+0

Dies ist nicht wirklich die Frage. Meine eigentliche Frage war, warum ein Icon nicht aus einem virtuellen Dateisystem geladen werden kann. –

1

Möchten Sie Anwendungssymbole festlegen? Dann siehe wxIconBundle. Ich benutze dieses Stück Code:

wxFileName frameIconFile = your_resources_folder; 
    frameIconFile.SetFullName("appicon.ico"); 
    wxIconBundle frameIcons(frameIconFile.GetFullPath(),wxBITMAP_TYPE_ICO); 
    mainFrame->SetIcons(frameIcons); 

Das Icon-Bundle (es ist eine Datei mit mehreren Symbolen) wird beim Start der Anwendung geladen. Um das Icon-Bundle zu erstellen, verwende ich IcoFX (http://icofx.ro/).

+0

Ich würde es vorziehen, Anwendungsressourcen aus einer externen Datei zu laden. Allerdings wollte ich die .ico-Datei in eine Sequenz von XPM-Dateien konvertieren, die in die Anwendung kompiliert und auf diese Weise in ein wxIconBundle geladen werden konnten. –

Verwandte Themen