wxWidgetsでアイコンを表示したい。
HICONを wxIcon::CreateFromHICON関数でwxWidgetsのwxIconへ変換。これをさらにwxBitmapに変換する。
// https://docs.wxwidgets.org/3.0/overview_helloworld.html // プリプロセッサに以下二つを追加 // __WXMSW__ // WXUSINGDLL // サブシステムをWindowsに設定(WinMainで呼び出すので) // Windows (/SUBSYSTEM:WINDOWS) #ifndef WX_PRECOMP #include <wx/wx.h> #endif #include <wx/frame.h> // wxFrameに必要 // デバッグとリリースでライブラリを分ける #ifdef _DEBUG #pragma comment(lib,"wxbase32ud.lib") #pragma comment(lib,"wxbase32ud_net.lib") #pragma comment(lib,"wxbase32ud_xml.lib") #pragma comment(lib,"wxmsw32ud_adv.lib") #pragma comment(lib,"wxmsw32ud_aui.lib") #pragma comment(lib,"wxmsw32ud_core.lib") #pragma comment(lib,"wxmsw32ud_gl.lib") #pragma comment(lib,"wxmsw32ud_html.lib") #pragma comment(lib,"wxmsw32ud_media.lib") #pragma comment(lib,"wxmsw32ud_propgrid.lib") #pragma comment(lib,"wxmsw32ud_qa.lib") #pragma comment(lib,"wxmsw32ud_ribbon.lib") #pragma comment(lib,"wxmsw32ud_richtext.lib") #pragma comment(lib,"wxmsw32ud_stc.lib") #pragma comment(lib,"wxmsw32ud_webview.lib") #pragma comment(lib,"wxmsw32ud_xrc.lib") #else #pragma comment(lib,"wxbase32u.lib") #pragma comment(lib,"wxbase32u_net.lib") #pragma comment(lib,"wxbase32u_xml.lib") #pragma comment(lib,"wxmsw32u_adv.lib") #pragma comment(lib,"wxmsw32u_aui.lib") #pragma comment(lib,"wxmsw32u_core.lib") #pragma comment(lib,"wxmsw32u_gl.lib") #pragma comment(lib,"wxmsw32u_html.lib") #pragma comment(lib,"wxmsw32u_media.lib") #pragma comment(lib,"wxmsw32u_propgrid.lib") #pragma comment(lib,"wxmsw32u_qa.lib") #pragma comment(lib,"wxmsw32u_ribbon.lib") #pragma comment(lib,"wxmsw32u_richtext.lib") #pragma comment(lib,"wxmsw32u_stc.lib") #pragma comment(lib,"wxmsw32u_webview.lib") #pragma comment(lib,"wxmsw32u_xrc.lib") #endif #include <commctrl.h> #pragma comment(lib, "comctl32.lib") // IID_IImageList に必要 #include <commoncontrols.h>
// アイコンを取得 wxBitmap my_get_icon(const wchar_t* path) { wxBitmap ret; // システムイメージリストの取得 HIMAGELIST hImageList; HRESULT hr = SHGetImageList(SHIL_JUMBO, IID_IImageList, (void**)&hImageList); // SHIL_JUMBO 256x256 if (SUCCEEDED(hr)) { SHFILEINFO shfi; memset(&shfi, 0, sizeof(SHFILEINFO)); // path からアイコンの「イメージリスト上のインデクス」を取得 // ※ アイコンハンドルではない SHGetFileInfo(path, 0, &shfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX); HICON hicon = ImageList_GetIcon(hImageList, shfi.iIcon, ILD_NORMAL); // wxWidgetsのwxIconに変換 wxIcon computerIcon; computerIcon.CreateFromHICON((WXHICON)hicon); ret = wxBitmap(computerIcon); // wxBitmapに変換してからDestryIconする DestroyIcon(hicon); } return ret; }
///////////////////////////////////// ///////////////////////////////////// ///////////////////////////////////// // ウィンドウ作成 class MyFrame : public wxFrame { wxBitmap mybmp_drive; wxBitmap mybmp_file; wxBitmap mybmp_doc; public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) { SetBackgroundColour(*wxWHITE); mybmp_drive = my_get_icon( L"C:\\"); mybmp_file = my_get_icon(L"C:\\Windows\\System32\\notepad.exe"); mybmp_doc = my_get_icon(L"C:\\Users\\Public\\Documents\\desktop.ini"); // PAINTイベントをバインド Bind(wxEVT_PAINT, &MyFrame::OnPaint, this); } // PAINTイベントのハンドラ void OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); if (mybmp_drive.IsOk()) { dc.DrawBitmap(mybmp_drive, 5+0, 5, false); } if (mybmp_file.IsOk()) { dc.DrawBitmap(mybmp_file, 5 + 256*1, 5, false); } if (mybmp_doc.IsOk()) { dc.DrawBitmap(mybmp_doc, 5 + 256*2, 5, false); } } }; ///////////////////////////////////// ///////////////////////////////////// ///////////////////////////////////// // wxWidgetsのアプリケーション作成 class MyApp : public wxApp { public: virtual bool OnInit() { MyFrame* frame = new MyFrame("Hello World", wxPoint(50, 50), wxSize(1000, 340)); frame->Show(true); return true; } }; ///////////////////////////////////// ///////////////////////////////////// ///////////////////////////////////// // WinMainをマクロで定義 wxIMPLEMENT_APP(MyApp);