[WinAPI]フォルダ上に表示されるアイコン

このQ&Aのポイント
  • プログラム内で2つのアイコンを使用しており、1つめのアイコンはタスクバー上で表示されるが、2つめのアイコンは.exeファイルに表示される問題がある。
  • リソースから2つめのアイコンを消すと、1つめのアイコンが.exeのアイコンとして表示されるが、2つめのアイコンを使わないわけにはいかない。
  • ウィンドウクラス構造体に指定したアイコンは.exeのアイコンとして表示されるが、描画用に使用したアイコンも表示されてしまう。解決方法や参考サイトを教えてください。
回答を見る
  • ベストアンサー

[WinAPI]フォルダ上に表示されるアイコン

プログラム内でアイコンを2つ使っているのですが 1つはWNDCLASSEX構造体のhIconメンバに渡して 2つめはDrawIconExで描画用に使っています。 しかし、1つめのアイコンはタスクバー上のアイコンとしては表示されるのですが (ウィンドウ自体はリージョンウィンドウで作成したのでタイトルバーはありません。また、タスクトレイと勘違いしてるわけでもないです。) 作成した.exeファイルには2つめのアイコンが表示されてしまいます。 リソースから2つめのアイコンを消すと1つめのアイコンが.exeのアイコンとして表示されるようですが、 2つめのアイコンを使わないわけにはいきません。 リソースファイルには ICON1 ICON "Icon1.ico" ICON2 ICON "Icon2.ico" とだけ指定してあります。 アイコンのロードにはLoadImageで第2引数にはTEXT("ICON1")のように文字列で指定しています。 ウィンドウクラス構造体に指定したアイコンがそのまま、.exeファイルのアイコンとして表示されるのだと認識しているのですが なぜ、描画用にしようしたアイコンが表示されてしまうのでしょう? 解決するための方法や参考になるサイトなどあればご教示ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

エクスプローラなどが表示しているアイコン…でよろしいですか? アイコンリソースで最初に見つかったものが表示されます。 作成されたEXEファイルをリソースハッカーなどで確認すると、 アイコンのリソースIDが分かるかと思われます。 IDに数値を設定していない場合は…登録した順なのかリソース名の辞書順なのかは…ちょっとわからないです。 # 名前(文字列)で設定したことありませんので…。 http://m--takahashi.com/bbs/pastlog/a4500/A4408.html XP以降だとマニフェストファイルも関係する…んでしょうか。 http://www.atmarkit.co.jp/fdotnet/dotnettips/385appicon/appicon.html

kenji_aki
質問者

お礼

回答ありがとうございます。 なるほど、リソースIDの若いアイコンが反映されるわけですね。 リソースIDに数値振り分けてやってみます。 大変参考になりましたありがとうございました。

関連するQ&A

  • アイコンを左上に表示したい

    今VC++.netでプログラミングの学習をしていて、アイコンをタイトルバーの左上に表示したいのですが、上手くいきません。 下のタスクバーにはアイコンが表示されているのですが、タイトルバーにはデフォルトの窓のようなアイコンしか表示されません。 リソースは、 #define IDI_ICON1 105 となっていて、以下のようにウインドウクラスを設定してあります。 //ウインドウクラス構造体を設定します。 wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = (HICON)LoadImage(hInstance,"IDI_ICON1",IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = "ModelApp"; wcex.lpszClassName = "ModelApp"; wcex.hIconSm = (HICON)LoadImage(hInstance,"IDI_ICON1",IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED); 何かヒントでもいいので、よろしくお願いいたします。

  • LoadIconでエラー 原因は??

    Windowsプログラミング初心者です。 皆さんのお知恵をお貸しください。 Borland C++ 5.5.1でウィンドウアプリケーションを作っているのですが、LoadIconで自作アイコンをロードするとNULLが返ってきてしまいます。 アイコンは32x32 256色、32x32 16色のデバイスを持つ"myapp.ico"と、16x16 256色、16x16 16色のデバイスを持つ"mysmallapp.ico"。(どちらもシェアウェアのアイコンエディタで作成) rcファイルとcppファイルは次のようになっています。 [myapp.rc] MYICON ICON DISCARDABLE "myapp.ico" MYSMALLICON ICON DISCARDABLE "mysmallapp.ico" [myapp.cpp] BOOL InitApp(HINSTANCE hInst) { WNDCLASSEX wc; ... wc.hIcon = LoadIcon(hInst, "MYICON"); // NULLが返る wc.hIconSm = LoadIcon(hInst, "MYSMALLICON"); // NULLが返る ビルドの際にエラーは発生していません。 リソースハッカーでexeを開くと指定したアイコンが組み込まれています。 この状況下でLoadIconがNULLを返す条件はどのようなものが考えられるでしょうか。 OSはWindows 2000Sです。 よろしくお願いします。

  • ページにアイコン スマホ 表示されない

    自分でHPを作っているのですが ソースを <link rel="shortcut icon" href="http://○○/icon.ico"> にして、ページにアイコンを付けたのに、そのサイトをスマホで表示させても アイコンが表示されません。 パソコン上で見ると指定したアイコンが表示されます。 私の持っているスマホでは無理なのでしょうか?

    • ベストアンサー
    • HTML
  • Macで作ったアイコンをWindowsで表示するには

    HP上からデスクトップ用のアイコンをダウンロードしました。sitに圧縮されていたのでStufflt Expander で解凍までできたのですがフォルダ内のアイコンはWindowsのicoファイルではなくIconのままです。Macで作ったアイコンはWindowsで表示できないのでしょうか?知っている方いましたらどうぞよろしくお願い致します。

  • タスクバーに指定したアイコンを表示させるには

    vb.netです。 フォームのiconに、C:\Documentsにあるicoファイルを設定しているのですが、 vb.net起動中にF5でフォームを表示した時にはフォームに指定したアイコンが表示され、タスクバーにも同じアイコンが表示されrるのに、 vb.netを閉じて、ショートカットから起動した同じフォームでは、タスクバーに表示されるアイコンは画像のような感じです。 フォームに表示されるアイコンは、どちらもC:\Documentsにある指定したicoファイルです。 ショートカットから起動した場合でもタスクバーにアイコンを表示させることは可能ですか?

  • CButtonのBMP・アイコンの表示を切替えたい

    今 WinXP VC++6.0 MFC のダイアログベースのソフトで ダイアログリソース上のボタンのプロパティで ビットマップが設定されている状態で ボタンにビットマップ表示→アイコン表示を切替えようと思って HICON CMyButton::SetIconID(UINT iconID) { //スタイル変更 UINT style=GetButtonStyle(); style&=~BS_BITMAP; style|=BS_ICON; SetButtonStyle(style); //ボタンに画像を貼付る HICON hIcon=AfxGetApp()->LoadIcon(iconID); hIcon=SetIcon(hIcon); } としたのですがアイコン表示されませんでした。 アイコンかビットマップかどっちかに すればいいのはわかってるのですが、 SetButtonStyleはCreate後にボタンスタイルを 替えられないんでしょうか?

  • RegisterClassExのエラー原因

       こんにちは。 自分は、今、RegisterClassExでWNDCLASSEX構造体を使い、ウィンドウの登録を行っているのですが 戻り値が0でないにも関わらず、その後のGetLastErrorで値が2になっています。 以下がソースコードです。             DWORD last; // ウィンドウクラス登録 wcx.cbSize = sizeof(WNDCLASSEX); wcx.style = 0; wcx.lpfnWndProc = WndProc; wcx.cbClsExtra = 0; wcx.cbWndExtra = 0; wcx.hInstance = hInstance; wcx.hIcon = (HICON)::LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON,0,0,LR_DEFAULTSIZE); wcx.hCursor = ::LoadCursor(NULL, IDC_ARROW); wcx.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH); wcx.lpszClassName = WindowClassName; wcx.lpszMenuName = NULL; wcx.hIconSm = wcx.hIcon; if(::RegisterClassEx(&wcx) == 0) { return FALSE; } last = GetLastError();// 値が2 どうしてエラーでないのに値が2になるのでしょうか? 値が2だと、指定したファイルが見つからないとでますがどうなんでしょうか?

  • SHGetFileInfoでアイコンが取得できない場合がある

    VC++にてエクスプローラもどきを作成しています。 ListViewへファイルアイコンを表示するために、 SHGetFileInfoを使用し、 // 大きいアイコンのハンドル取得 // fnameは拡張子だけの文字列です SHGetFileInfo( fname, NULL, &shfInfo, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES ); licon = shfInfo.hIcon; 上記のようにしてファイルアイコンを取得し、 CImageListへ追加した上で、描画しています。 そして、ダイアログのサイズが変更された際に、 OnSize関数にて、ListView内のアイコンを再度取得し、 再描画しているのですが、 何度もOnSizeで再描画を行っているうちに、 SHGetFileInfoにて取得したshfInfo.hIconが NULLになってしまいます。 一度、shfInfo.hIconがNULLになると、 何度、SHGetFileInfoを呼んでも、返ってくるhIconは 毎回NULLになってしまい、ListView内に アイコンが表示されません。 SHGetFileInfo関数を呼ぶ際の制約等があるのでしょうか?

  • Win32APIでアイコンファイルを表示したいのですが。

    いつもお世話になっております。 小生、只今WindowsXPSP3上でC言語とWin32APIを使い、BCC5.5.1でコンパイルしながらWindowsプログラミングを勉強しています。 度々の質問で申し訳ございませんが、 今回、アイコンをビットマップと同じ様にクライアント領域に描画しようと思っているのですが、うまく行きません。。。 コードは以下の様になっております。 #include <windows.h> #define BUFSIZ 1024 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE, LPCSTR); BOOL InitInstance(HINSTANCE, int, LPCSTR); int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; LPCSTR szClassName = "アイコンを読み込む"; if(!InitApp(hCurInst, szClassName)){ return FALSE; } if(!InitInstance(hCurInst, nCmdShow, szClassName)){ return FALSE; } while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){ if(bRet == -1){ MessageBox(NULL, "GetMessage Error", "Error", MB_OK); break; } else{ TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } //ウィンドウクラスの登録 ATOM InitApp(HINSTANCE hInst, LPCSTR szClassName) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); return (RegisterClassEx(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow, LPCSTR szClassName) { HWND hWnd; hWnd = CreateWindow( szClassName, "Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if(!hWnd){ return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { //デバイスコンテキスト HDC hdc; //メモリデバイスコンテキスト static HDC memDC; //画像(アイコン)を扱う変数 static HICON hIcon; //画像情報(アイコン)を扱う変数 static BITMAP bmp; static ICONINFO ici = {TRUE}; //アイコンの幅、高さを格納する変数、バッファ static int x, y; //描画情報を格納する構造体 PAINTSTRUCT ps; switch(msg){ case WM_CREATE: memDC = CreateCompatibleDC(NULL); hIcon = (HICON)LoadImage( NULL, "Linux.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE); if(hIcon == NULL){ MessageBox(hWnd, "It failed in reading the icon file.", "Error", MB_OK | MB_ICONWARNING); return 0; } GetIconInfo(hIcon, &ici); GetObject(ici.hbmColor, sizeof(bmp), &bmp); x = bmp.bmWidth; y = bmp.bmHeight; SelectObject(memDC, hIcon); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); BitBlt(hdc, 0, 0, x, y, memDC, 0, 0, SRCCOPY); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteDC(memDC); DeleteObject(hIcon); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } 以上です。 本当に度々の質問で申し訳ございませんが、 お忙しい中、申し訳ございませんが、 先輩方、アドバイス宜しくお願いします。

  • ファイルに関連付けられているアイコンについて

    ファイルに関連付けられているアイコン取得について質問です。 開発環境 OS:XP Visual Studio 2005 言語:C、C++ 調べると、SHGetFileInfo()を使ってアイコンを 取得出来るらしいのですが、 取得するアイコンではなく違うアイコンが取得(表示)されます。 架空のファイル名(実際にないファイル名)でやってみると、 同じアイコンが取得(表示)されます。 ●ソース ーーーーーーーーーーーーーーーーー //アイコン取得部分 SHGetFileInfo("C:/WINDOWS/notepad.exe", 0, &icon, sizeof(icon), SHGFI_PIDL | SHGFI_ICON | SHGFI_SMALLICON); //アイコン表示部分 DrawIcon(hdc, 10, 10, icon.hIcon); ーーーーーーーーーーーーーーーーー SHGetFileInfo()の戻り値は、「1」でした。 間違っている所があるのでしょうか?

専門家に質問してみよう