MFCを使っていたのは大昔すぎてうろ覚えなのですが、PreTranslateMessage
はメッセージを事前に処理し、本来のイベントハンドラに渡さないために 使用してたはずです。戻り値でFALSE
を返せば本来のイベントハンドラにそのイベントが渡ります(既定の動作(=基底クラス呼び出し)がFALSEでオーバーライドして止めたいときにTRUEにする)。
とりあえずコードがないと分からないのかもしれないということで、fanaさんが言っている
CListBox をサブクラス化してメッセージを処理
を作るべく、ダイアログベースのMFCアプリケーションを作成したところからのリソースを除く差分だけ載せます。
diff
1 diff --git a/CHogeListBox.cpp b/CHogeListBox.cpp
2 new file mode 100644
3 index 0000000..4260d57
4 --- /dev/null
5 +++ b/CHogeListBox.cpp
6 @@ -0,0 +1,18 @@
7 + #include "pch.h"
8 + #include "CHogeListBox.h"
9 +
10 + BEGIN_MESSAGE_MAP(CHogeListBox, CListBox)
11 + ON_WM_MOUSEWHEEL()
12 + END_MESSAGE_MAP()
13 +
14 + BOOL CHogeListBox::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) {
15 + int selected = this->GetCurSel();
16 + if (selected != LB_ERR) {
17 + int count = this->GetCount();
18 + selected = selected - ((zDelta >= 0) * 2 - 1);
19 + selected = selected < 0 ? 0 : selected;
20 + selected = selected >= count ? count - 1 : selected;
21 + this->SetCurSel(selected);
22 + }
23 + return TRUE;
24 + }
25 \ No newline at end of file
26 diff --git a/CHogeListBox.h b/CHogeListBox.h
27 new file mode 100644
28 index 0000000..74c5d63
29 --- /dev/null
30 +++ b/CHogeListBox.h
31 @@ -0,0 +1,10 @@
32 + #pragma once
33 + #include <afxwin.h>
34 + class CHogeListBox :
35 + public CListBox
36 + {
37 + protected:
38 + afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
39 + DECLARE_MESSAGE_MAP()
40 + };
41 +
42 diff --git a/MFCApplication1Dlg.cpp b/MFCApplication1Dlg.cpp
43 index 215c288..7c3bf84 100644
44 --- a/MFCApplication1Dlg.cpp
45 +++ b/MFCApplication1Dlg.cpp
46 @@ -59,6 +59,7 @@ CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=nullptr*/)
47 void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
48 {
49 CDialogEx::DoDataExchange(pDX);
50 + DDX_Control(pDX, IDC_LIST1, m_lbList1);
51 }
52
53 BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
54 @@ -100,6 +101,11 @@ BOOL CMFCApplication1Dlg::OnInitDialog()
55 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
56
57 // TODO: 初期化をここに追加します。
58 + CString str;
59 + for (int i = 0; i < 100; ++i) {
60 + str.Format(_T("項目%03d"), i + 1);
61 + m_lbList1.AddString(str);
62 + }
63
64 return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
65 }
66 @@ -152,4 +158,3 @@ HCURSOR CMFCApplication1Dlg::OnQueryDragIcon()
67 {
68 return static_cast<HCURSOR>(m_hIcon);
69 }
70 -
71 diff --git a/MFCApplication1Dlg.h b/MFCApplication1Dlg.h
72 index f94a9a5..4af5d41 100644
73 --- a/MFCApplication1Dlg.h
74 +++ b/MFCApplication1Dlg.h
75 @@ -3,6 +3,7 @@
76 //
77
78 #pragma once
79 + #include "CHogeListBox.h"
80
81
82 // CMFCApplication1Dlg ダイアログ
83 @@ -31,4 +32,6 @@ protected:
84 afx_msg void OnPaint();
85 afx_msg HCURSOR OnQueryDragIcon();
86 DECLARE_MESSAGE_MAP()
87 + public:
88 + CHogeListBox m_lbList1;
89 };
ホイールを上下させてるときの動作
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/01/24 09:49
2024/01/24 09:54
2024/01/24 23:14 編集
2024/01/25 00:46
2024/01/25 01:14