c # winform самостоятельно настраиваемая полоса прокрутки делает мерцание рабочего стола - PullRequest
1 голос
/ 04 марта 2011

Я использую текстовое вложение на панели, а затем прокручиваю панель с помощью полосы прокрутки вместо использования полосы прокрутки по умолчанию в Windows.

Но проблема в том, что я использую LockWindowUpdate при прокрутке, что повлияет на окно рабочего стола и заставит его мерцать в Windows XP.

Очень интересная вещь, когда я открываю файловый браузер в WinXp и прокручиваю полосу прокрутки в файловом браузере. Затем вернитесь к моему приложению и снова прокрутите настроенную полосу прокрутки, мерцание исчезнет.

Кто-нибудь знает, что на самом деле происходит в этом случае? как работает LockWindowUpdate?

Спасибо

protected override void OnScroll(ScrollEventArgs se)
{


         if (se.Type == ScrollEventType.First)
            {
                LockWindowUpdate(this.Handle);
            }
            else if (se.Type == ScrollEventType.ThumbTrack /* || se.Type == ScrollEventType.ThumbPosition*/)
            {
                LockWindowUpdate(IntPtr.Zero);
                this.Refresh();
                LockWindowUpdate(this.Handle);
            }
            else
            {
                LockWindowUpdate(IntPtr.Zero);
                this.Invalidate();
                LockWindowUpdate(IntPtr.Zero);
            }
            base.OnScroll(se);
}

- код события прокрутки панели Я просто использую свою настраиваемую полосу прокрутки, чтобы прокрутить панель в нужное положение.

если я использую

SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
SendMessage(parent.Handle, WM_SETREDRAW, true, 0);

панель все еще сильно дрожит.

И сегодня я обнаружил, что если я просто сфокусирую значок на рабочем столе, рабочий стол больше не будет мерцать, но я добавлю код в программу, используя

SetForegroundWindow(Win32API.GetDesktopWindow());

это тоже не работает, так что я очень устал от этой проблемы.

кто-нибудь знает этот случай?

Ответы [ 2 ]

1 голос
/ 04 марта 2011

попробуйте это:

protected override void OnPaintBackground(PaintEventArgs e)
{
// Left empty to avoid undesirable flickering.
}
0 голосов
/ 04 марта 2011

Эта тема может быть полезна: Как приостановить рисование для элемента управления и его дочерних элементов?

Попробуйте использовать WM_SETREDRAW (отключить) вместо LockWindowUpdate ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...