OwnerDrawVariableでマウスホイール時にちらつくアレ
年度末ということで、今期中にやってしまいたい駆け込みの改造やバージョンアップ、不具合修正だとかをマルチでやっている今日この頃(´Д`)
で、そんな中にオーナードローしているListBoxのちらつきを直したいという話があって。
ListBox.DrawModeをDrawMode.OwnerDrawVariableでオーナードローしていると、マウスホイール時に逆スクロールして見えるという、知っている人は知っているアレ。
自分もこの問題は知っていたので、OwnerDrawVariableは避けていたというか、OwnerDrawFixedで困るケースも無かったので、今までこの問題は無視こいていたわけですが。
今回はこの問題をどうしても改修したいという話があったので、チト対応策を考えてみました。
で、色々試してみた結果、こんな小細工で対応することにしました。
private int HiWord(int number) { if ( ( number & 0x80000000 ) == 0x80000000 ) { return ( number >> 16 ); } else { return ( number >> 16 ) & 0xffff ; } } protected override void WndProc(ref Message m) { const int WM_MOUSEWHEEL = 0x20A; if ( m.Msg == WM_MOUSEWHEEL ) { int d = HiWord( m.WParam.ToInt32() ); int index = this.TopIndex + ( d < 0 ? SystemInformation.MouseWheelScrollLines : -SystemInformation.MouseWheelScrollLines ); index = Math.Max( 0, index ); this.TopIndex = index; return; } base.WndProc(ref m); }
何をやっているかと言えば、ListBoxのWndProcをoverrideして、標準のWM_MOUSEWHEELによるスクロール動作を潰し、その代わりにTopIndexを手動で更新してスクロールを表現しているわけですが。
この処理を入れると、描画のされかたが変わって、標準では逆スクロールに見えていた描画がちゃんとスクロール方向にあって見えるようになるという…なんだコレ(・Д・)
最近はなんか変なことばかりやっているな〜(´∀`)
おまけに今日は突然東京に行くことになったしぃ〜。
お疲れ(´ω`)