スポンサーリンク

Win32API + wxWidgetsでアイコンを取得・表示

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);

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: