【C#】マウス位置のDataGridViewをマウスホイールでスクロール
関連記事
- 【#CSHARP】次の案件のスケルトン書いてgitサーバに登録するなどと 【2023年05月16日(火)】
- 生成AI「仕事で利用」2割 正確性などに懸念(23/5/7) 【2023年05月07日(日)】
- 【#RaspberryPI】ラズパイでsudo起動の.Net6アプリがデバグできない件 【2023年04月22日(土)】
- 【#PostgreSQL】テーブルから取得したレコードセットをCSVへ落とそうとすると,空ファイルが出来る...ドロドロドロ 【2023年03月08日(水)】
- 【#git】TortiseGit ver2.14のGitWCRev.exeを動かすとErrorCD:10を出力して,動かない 【2023年02月08日(水)】
DataGridViewにフォーカスセットして,マウスホイールスクロールは
アチコチで事例があったけど
カーソルを置いただけで,マウスホイールが効くようにする事例,あまりなかったので
ちと難儀したので,書き留めておきまする
参考にしたページ
マウスのホイールをコロコロした時にマウスオーバー(エンター?)しているコントロールのスクロールバーを動かしたい@MSDNのページ
【C#.NET】TreeViewをスクロールバーを使用せずスクロールさせる方法@吟遊詩人の戯言
まずは,マウスカーソルインでコントロールを制御させるクラス.
NativeWindowを継承させて作成するとのこと
こちらのページをまんま使用しました
提供者さま,さんくすです
public class MessageForwarder : NativeWindow, IMessageFilter { private Control _Control; private Control _PreviousParent; private HashSet<int> _Messages; private bool _IsMouseOverControl; public MessageForwarder(Control control, int message) : this(control, new int[] { message }) { } public MessageForwarder(Control control, IEnumerable<int> messages) { _Control = control; AssignHandle(control.Handle); _Messages = new HashSet<int>(messages); _PreviousParent = control.Parent; _IsMouseOverControl = false; control.ParentChanged += new EventHandler(control_ParentChanged); control.MouseEnter += new EventHandler(control_MouseEnter); control.MouseLeave += new EventHandler(control_MouseLeave); control.Leave += new EventHandler(control_Leave); if (control.Parent != null) { Application.AddMessageFilter(this); } } public bool PreFilterMessage(ref Message m) { if (_Messages.Contains(m.Msg) && _Control.CanFocus && !_Control.Focused && _IsMouseOverControl) { m.HWnd = _Control.Handle; WndProc(ref m); return true; } return false; } void control_ParentChanged(object sender, EventArgs e) { if (_Control.Parent == null) { Application.RemoveMessageFilter(this); } else { if (_PreviousParent == null) { Application.AddMessageFilter(this); } } _PreviousParent = _Control.Parent; } void control_MouseEnter(object sender, EventArgs e) { _IsMouseOverControl = true; } void control_MouseLeave(object sender, EventArgs e) { _IsMouseOverControl = false; } void control_Leave(object sender, EventArgs e) { _IsMouseOverControl = false; } }次,該当のDataGridViewが置いてあるフォームにコードを追加
Win32APIを叩いて,スクロールを実現させまする
うちのブログに記載した,TreeViewをスクロールバーなしでスクロールさせるやり方をちょいと弄って?
using System.Runtime.InteropServices; //InteropServicesをusingしてくださいませ
#region API
#region Win32APIのSendMessage()を使って,コンポーネントに対しメッセージを直接投げつけます
[DllImport(“user32.dll”,CharSet=CharSet.Unicode)]
public static extern Int32 SendMessage(IntPtr hWnd, Int32 Msg, int wParam, int lParam);
//メッセージ関係の定数を定義
private const int WM_VSCROLL = 0x115; //WM_VSCROLLメッセージを使用します
private const int SB_LINEUP = 0; //上矢印を押した
private const int SB_LINEDOWN = 1; //下矢印を押した
private const int SB_PAGEUP = 2; //上ページアップを押した
private const int SB_PAGEDOWN = 3;
#endregion
private MessageForwarder m_WheelCtrl; //上記のクラスのインスタンスを格納しておきます
public Form1()
{
InitializeComponent();
m_WheelCtrl = new CMNCommon.Classes.MessageForwarder(dgvCtrl, 0x20A); //MessageForwarder のインスタンス生成.対象はDataGridView
dgvCtrl.MouseWheel += new MouseEventHandler(dgvCtrl_MouseWheel); //ホィールイベントを結びつける
}
private void dgvCtrl_MouseWheel(object sender, MouseEventArgs e)
{
//Win32APIを使って垂直スクロールのメッセージを飛ばす
if (e.Delta > 0) //アップ方向(下方向スクロール時)フラグが立っているとき
{
for(int i = 0; i < 10; i++)
{
SendMessage(dgvCtrl.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
}
}
else
{
for(int i = 0; i < 10; i++)
{
SendMessage(dgvCtrl.Handle, WM_VSCROLL, SB_LINEUP, 0);
}
}
}
[/csharp]
たぶん,このやり方
PictureBoxでのマウスホイールを使った,拡大縮小とかにも使えるはず?
参考にドゾー
コメント
桜島フェリー運賃アップへ 来年7月から大人50円↑ 鹿児島市が案示す
【体調不良】起きて早々,閃輝暗点発生中
【#あまちゃん】「あまちゃん」放送10周年記念 スペシャルコンサート 久慈
#あまちゃん 10周年スペシャルコンサートのチケットを買ってみた eplusの新会員登録画面,作りがなっとらん!
イーロン・マスク氏 「X」全利用者に少額課金求める考え示す
秋分の日 雨が降り出した しかも涼しい
【#インフルエンザ】「インフル 4週間以内に大流行の可能性 対策を」小池都知事
“吉田屋”の駅弁 1都23県295人が体調不良を訴える 八戸市保健所
【アゼルバイジャン】ナゴルノカラバフ アルメニア側“事実上敗北” 死者200人超か