Мерцание полосы прокрутки при вызове EnableScrollBar - PullRequest
0 голосов
/ 19 августа 2010

Я использую p / invoke для вызова EnableScrollBar из user32.dll ( ссылка MSDN ).Я заметил, что когда полоса прокрутки включена, кажется, что она нарисована так, как будто ни одна тема не применена, а затем перерисована с примененной темой.До сих пор я тестировал только с Windows 7.Есть ли способ предотвратить это?

РЕДАКТИРОВАТЬ: Вот некоторый код, чтобы показать, что происходит (сброс в форму с полосами прокрутки):

private class Native
{
    [DllImport("user32.dll")]
    public static extern bool EnableScrollBar(IntPtr hWnd, uint wSBflags, uint wArrows);

    public static class SBArrows
    {
        public const uint ESB_ENABLE_BOTH = 0;
        public const uint ESB_DISABLE_BOTH = 3;
        public const uint ESB_DISABLE_LEFT = 1;
        public const uint ESB_DISABLE_RIGHT = 2;
        public const uint ESB_DISABLE_UP = 1;
        public const uint ESB_DISABLE_DOWN = 2;
        public const uint ESB_DISABLE_LTUP = 1;
        public const uint ESB_DISABLE_RTDN = 2;
    }

    public static class SBFlags
    {
        public const uint SB_HORZ = 0;
        public const uint SB_VERT = 1;
        public const uint SB_CTL = 2;
        public const uint SB_BOTH = 3;
    }
}


private bool Switch = false;

protected override void OnMouseDown(MouseEventArgs e)
{
    Native.EnableScrollBar(this.Handle, Native.SBFlags.SB_HORZ, this.Switch ? Native.SBArrows.ESB_DISABLE_BOTH : Native.SBArrows.ESB_ENABLE_BOTH);
    this.Switch = !this.Switch;
}

Окончательное решение

Native.SendMessage(this.Handle, Native.WindowMessages.WM_SETREDRAW, new IntPtr(0), IntPtr.Zero);
Native.EnableScrollBar(this.Handle, Native.SBFlags.SB_HORZ, Native.SBArrows.ESB_ENABLE_BOTH);
Native.SendMessage(this.Handle, Native.WindowMessages.WM_SETREDRAW, new IntPtr(1), IntPtr.Zero);

1 Ответ

2 голосов
/ 19 августа 2010

Мне не очень нравится это решение. Это, однако, работает:

    protected override void OnMouseDown(MouseEventArgs e) {
        Native.LockWindowUpdate(this.Handle);
        Native.EnableScrollBar(this.Handle, Native.SBFlags.SB_HORZ, this.Switch ? Native.SBArrows.ESB_DISABLE_BOTH : Native.SBArrows.ESB_ENABLE_BOTH);
        //this.Invalidate();
        Native.LockWindowUpdate(IntPtr.Zero);
        this.Switch = !this.Switch;
    }
...