4

CMFCMenuButton を既存の MFC アプリケーションに追加しようとしたときに、この問題に遭遇しました。それは適切に機能し、ドロップダウン矢印に合わせてボタンのサイズを変更しました。しかし、それはドロップダウン矢印を描画しませんでした。ボタンの上にカーソルを置くと、次のデバッグ出力が表示されました。

> Can't load bitmap: 42b8.GetLastError() = 716
> CMenuImages. Can't load menu images 3f01

Visual Studio 2010 RTM でも、まったく新しい MFC ダイアログ ベースのアプリケーションを作成すると、CMFCMenuButton が矢印を描画せず、同じエラーが表示されることが判明しました。最初は、何かが正しくインストールまたは登録されていないと思いました。ただし、MFC Feature Pack の NewControls の例では、ドロップダウン矢印が完全に表示されました。

何が欠けている?

4

2 に答える 2

7

この質問を投稿した理由は、Googleで回答が見つからなかったためです。それを調査したときに私が最も近かったのは、実際の解決策ではないように思われるいくつかのハックでした。NewControlsの例を注いだ後、私はついに犯人を見つけました。

プロジェクトのデフォルトの.rcファイルの下部には、次のコードがあります。

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "res\YOUR_PROJECT_NAME.rc2"  // non-Microsoft Visual C++ edited resources
#include "afxres.rc"      // Standard components
#endif

NewControlsの例の.rcファイルは次のようになります。

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "res\NewControls.rc2"  // non-Microsoft Visual C++ edited resources
#include "afxres.rc"      // Standard components
#ifndef _AFXDLL
#include "afxribbon.rc"      // Ribbon and control bars
#endif
#endif

afxribbon.rcを追加すると、MFC機能パックの更新でコントロールに必要なビットマップリソースが有効になります。これで、不足しているコードを.rcファイルの最後に単純に追加することはできません。これを行うと、ビジュアルデザイナを使用してリソースファイルを編集するたびに、追加したコードが削除されます。この問題の解決策は、これをYOUR_PROJECT_NAME.rc2ファイルの最後に追加することです。

#ifndef _AFXDLL
#include "afxribbon.rc"      // Ribbon and control bars
#endif

ファイルの下部に空の行があることを確認してください。そうしないと、リソースコンパイラが文句を言います。NewControlsサンプルプロジェクトのように、ビジュアルデザイナーがafxribbon.rcを自動的に含めるために、どの設定を調整する必要があるかわかりません。しかし、それを.rc2に追加すると、問題が解決するようです。


アップデート

IDEを使用してRCファイルを変更できることに注意してください。

  • RCファイルを右クリックし、[リソースに含まれるもの... ]を選択します。

RCファイルを右クリック

  • 新しいコードをコンパイル時ディレクティブ領域に貼り付けます。

ウィンドウに貼り付けられたコード

于 2010-06-30T17:34:12.460 に答える
1

私はこの問題を次のように自分で解決します: に句を追加しCMyApp::InitInstanceます:

BOOL CMyApp::InitInstance()
{
    CWinAppEx::InitInstance();

    InitCommonControls();

    //This! 
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

    //...
    return TRUE;
}
于 2011-07-20T13:36:00.247 に答える