質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3250閲覧

MFC メニューアイコンをグレイ時もカラーで表示したい

kamekawashinta

総合スコア39

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/23 08:33

編集2020/01/23 10:28

https://www.codeproject.com/articles/16529/simple-menus-that-display-icons-minimalistic-appro?fid=362424&df=90&mpp=10&prof=True&sort=Position&view=Expanded&spc=Compact&fr=31

WindowsでMFCを使用してとあるGUIアプリケーションを作成しています。

そこで上記URLの手法でメニュー項目ににアイコンを設定しています

その場合、メニュー項目をグレイにしていると、アイコンまでグレイ化します。
グレイ時でもカラーのアイコンが表示されるようにしたいと思います。

どなたかご存じの方いらっしゃいますでしょうか?
よろしくお願いいたします。

下記は上記URLからの引用です

C++

1afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpdis); 2afx_msg void OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu); 3afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpmis); 4 HMENU GetIconForItem(UINT itemID) const; 5 6 78ON_WM_DRAWITEM() 9ON_WM_MEASUREITEM() 10ON_WM_INITMENUPOPUP() 11 12HICON CMainFrame::GetIconForItem(UINT itemID) const 13{ 14 HICON hIcon = (HICON)0; 15 16 if (IS_INTRESOURCE(itemID)) 17 { 18 hIcon = (HICON)::LoadImage(::AfxGetResourceHandle(), 19 MAKEINTRESOURCE(itemID), IMAGE_ICON, 0, 0, 20 LR_DEFAULTCOLOR | LR_SHARED); 21 } 22 23 if (!hIcon) 24 { 25 CString sItem; // look for a named item in resources 26 27 GetMenu()->GetMenuString(itemID, sItem, MF_BYCOMMAND); 28 sItem.Replace(_T(' '), _T('_')); 29 // cannot have resource items with space in name 30 31 if (!sItem.IsEmpty()) 32 hIcon = (HICON)::LoadImage(::AfxGetResourceHandle(), sItem, 33 IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_SHARED); 34 } 35 return hIcon; 36} 37 38void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpdis) 39{ 40 if ((lpdis==NULL)||(lpdis->CtlType != ODT_MENU)) 41 { 42 CFrameWnd::OnDrawItem(nIDCtl, lpdis); 43 return; //not for a menu 44 } 45 46 HICON hIcon = GetIconForItem(lpdis->itemID); 47 if (hIcon) 48 { 49 ICONINFO iconinfo; 50 ::GetIconInfo(hIcon, &iconinfo); 51 52 BITMAP bitmap; 53 ::GetObject(iconinfo.hbmColor, sizeof(bitmap), &bitmap); 54 ::DeleteObject(iconinfo.hbmColor); 55 ::DeleteObject(iconinfo.hbmMask); 56 57 ::DrawIconEx(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, 58 hIcon, bitmap.bmWidth, bitmap.bmHeight, 0, NULL, DI_NORMAL); 59// ::DestroyIcon(hIcon); // we use LR_SHARED instead 60 } 61} 62 63void CMainFrame::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu) 64{ 65 AfxTrace(_T(__FUNCTION__) _T(": %#0x\n"), pMenu->GetSafeHmenu()); 66 CFrameWnd::OnInitMenuPopup(pMenu, nIndex, bSysMenu); 67 68 if (bSysMenu) 69 { 70 pMenu = GetSystemMenu(FALSE); 71 } 72 MENUINFO mnfo; 73 mnfo.cbSize = sizeof(mnfo); 74 mnfo.fMask = MIM_STYLE; 75 mnfo.dwStyle = MNS_CHECKORBMP | MNS_AUTODISMISS; 76 pMenu->SetMenuInfo(&mnfo); 77 78 MENUITEMINFO minfo; 79 minfo.cbSize = sizeof(minfo); 80 81 for (UINT pos=0; pos < pMenu->GetMenuItemCount(); pos++) 82 { 83 minfo.fMask = MIIM_FTYPE | MIIM_ID; 84 pMenu->GetMenuItemInfo(pos, &minfo, TRUE); 85 86 HICON hIcon = GetIconForItem(minfo.wID); 87 88 if (hIcon && !(minfo.fType & MFT_OWNERDRAW)) 89 { 90 AfxTrace(_T("replace for \"%s\" id=%u width=%d\n"), 91 (LPCTSTR)sItem, (WORD)minfo.wID, 0); // size.cx); 92 93 minfo.fMask = MIIM_FTYPE | MIIM_BITMAP; 94 minfo.hbmpItem = HBMMENU_CALLBACK; 95 minfo.fType = MFT_STRING; 96 97 pMenu->SetMenuItemInfo(pos, &minfo, TRUE); 98 } 99 else 100 AfxTrace(_T("keep for %s id=%u\n"), (LPCTSTR)sItem, (WORD)minfo.wID); 101// ::DestroyIcon(hIcon); // we use LR_SHARED instead 102 } 103} 104 105void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpmis) 106{ 107 if ((lpmis==NULL)||(lpmis->CtlType != ODT_MENU)) 108 { 109 CFrameWnd::OnMeasureItem(nIDCtl, lpmis); //not for a menu 110 return; 111 } 112 113 lpmis->itemWidth = 16; 114 lpmis->itemHeight = 16; 115 116 CString sItem; 117 GetMenu()->GetMenuString(lpmis->itemID, sItem, MF_BYCOMMAND); 118 119 HICON hIcon = GetIconForItem(lpmis->itemID); 120 121 if (hIcon) 122 { 123 ICONINFO iconinfo; 124 ::GetIconInfo(hIcon, &iconinfo); 125 126 BITMAP bitmap; 127 ::GetObject(iconinfo.hbmColor, sizeof(bitmap), &bitmap); 128 ::DeleteObject(iconinfo.hbmColor); 129 ::DeleteObject(iconinfo.hbmMask); 130 131 lpmis->itemWidth = bitmap.bmWidth; 132 lpmis->itemHeight = bitmap.bmHeight; 133 134 AfxTrace(_T(__FUNCTION__) _T(": %d \"%s\"%dx%d ==> %dx%d\n"), 135 (WORD)lpmis->itemID, (LPCTSTR)sItem, bitmap.bmWidth, 136 bitmap.bmHeight, lpmis->itemWidth, lpmis->itemHeight); 137 } 138} 139
ICONS ICON "res\lock.ico" ... IDR_MAINFRAME MENU BEGIN POPUP "&File" BEGIN POPUP "Icons"

改めて、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2020/01/23 09:01

デモプロジェクトでは無効状態でもグレーっぽいアイコンが出ているようですが、画像の問題なのかプログラムの問題なのか切り分けはできていますか?
kamekawashinta

2020/01/23 10:28

申し訳ないのですが、タイトル及び内容を修正いたしました。 メニュー項目をグレイにしていると、アイコンまでグレイ化するので グレイ時でもカラーのアイコンが表示されるようにしたいと思います。
guest

回答1

0

ベストアンサー

デフォルトのふるまいとは異なるのであれば、
オーナードローよーするに「すべてのふるまいを自分で書く」ことになると思われます。

※ かなりメンドクサイっすよ?

投稿2020/01/23 11:48

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問