Отключение перерисовки в приложении WinForms - PullRequest
2 голосов
/ 09 декабря 2008

Я работаю над приложением C # .Net, в котором есть несколько раздражающая ошибка. В главном окне есть несколько вкладок, каждая из которых имеет сетку. При переключении с одной вкладки на другую или выборе другой строки в сетке выполняется некоторая фоновая обработка, и во время этого меню мигает по мере перерисовки (пункты меню «Файл», «Справка» и т. Д., А также значок и заголовок окна).

Сначала я попытался отключить перерисовку окна при переключении вкладок / строк (сообщение WM_SETREDRAW). В одном случае это работает отлично. С другой стороны, это решает непосредственную ошибку (мерцание заголовка / меню), но между отключением перерисовки и повторным включением окно «прозрачно» для щелчков мыши - есть небольшое окно (<1 сек), в котором я могу нажать и он, скажем, выделит значок на моем рабочем столе, как будто приложения там вообще не было. Если у меня что-то еще работает в фоновом режиме (скажем, в Firefox), оно на самом деле получит фокус при нажатии (и нарисует часть браузера, скажем, адресную строку). </p>

Вот код, который я добавил.

m = new Message();
m.HWnd = System.Windows.Forms.Application.OpenForms[0].Handle; //top level
m.WParam = (IntPtr)0; //disable redraw
m.LParam = (IntPtr)0; //unused
m.Msg = 11; //wm_setredraw
WndProc(ref m);

- Приложение игнорирует щелчки в этом разделе (в одном случае)

m = new Message();
m.HWnd = System.Windows.Forms.Application.OpenForms[0].Handle; //top level
m.WParam = (IntPtr)1; //enable
m.LParam = (IntPtr)0; //unused
m.Msg = 11; //wm_setredraw
WndProc(ref m);

System.Windows.Forms.Application.OpenForms[0].Refresh();

Кто-нибудь знает, если а) есть способ исправить проблему с прозрачным приложением здесь, или б) если я делаю это неправильно в первую очередь, и это нужно исправить каким-то другим способом?

Ответы [ 4 ]

4 голосов
/ 09 декабря 2008

Для этой цели существуют вызовы классов, производных от Control. Это SuspendLayout и PerformLayout. Поскольку они находятся на Control, а Form является производным от Control, они есть у вашего Form.

Этих вызовов достаточно для большинства обновлений, но в других случаях достаточно просто скрыть элемент управления с помощью Visible = false. Чтобы остановить мерцание во время этого скрытия и затем повторного отображения элемента управления, я обычно рисую элемент управления на растровом изображении, которое я показываю в PictureBox во время обновления. Это полезно при обновлении деревьев, элементов управления вкладками или списков (как и отключение сортировки во время обновления в последнем примере).

0 голосов
/ 12 июня 2009

Если это пользовательский элемент управления, вы можете попробовать некоторые из флагов стиля : я думаю, что DoubleBuffered или AllPaintingInWmPaint могут помочь. Вы можете изменить биты стиля, используя Control.SetStyle (который защищен, поэтому вам нужно сделать это в своем собственном пользовательском классе Control).

0 голосов
/ 09 декабря 2008

Вы можете попробовать переопределить метод Paint на вашем элементе управления, который вы не хотите визуализировать, и управлять им с помощью некоторого глобального логического значения (= игнорировать все рисование, пока некоторое bool верно) Если вы управляете третьим лицом, создайте его подкласс и переопределите его.

Затем, когда вы будете удовлетворены, установите для bool значение false и дайте элементу управления снова закраситься (возможно, придется принудительно рисовать при повторном включении с помощью .Refresh?)

0 голосов
/ 09 декабря 2008

Поведение, которое вы описываете, не является нормальным для приложения .NET winforms. Тот факт, что вы используете WndProc и отправляете сообщения в своем примере, говорит о том, что с этой формой происходит много других необычных вещей (я предполагаю, что задействовано более одного потока). Другая возможность, которая часто встречается в интерфейсах с вкладками, заключается в том, что ваша форма просто перегружена элементами управления; иногда это может вызвать странное поведение.

Я никогда не был свидетелем или слышал что-либо отдаленно похожее на то, что вы описываете.

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