問題タブ [message-map]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1664 参照

winapi - ATL/WTL 代替メッセージ マップ (ALT_MSG_MAP) はどのように機能しますか? いつ使用しますか?

ドキュメント読みました。次のように書かれています。

ALT_MSG_MAPATL は、マクロで宣言された代替メッセージ マップをサポートします。
各代替メッセージ マップは、 に渡す一意の番号によって識別されますALT_MSG_MAP
代替メッセージ マップを使用すると、複数のウィンドウのメッセージを 1 つのマップで処理できます。
デフォルトでは、CWindowImplは代替メッセージ マップを使用しないことに注意してください。
このサポートを追加するには、派生クラスのWindowProcメソッドをオーバーライドし、メッセージ マップ識別子を使用して呼び出します。CWindowImplProcessWindowMessage

WTL を見ると、次のようなメッセージ マップが表示されます。

しかし、私は理解していません:

  • 彼らがどのように呼ばれるか。(コードは代替メッセージ マップの存在をどのように認識しますか?)

  • デフォルトのメッセージ マップとの違い。それらはすべて、同じウィンドウに対して同じ種類のメッセージを処理しているように見えます...

  • なぜ便利なのか。(とにかく、それらはすべて同じウィンドウ用ではありませんか?)

代替メッセージマップが何をするかについて、誰かがより良い説明を持っていますか?
(なぜそれらが発明されたのかについての動機は非常に役に立ちます。)

0 投票する
2 に答える
3325 参照

c++ - MFCメッセージマップ関数on_commandに値を渡す方法

受け取ったstd::string値に応じて特定のアクションを実行する関数があります。

例えば:

void PerformTaskOnStringValue(std :: string);

これで、ボタンのクリック時にそれぞれのテキストを値として渡すことによってこの関数を呼び出す必要がある一連のリボンボタン(CMFCRibbonButton)ができました。

これらのボタンのIDを、ボタンIDを使用してメッセージマップマクロon_commandにマップしました。すべてのボタンは1つの共通IDを共有します-例-

ID_RIBBON_BUTTON_ID

メッセージマップは以下の通りです

ON_COMMAND(ID_RIBBON_BUTTON_ID、&MyClass :: performanceTaskOnStringValue);

ButtonClickのこの関数にパラメーターとしてボタンテキストを渡すにはどうすればよいですか?

0 投票する
1 に答える
1834 参照

mfc - ON_UPDATE_COMMAND_UI メッセージのキャッチとリダイレクト

(親)内に (子)をCMDIChildWnd含む があります。には、子ビューに送信するツールバーもあります。それはこれまでのところうまくいきます。これで、がアクティブ化される (たとえば、クリックする)たびに、メッセージは 親 ではなく に到着します。CReportViewCFormViewCMDIChildWndON_UPDATE_COMMAND_UICReportViewON_UPDATE_COMMAND_UICReportViewCFormView

私が今やりたいことはON_UPDATE_COMMAND_UI、子ビューでメッセージをキャッチし、何らかの形で親ビューに中継することです。メソッドをオーバーライドしCWnd::PreTranslateMessage()て親ビューのSendMessage()メソッドを呼び出してみましたが、ON_UPDATE_COMMAND_UIそこに到達しませんでした。

私も次のことを試しました

しかし、それもうまくいきませんでした。誰にもアイデアはありますか?

0 投票する
0 に答える
436 参照

c++ - MFC - プロパティが変更されるたびに特定のメソッドを実行する方法

数日前、私のデータベースのクライアントとして機能する MFC アプリケーションの開発を開始しました。最近、プロパティウィンドウでプロパティ値が変更されるたびに実行されるメソッド(できればコンボボックスとして機能するフィールド)を実装しようとしていました。私の最初の試みは、CMFCPropertyGridProperty::OnUpdateValue(). このメソッドを適切に「実装」することはできましたが、期待どおりには機能しませんでした (ここでの主な問題は、CProperties クラスに直接実装しなかったことだと思いますが、他の参照は見つかりませんでしたインターネット)。

そこで、メッセージ マップに基づくコマンドに移りました。、 、 などON_CONTROL_REFLECT、さまざまな種類のコマンドを試しましたが、どれも役に立たないようです。主なプロパティ (これらの前のコマンドの最初の引数) を定義する際に大きな間違いを犯したのか、それともクラス専用のコマンドなのかはわかりません。つまり、これらのコマンドは現在のプロパティ グリッドには役に立たないように見えました。これまで使用した唯一の「コンボボックス」は、メソッド CMFCPropertyGridProperty::AddOption() が使用されたときに生成されるものだからです (重要な注意: 私の全体プロパティ グリッドは、基本的に CMFCPropertyGridProperty オブジェクトによって形成されます)。CBN_EDITCHANGECBN_EDITUPDATECCombobox

とにかく、疑問に対する答えとこの問題の解決策は簡単だと思いますが、私はまだ C++ と MFC の初心者です...

0 投票する
1 に答える
956 参照

visual-c++ - EN_KILLFOCUS を無視して CANCEL ボタンをクリックするとダイアログを閉じる

を実装したダイアログに CEdit フィールドがあるEN_KILLFOCUSため、ユーザーが無効なデータを入力すると、フォーカスがこのフィールドから離れ、フォーカスが CEdit フィールドに戻ったときに警告メッセージが表示され、ユーザーが適切なデータを入力できるようになります。ユーザーが無効なデータを入力して CANCEL ボタンをクリックすると、警告メッセージも表示されます。ユーザーが [キャンセル] ボタンをクリックしたときに PostQuitMessage を実装しようとしましたが、これによりアプリケーション全体が閉じます。ユーザーが [キャンセル] ボタンをクリックしたときにダイアログのみを閉じたい。[キャンセル] ボタンをクリックした後、すぐにダイアログを閉じる方法はありますか。これは私が試したコードです。

0 投票する
2 に答える
191 参照

visual-c++ - void を返す関数を受け入れる ON_COMMAND_EX バージョンは存在しますか?

探しましたが見つかりませんでした。メニュー項目のコマンド アクションを、数値 ID を受け取り、何も返さない (void である) 関数にリンクするメッセージ マップ マクロが必要です。

ON_COMMANDvoid を返しますが、この場合に必要なメニュー項目 ID が提供されないため、制限が多すぎます。

ON_COMMAND_EXを返すBOOLので、戻り値の型が void の場合は不要な、多くの戻り値を実行する必要があります。

では、最初の段落で説明したように、そのようなマクロはありますか?

0 投票する
1 に答える
116 参照

events - ON_COMMAND ハンドラを追加した後も、メニュー項目は無効のままです

Visual Studio 2013 を使用して単純な分割ウィンドウ アプリケーションを作成しました。2 つのビューがあり、1 つのビューは default-view-class で作成され、もう 1 つのビューは から派生した custom-view-class で作成されCScrollViewます。

このスプリッターは正常に動作します。

ON_COMMANDこの問題は、メニュー項目の 1 つにハンドラを追加しようとしたときに発生します。ON_COMMANDハンドラーを default-view-class に配置しても問題はありません。メニュー項目がうまくクリックされ、ハンドラーが機能します。

しかし、ON_COMMANDハンドラーを custom-view-class に配置すると、メニュー項目がまったく有効になりません。

カスタムビュークラスにメッセージマップを適切に実装するためにすべてを行ったと思います。

DECLARE_MESSAGE_MAP()間違いなく MyCustomView.h にあります。もちろん、 MyCustomView.cpp ファイルBEGIN_MESSAGE_MAPに ,END_MESSAGE_MAP()ペアを追加しました。

それでも、メニュー項目はまったく有効になりません。灰色のままです。

私はできる限りグーグルで検索しましたが、今まで誰もこのような経験をしたことがないようです. ON_COMMANDそもそも、custom-view-class にハンドラを追加することは不可能ですか? ないことを願っています。

私に何かアドバイスをください。ありがとうございました。