2008-12-08 3 views
2

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

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

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

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); 

< надрез> - Application игнорирует щелчки в то время как в этом разделе (в одном случае)

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

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

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

0

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

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

0

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

Затем, когда вы удовлетворяется, установите логическое значение в ложь, и пусть управления краситься снова (возможно, придется заставить краску, когда вы включите его снова .refresh?)

0

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

Смежные вопросы