LINUX.ORG.RU

Не перерисовывать окно, когда оно перекрыто другими окнами


0

1

Привет.

Я хочу сделать некое окно с анимацией, которое постоянно перерисовывается по таймеру. Можно ли как-нибудь сделать, чтобы перерисовка не выполнялась, когда это окно полностью перекрыто другими окнами? Смысл в том, чтобы программа не кушала процессорное время на отрисовку, когда окна всё равно не видно.

Пробовал проверять QPaintEvent::region в Qt, gtk_widget_queue_draw и gdk_window_invalidate_rect в GTK, но всё не то.

Должен быть свой OnPaint (Windows Forms) или paint (Swing). Там и проверять. Эти методы просто так не вызываются.

dave ★★★★★
()
Ответ на: комментарий от darkshvein

> В wmaker такая опция была, посмотрите его сырцы.

А какая именно опция? что делает и где её найти?

stereodev
() автор топика
Ответ на: комментарий от dave

> Должен быть свой OnPaint (Windows Forms) или paint (Swing). Там и проверять

А что именно проверять, kожно глянуть на пример кода? Просто я по части mono и java полный ноль.

stereodev
() автор топика

Учти, что сейчас многие используют композитные оконные менеджеры с функцией предпросмотра окон при наведении на иконку в панели задач и или еще где (например плиточка по ctrl + f9 в KDE). Даже для свернутых окон генерируются превью и пользователь ожидает увидеть там именно анимацию, а не черный экран или статичную картинку.

Amp ★★★
()
Ответ на: комментарий от stereodev

Кода много, и он закрытый, а идея такая. По таймеру посылать инвалидацию (Invalidate) участка экрана. Потом отрисовывать анимацию по запросу системы (OnPaint).

dave ★★★★★
()
Ответ на: комментарий от dave

Написал на Mono вот такое. Но всё равно я вижу сообщения в консоли когда окно перекрыто, свёрнуто или на другом рабочем столе.

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsApplication1 
{ 
        public class Form1 : System.Windows.Forms.Form 
        { 
                private int i;
				static System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
		
				public Form1()
				{
						timer.Tick += new EventHandler(TimerEventProcessor);
						timer.Interval = 100;
						timer.Start();
				}
		
				private void TimerEventProcessor(Object myObject,
                                            EventArgs myEventArgs)
				{
						i++;
						Invalidate();
				}

                
                static void Main() 
                {
                        Application.Run(new Form1()); 
                } 

                protected override void OnPaint(PaintEventArgs pea) 
                { 
						Console.WriteLine("Repainting");
                        pea.Graphics.DrawLine(new System.Drawing.Pen(Color.Blue), 1, i % 100, 100, 101 - i % 100); 
                } 
        } 
} 

anonymous
()
Ответ на: комментарий от anonymous

Такое чувство, что иксы такого не умеют в принципе. Единственное, что приходит в голову – получать список всех окон и вручную проверять, перекрывают ли они наше окно или нет. Но это само по себе потребует не меньше ресурсов, чем сама анимация.

stereodev
() автор топика
Ответ на: комментарий от anonymous

Было бы правильнее проверить на явовском свинге, поскольку моно - вещь в себе, особенно ее поддержка винформов. Хотя фиг его знает, вполне может быть, что имеем фичу иксов. Но по идее так не должно быть.

dave ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.