問題タブ [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.
winapi - ATL/WTL 代替メッセージ マップ (ALT_MSG_MAP) はどのように機能しますか? いつ使用しますか?
ALT_MSG_MAP
ATL は、マクロで宣言された代替メッセージ マップをサポートします。
各代替メッセージ マップは、 に渡す一意の番号によって識別されますALT_MSG_MAP
。
代替メッセージ マップを使用すると、複数のウィンドウのメッセージを 1 つのマップで処理できます。
デフォルトでは、CWindowImpl
は代替メッセージ マップを使用しないことに注意してください。
このサポートを追加するには、派生クラスのWindowProc
メソッドをオーバーライドし、メッセージ マップ識別子を使用して呼び出します。CWindowImpl
ProcessWindowMessage
WTL を見ると、次のようなメッセージ マップが表示されます。
しかし、私は理解していません:
彼らがどのように呼ばれるか。(コードは代替メッセージ マップの存在をどのように認識しますか?)
デフォルトのメッセージ マップとの違い。それらはすべて、同じウィンドウに対して同じ種類のメッセージを処理しているように見えます...
なぜ便利なのか。(とにかく、それらはすべて同じウィンドウ用ではありませんか?)
代替メッセージマップが何をするかについて、誰かがより良い説明を持っていますか?
(なぜそれらが発明されたのかについての動機は非常に役に立ちます。)
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のこの関数にパラメーターとしてボタンテキストを渡すにはどうすればよいですか?
mfc - ON_UPDATE_COMMAND_UI メッセージのキャッチとリダイレクト
(親)内に (子)をCMDIChildWnd
含む があります。には、子ビューに送信するツールバーもあります。それはこれまでのところうまくいきます。これで、がアクティブ化される (たとえば、クリックする)たびに、メッセージは 親 ではなく に到着します。CReportView
CFormView
CMDIChildWnd
ON_UPDATE_COMMAND_UI
CReportView
ON_UPDATE_COMMAND_UI
CReportView
CFormView
私が今やりたいことはON_UPDATE_COMMAND_UI
、子ビューでメッセージをキャッチし、何らかの形で親ビューに中継することです。メソッドをオーバーライドしCWnd::PreTranslateMessage()
て親ビューのSendMessage()
メソッドを呼び出してみましたが、ON_UPDATE_COMMAND_UI
そこに到達しませんでした。
私も次のことを試しました
しかし、それもうまくいきませんでした。誰にもアイデアはありますか?
c++ - MFC - プロパティが変更されるたびに特定のメソッドを実行する方法
数日前、私のデータベースのクライアントとして機能する MFC アプリケーションの開発を開始しました。最近、プロパティウィンドウでプロパティ値が変更されるたびに実行されるメソッド(できればコンボボックスとして機能するフィールド)を実装しようとしていました。私の最初の試みは、CMFCPropertyGridProperty::OnUpdateValue()
. このメソッドを適切に「実装」することはできましたが、期待どおりには機能しませんでした (ここでの主な問題は、CProperties クラスに直接実装しなかったことだと思いますが、他の参照は見つかりませんでしたインターネット)。
そこで、メッセージ マップに基づくコマンドに移りました。、 、 などON_CONTROL_REFLECT
、さまざまな種類のコマンドを試しましたが、どれも役に立たないようです。主なプロパティ (これらの前のコマンドの最初の引数) を定義する際に大きな間違いを犯したのか、それともクラス専用のコマンドなのかはわかりません。つまり、これらのコマンドは現在のプロパティ グリッドには役に立たないように見えました。これまで使用した唯一の「コンボボックス」は、メソッド CMFCPropertyGridProperty::AddOption() が使用されたときに生成されるものだからです (重要な注意: 私の全体プロパティ グリッドは、基本的に CMFCPropertyGridProperty オブジェクトによって形成されます)。CBN_EDITCHANGE
CBN_EDITUPDATE
CCombobox
とにかく、疑問に対する答えとこの問題の解決策は簡単だと思いますが、私はまだ C++ と MFC の初心者です...
visual-c++ - EN_KILLFOCUS を無視して CANCEL ボタンをクリックするとダイアログを閉じる
を実装したダイアログに CEdit フィールドがあるEN_KILLFOCUS
ため、ユーザーが無効なデータを入力すると、フォーカスがこのフィールドから離れ、フォーカスが CEdit フィールドに戻ったときに警告メッセージが表示され、ユーザーが適切なデータを入力できるようになります。ユーザーが無効なデータを入力して CANCEL ボタンをクリックすると、警告メッセージも表示されます。ユーザーが [キャンセル] ボタンをクリックしたときに PostQuitMessage を実装しようとしましたが、これによりアプリケーション全体が閉じます。ユーザーが [キャンセル] ボタンをクリックしたときにダイアログのみを閉じたい。[キャンセル] ボタンをクリックした後、すぐにダイアログを閉じる方法はありますか。これは私が試したコードです。
visual-c++ - void を返す関数を受け入れる ON_COMMAND_EX バージョンは存在しますか?
探しましたが見つかりませんでした。メニュー項目のコマンド アクションを、数値 ID を受け取り、何も返さない (void である) 関数にリンクするメッセージ マップ マクロが必要です。
ON_COMMAND
void を返しますが、この場合に必要なメニュー項目 ID が提供されないため、制限が多すぎます。
ON_COMMAND_EX
を返すBOOL
ので、戻り値の型が void の場合は不要な、多くの戻り値を実行する必要があります。
では、最初の段落で説明したように、そのようなマクロはありますか?
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 にハンドラを追加することは不可能ですか? ないことを願っています。
私に何かアドバイスをください。ありがとうございました。