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を手動で更新してスクロールを表現しているわけですが。
この処理を入れると、描画のされかたが変わって、標準では逆スクロールに見えていた描画がちゃんとスクロール方向にあって見えるようになるという…なんだコレ(・Д・)


最近はなんか変なことばかりやっているな〜(´∀`)
おまけに今日は突然東京に行くことになったしぃ〜。
お疲れ(´ω`)