回答編集履歴

3

コードと動画イメージを追記

2024/01/24 18:08

投稿

dameo
dameo

スコア943

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

2

誤解されそうだったので追記

2024/01/24 10:39

投稿

dameo
dameo

スコア943

test CHANGED
@@ -1,2 +1,2 @@
1
- MFCを使っていたのは大昔すぎてうろ覚えなのですが、`PreTranslateMessage`はメッセージを事前に処理し、本来のイベントハンドラに**渡さないために**使用してたはずです。戻り値で`FALSE`を返せば本来のイベントハンドラにそのイベントが渡ります。
1
+ MFCを使っていたのは大昔すぎてうろ覚えなのですが、`PreTranslateMessage`はメッセージを事前に処理し、本来のイベントハンドラに**渡さないために**使用してたはずです。戻り値で`FALSE`を返せば本来のイベントハンドラにそのイベントが渡ります(既定の動作(=基底クラス呼び出し)がFALSEでオーバーライドして止めたいときにTRUEにする)
2
2
 

1

斜体ではなく太字にしたかった…

2024/01/24 10:32

投稿

dameo
dameo

スコア943

test CHANGED
@@ -1,2 +1,2 @@
1
- MFCを使っていたのは大昔すぎてうろ覚えなのですが、`PreTranslateMessage`はメッセージを事前に処理し、本来のイベントハンドラに*渡さないために*使用してたはずです。戻り値で`FALSE`を返せば本来のイベントハンドラにそのイベントが渡ります。
1
+ MFCを使っていたのは大昔すぎてうろ覚えなのですが、`PreTranslateMessage`はメッセージを事前に処理し、本来のイベントハンドラに**渡さないために**使用してたはずです。戻り値で`FALSE`を返せば本来のイベントハンドラにそのイベントが渡ります。
2
2