2012-10-18 67 views
1

我有一個小應用程序,我想創建一些按鈕,工具欄等,但我不想使用預先存在的GTK圖標主題,我想創建自己的。所以我尋找教程和其他東西,但事實證明,它並沒有很好地在網上討論。於是,我就做我自己的事:在Gtkmm中創建自定義IconFactory

頭文件:

#include <gtkmm.h> 
#include <string> 
#include <iostream> 
#include <errno.h> 

class IconFactoryBuilder 
{ 
public: 
    IconFactoryBuilder(); 

    ~IconFactoryBuilder(); 

    void RegisterNewIcons(std::string pPath); 

private: 

    Glib::RefPtr<Gtk::IconFactory> mCustomFactory; 
}; 

cpp文件:

#include <IconFactoryBuilder.h> 

IconFactoryBuilder::IconFactoryBuilder() { 
    mCustomFactory = Gtk::IconFactory::create(); 
} 

IconFactoryBuilder::~IconFactoryBuilder() { 
} 

void IconFactoryBuilder::RegisterNewIcons(std::string pPath) { 

    Glib::RefPtr<Gtk::IconSet> iconSet = Gtk::IconSet::create(); 
    Gtk::IconSource someSource; 
    try{ 
     Gtk::Image *someImage=Gtk::manage(new Gtk::Image(pPath+"appbar.at.png")); 
     someImage->set_pixel_size(Gtk::IconSize(48)); 
     someSource.set_pixbuf(someImage->get_pixbuf()); 
     someSource.set_size(Gtk::ICON_SIZE_DIALOG); 
     someSource.set_size_wildcarded(); 
    } 
    catch(const Glib::Exception &ex) { 
     std::cerr << "An error occurred while opening the icon file!" << strerror(errno) << std::endl; 
    } 
    catch(...) { 
     std::cerr << "Unknown Error!" << std::endl; 
    } 
    iconSet->add_source(someSource); 
    const Gtk::StockID somestock("MyNewIcon"); 
    Gtk::Stock::add(Gtk::StockItem(somestock, "somelabel")); 
    mCustomFactory->add(somestock, iconSet); 
    mCustomFactory->add_default(); 
} 

但現在我很堅持,因爲我真的不知道該怎麼稱呼這是我創建的新圖標。我也不知道上面的代碼是否足以真正找到圖標。

回答

1

您創建了一個圖標工廠... 工廠

;-)

嚴重的回答你的問題是,你不需要Gtk::IconFactory。不幸的是,GTK 2文檔並沒有告訴你這是沒有必要的。你需要的是freedesktop.org Standard Icon Naming Specification。創建你的圖標,給它們簡單的名字,根據那裏描述的目錄結構進行組織,將它安裝到適當的地方,當你使用...from_icon_name()函數創建PixbufImage時,你的圖標將「正常工作」。 (example: Gtk::Image::set_from_icon_name()

這裏是如何提供自己的圖標GNOME開發者的wiki頁面: http://developer.gnome.org/integration-guide/stable/icons.html.en

這裏是一個教程中,我寫了關於安裝自定義圖標的頁面:http://ptomato.name/advanced-gtk-techniques/html/desktop-file.html

+0

我不明白你的答案,說實話。當然,如果股票圖標是我想要使用的,我不會採取所有這些麻煩。我需要用我自己的名字創建自己的股票。這是一個特殊用途的應用程序,其中流行的圖標集不符合需要。 –

+0

所以你想用你自己的「open」,「close」圖標來替換Gnome的「open」,「close」等圖標嗎?或者您想創建自己的圖標,例如「floop」和「greeble」代表您的應用程序中的操作? – ptomato

+0

後者:)我想我忘了提及,我正在使用GTK3。我無法使用CSS對按鈕進行樣式設計的原因是,我不在乎命名很多按鈕,只是通過股票宏和標準GTK響應創建它們。但那只是爲了測試。現在我需要創建專門的圖標,這通常不在標準圖​​標集中。 –