【C#】マウス位置のDataGridViewをマウスホイールでスクロール
関連記事
- 【#CSHARP】ソリューション内でサービス,Winformアプリを混在で作成させ,バイナリ出力先を同じにするとサービスが起動しない 【2024年02月08日(木)】
- 【#PHP】謎な #Laravel 案件 引き渡したじ 【2024年01月11日(木)】
- 【C#】謎な改造アプリ,SIMD命令を導入して高速化しようか,思案中 【2023年11月14日(火)】
- Javaの”やらかし”でC#と人気逆転か 激変プログラミング言語人気ランキング 【2023年10月18日(水)】
- 【#CSHARP】次の案件のスケルトン書いてgitサーバに登録するなどと 【2023年05月16日(火)】
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でのマウスホイールを使った,拡大縮小とかにも使えるはず?
参考にドゾー
コメント
【訃報】俳優 火野正平さん死去 75歳
【地震】日向灘でM4.4の地震
【#第三次世界大戦】ウクライナ空軍 “ICBM1発がロシア南部から発射された”
司法省 “グーグルはクローム売却を” 裁判所に要求へ 米報道
最近,仕事がずっと激しい...ドロドロドロ
今日は謎の宴会らしい...スーツが入るのかっ!?(GRB爆
「侍ジャパン」宮崎県入り 「プレミア12」向け きょうから合宿
【#総選挙】 衆議院選挙 きょう投票 ...ドロドロドロ(24/10/27)
【#線状降水帯】宮崎 延岡「土砂崩れで家がつぶれている」通報 1人不明(24/10/23)
【冬】お~日本海に筋雲が出ちょる!冬がキター