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

このQ&Aのポイント
  • WinXP VC++6.0 MFCのダイアログベースのソフトで、ダイアログリソース上のボタンのプロパティでビットマップが設定されている状態で、ボタンにビットマップ表示→アイコン表示を切替えようと思った。しかし、SetButtonStyleはCreate後にボタンスタイルを替えることができないようだ。
  • CMyButtonクラスのSetIconID関数内で、ボタンのスタイルを変更してアイコン表示に切り替えようとしたが、アイコンが表示されなかった。
  • ボタンにはアイコンかビットマップのどちらかを設定する必要があり、SetButtonStyleを使ってスタイルを変更する方法では、Create後にスタイルの変更ができないため、うまくいかなかった。
回答を見る
  • ベストアンサー

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後にボタンスタイルを 替えられないんでしょうか?

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

  • ベストアンサー
回答No.1

 こんばんは。  XP上でVisual Studio 2008にて試してみましたが、無理なようです。  SetButtonStyle()メソッドの代わりにModifyStyle()メソッドを使用してみたところ、出来ました。  以下参考程度に。 HICON CMyButton::SetIconID(UINT iconID) { //スタイル変更 this->ModifyStyle(BS_BITMAP, BS_ICON); //ボタンに画像を貼付る HICON hIcon = AfxGetApp()->LoadIcon(iconID); hIcon = this->SetIcon(hIcon); return hIcon; }

alna_sag
質問者

お礼

回答有難うございます。 CWndにModifyStyleという関数があったのですね。 VC++6.0 MFCでも 下記コードでリソース上でBS_BITMAPからもBS_TEXTからも動きました。 有難うございました。 HICON CMyButton::SetIconID(UINT iconID) { UINT style=GetButtonStyle(); //スタイルをアイコンにする if(style&BS_BITMAP) //ビットマップの場合 { HBITMAP hBitmap = GetBitmap(); if(hBitmap) ::DeleteObject(hBitmap); ModifyStyle(BS_BITMAP,BS_ICON); } else if (style&BS_ICON) ;//アイコンの場合は何も変えない else ModifyStyle(BS_TEXT,BS_ICON);//アイコンでもビットマップでも無い場合 //ボタンに画像を貼付る HICON hIcon=AfxGetApp()->LoadIcon(iconID); hIcon=SetIcon(hIcon); return hIcon; }

関連するQ&A

  • サイズ変更枠ダイアログのタイトルバー左端のアイコンを消す

    VC++2005、MFCにてプログラムを作成しています。 サイズ変更枠のダイアログには、デフォルトでタイトルバーの左端に、 小さいウィンドウのようなアイコンが表示されますが、 クローズボックスは表示したままで、アイコンだけを消したいのです。 (よってプロパティのSystemMenuの値はTrueで固定) 自分で調べた方法で、 1.m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); を消す。 2.OnInitDialog()中で次の2行を消す。 SetIcon(m_hIcon, TRUE); // 大きいアイコンを設定 SetIcon(m_hIcon, FALSE); // 小さいアイコンを設定 とありますが、どちらも不可能でした。 ※IDR_MAINFRAMEがソースに存在しない、OnIni内にSetIconが存在しない等 GetWindowStyle()を利用すれば実現できるとも聞いたのですが、 使い方が分からず、手が出せない状況です。 もし実現させる方法をご存知の方おられましたら、ご教示お願い致します。

  • ボタンのアイコン表示

    開発環境:Vista Visual Studio2012 C言語 CreateWindowで作成したボタンを、アイコン表示にしたいのですけれど上手くいきません。 どこが悪いのでしょうか? HWND CreatePushButton(HWND hwnd, int x, int y, int w, int h, LPCTSTR caption, int id) {     return CreateWindow(         _T("BUTTON"),         caption,         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_ICON ;         x, y,         w, h,         hwnd,         (HMENU)(INT_PTR)id,         G_hInst,         NULL         ); } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {    static HWND     hButton;    static HICON     m_hIcon;    switch (uMsg) {      case WM_CREATE: //ウィンドウが作られたとき         hButtonREC = CreatePushButton( hwnd,                               20, 20,                               80, 40,                                _T("テスト"),                               ID_BUTTON  );         m_hIcon = LoadIcon( NULL , IDI_ERROR );         SendDlgItemMessage( hButtonREC,                       ID_BUTTON_RCE,                       BM_SETIMAGE,                       IMAGE_ICON,                       (LPARAM)m_hIcon); }

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

    今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); 何かヒントでもいいので、よろしくお願いいたします。

  • [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ファイルのアイコンとして表示されるのだと認識しているのですが なぜ、描画用にしようしたアイコンが表示されてしまうのでしょう? 解決するための方法や参考になるサイトなどあればご教示ください。

  • C#でウィンドウのアイコン取得する方法

    タスクマネージャのアプリケーションタブに 起動しているアプリケーション名とアイコンが一覧で表示されている部分のように 小さいアイコンを取得したいんですがなかなかうまくいきません。 ファイルに紐付くアイコンと解釈していただいても構いません。 とりあえず、下記のWin32 APIの処理を利用してみましたが SHGetFileInfoだけしかうまくいきませんでした。 しかし、SHGetFileInfoも、アイコンは取得できますがこれはファイルに紐付くアイコンではなく 実行体(EXE)に紐付くアイコンで表示されてしまいました。 開いているウィンドウ情報からだと実行プロセスのEXEのパスしか分からないからです。 ★質問★: ファイルに紐付く小さいアイコンの取得方法を教えてください!できればサンプルソース込みだと助かります。 #region 小さいアイコンを取得するためのWin32 API(ファイルパスから) // SHGetFileInfo関数 [DllImport("shell32.dll")] private static extern IntPtr SHGetFileInfo( string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); // SHGetFileInfo関数で使用するフラグ private const uint SHGFI_ICON = 0x100; // アイコン・リソースの取得 private const uint SHGFI_LARGEICON = 0x0; // 大きいアイコン private const uint SHGFI_SMALLICON = 0x1; // 小さいアイコン private const uint SHGFI_TYPENAME = 0x400;//ファイルの種類 // SHGetFileInfo関数で使用する構造体 private struct SHFILEINFO { public IntPtr hIcon; public IntPtr iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; }; #endregion #region 小さいアイコンを取得するためのWin32 API(ウィンドウハンドルからその1) [DllImport("user32.dll", EntryPoint = "GetClassLong")] public static extern IntPtr GetClassLongPtr32(IntPtr hWnd, int nIndex); [DllImport("user32.dll", EntryPoint = "GetClassLongPtr")] public static extern IntPtr GetClassLongPtr64(IntPtr hWnd, int nIndex); const int GCL_HICON = (-14); const int GCL_HICONSM = (-34); #endregion #region 小さいアイコンを取得するためのWin32 API(ウィンドウハンドルからその2) [DllImport("User32.dll", EntryPoint = "SendMessage")] public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); public const int WM_GETICON = 0x7F; public const int WM_SETICON = 0x80; public const int ICON_SMALL = 0; public const int ICON_BIG = 1; #endregion

  • 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関数を呼ぶ際の制約等があるのでしょうか?

  • c言語を使いダイアログにbmpを表示したい 

    はじめまして、 私は、c言語は初心者なのでが、ダイアログボックスに、画像(bmp)が表示することができません。 ソースは、 hdc = BeginPaint(hDlg, &ps); //指定ウィンドウ内での描写準備 // ビットマップをファイルからロードする hBitmap = ::LoadBitmap( NULL, _T("test.bmp") ); // ウィンドウのデバイスコンテキストハンドルを取得する hDC = GetDC( hDlg ); // メモリデバイスコンテキストを作成する hCompatDC = CreateCompatibleDC( hDC ); // ロードしたビットマップを選択する GetObject(hBitmap, sizeof(BITMAP), &bmp); // ビットマップをウィンドウに転送する(表示する) if(hBitmap != NULL){ StretchBlt( hDC, 0, 0, 100, 100, hCompatDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY ); SendDlgItemMessage( hDlg, IDC_STATIC, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap); } なのですが、これはメインウィンドウでは動くのですが、ダイアログボックスでは動かずこまっています。 どうか、助言のほどよろしくお願いします。

  • タイトルバーの小さいアイコンを指定したい

    初心者質問ですみません。 //resource.h #define IDI_MYICON 101 //main.cpp WNDCLASSEX wc; wc.hIcon = LoadIcon(m_hInst,MAKEINTRESOURCE(IDI_MYICON)); wc.hIconSm = LoadIcon(m_hInst,MAKEINTRESOURCE(IDI_MYICON)); とやっているのですがEXEファイルのほうはアイコンが変わっているのにタイトルバーのサムネイルがなぜか「黄色い三角形の中にびっくりマーク」になっています。 IDI_MYICONを102と定義すると「噴出しの中にはてなマーク」が表示されます。 デバッグでhIconとhIconSmの中身を見たところ同じ値が入っているので関数が失敗しているわけではなさそうです。 にもかかわらずタイトルバーのサムネイルとEXEのアイコンが違うのはなぜでしょうか。 わかる方よろしくお願いします。

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

    ファイルに関連付けられているアイコン取得について質問です。 開発環境 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」でした。 間違っている所があるのでしょうか?

  • VC++ダイアログボックスの表示更新がわかりません

    現在ダイアログボックスにスタティックコントロールを配置し、表示更新する際不明な点があります。VC6.0 MFCです。 1、ダイアログボックス上のコントロールに、作成したビットマップを表示させる際、OnInitDialog関数内で、Bitbiltしていますが、表示されません。 ボタンクリックイベント等で、同様の手順でBitbiltすると表示されます。 これはなぜなのでしょうか? また、ダイアログボックスが表示された際にBitmapを表示するにはどうすればよいでしょうか? 2、また、表示されたBitmapはダイアログボックスを動かしたり、隠れたりすると消えてしまいます。 再表示を自動的にさせるにはどうすればよいでしょうか?(OnDraw関数のようなものがあるのでしょうか?) 初歩的な質問で申し訳ありませんが、よろしくお願いいたします。