2

「背景」や静的テキストなど、ダイアログ ウィンドウの任意の場所をクリックすると、関数 OnLButtonDown() が起動されます。しかし、ListBox/EditBox/Combo/Calendar/Checkbox などをクリックしても起動しません。これらには制御変数がアタッチされていて、静的テキストにはアタッチされていないためだと思いました。しかし、ダイアログに新しいリストボックスを追加してテストすると、どちらも起動しないことがわかり、混乱しています...

Class Wizard で OnLButtonDown() を追加しました。次の場所に表示されます。

BEGIN_MESSAGE_MAP(CMFCTesting2Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
// other handlers, etc
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

私の機能:

void CMFCTesting2Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    AfxMessageBox(CString("BUTTON DOWN"));
    CDialogEx::OnLButtonDown(nFlags, point);
}

AfxMessageBox の前に CDialogEx:: ... を呼び出してみましたが、結果は同じです。

他の投稿でいくつかのアドバイスを見たように、CListBox アイテムには Notify オプションが True に設定されています。

WM 通知メッセージが ListBox によって何らかの方法でキャプチャされ、CMFCTesting2Dlg に「転送」されていないと思われますが、これは ListBox で Notify オプションを True に設定すると発生するはずだと理解しました。(まあ、明らかにそうではありません...)

申し訳ありませんが、MFC で WM を扱うのは初めてです。

ところで、私は Visual Studio 2010 Ultimate を使用しています。これは Visual C++ - MFC- MFC アプリケーション - ダイアログ ベースのプロジェクトです。

リストボックス/コンボ/などをクリックした場合、このマウスダウンイベントをキャプチャするにはどうすればよいですか?

LONG STORYでは、私は実際にこの問題を達成しようとしています.2つのリストボックスがあり(たとえば)、それらを同期的にスクロールしたい. )。そして、マウスダウンですべてのリストボックスの位置を追跡し(GetTopIndexを使用)、マウスアップでGetTopIndexを再度使用して以前のものと比較することを考えました。変更が行われた場合、リストボックスがスクロールされ、すべてのリストボックスが SetTopIndex で更新されます。ユーザーにとっては友好的ではありませんが、私にとってはより簡単な解決策は、この検証/更新を行うボタンをクリックすることですが、まったくエレガントではなく、同じレベルでしか設定できませんが、どれがどちらであったかを判断できません前回スクロールしました。このリストボックスの自動スクロールは、表示のためだけに行う必要があります。リストボックスでの選択は重要ではありません。リストボックスの追加イベントハンドラーでメッセージタイプを使用しようとしましたが、リストボックス内の項目がクリックされた場合にのみ、スクロールバーがドラッグされた場合にのみ、KillFocus と SetFocus が発生しません。 ..そして、イベントハンドラーの追加から、他のメッセージタイプでも成功しませんでした。

4

2 に答える 2

1

ウィンドウがメッセージを処理すると、その下にある他のウィンドウへの送信が停止します。静的ウィンドウはマウスダウンを処理しないため、ダイアログに移動します。他のコントロールはすべて何らかの方法でそれを処理するため(少なくともフォーカスを設定する)、ダイアログに到達することはありません。

基本クラスでのデフォルトの処理が完了したら、各コントロールのOnLButtonDownハンドラーをオーバーライドして、他のことを行うことができます。ダイアログのPreTranslateMessageメソッドにメッセージが表示される場合もあります。

于 2012-07-26T22:46:34.170 に答える
1

List Controls にスクロールを同期させる限り、CListCtrl をサブクラス化するか、おそらく PreTranslateMessage で WM_VSCROLL をインターセプトし、別のリストで SetScrollInfo を呼び出すのが最善の策です。リスト内のアイテムの数が同じであれば、かなり単純なはずです。

于 2012-07-27T02:13:38.983 に答える