Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2010, 00:20   #1
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию Вывод сообщения. DoubleBuffered. Это ли нужно.

Здравствуйте! Вопрос такой: Вот у меня программа когда это нужно, она выводит сообщение. Оно "вылазит" справа снизу (часы, трей) и при этом сильно мерцает, так как в качестве фона используется PNG изображение с прозрачными областями. Вот у меня была одна проблема, я там использовал двойную буферизацию, то есть прорисовывал всё в буфере и выводил на экран (bufferedGraphics.Render(); ) так вот теперь то мне нужно, чтобы сообщение не мерцало. Вообще оно создаётся в классе ConfigureMessage, то есть это не форма, а класс, который в зависимости от параметров, создаёт сообщение нужного типа. И я не могу выставить в свойствах DoubleBufferibg (или вроде того) = true; Даже если создать форму в ручную и использовать такой же способ вывода сообщения, то всё равно мерцает. Суть вопроса в том, как мне быть? То есть тут можно тоже перерисовывать форму? Я что-то не представляю как это делать. Одно рисовать прямоугольники и стирать прошлый прямоугольник, а другое дело всю форму. Подскажите как это можно сделать. Вот как я вывожу сообщение:

Код:
...
RightDownMessageShow();
...
Код:
        private void RightDownMessageShow()
        {
            timerShowMessage_RightDown.Interval = 3;
            timerShowMessage_RightDown.Tick += new EventHandler(timerShowMessage_RightDown_Tick);
            posX = Screen.PrimaryScreen.Bounds.Width - this.formMessage.Width;
            posY = Screen.PrimaryScreen.Bounds.Height;
            needY = Screen.PrimaryScreen.WorkingArea.Height - this.formMessage.Height - 4;
            locationMsg.X = posX;
            locationMsg.Y = posY;
            this.formMessage.Location = locationMsg;
            this.timerShowMessage_RightDown.Start();
            
        }
Код:
        //Таймер выводит сообщение на экран
        void timerShowMessage_RightDown_Tick(object sender, EventArgs e)
        {
            while (posY > needY)
            {
                posY -= 10;
                locationMsg.Y = posY;
                this.formMessage.Location = locationMsg;
            }
            this.timerShowMessage_RightDown.Stop();
        }
Casper-SC вне форума Ответить с цитированием
Старый 02.04.2010, 03:54   #2
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Это был код вывода сообщения на экран.

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

Событие загрузки формы:
Код:
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.SupportsTransparentBackColor, true);
            this.UpdateStyles();
            gr = Graphics.FromHwnd(this.Handle);
            bufferGraphicsContext = new BufferedGraphicsContext();
            bufferGraphicsContext = BufferedGraphicsManager.Current;
Код метода отрисовки в буфере:
Код:
        /// <summary>
        /// Отрисовываем всё в буфере
        /// </summary>
        public void DrawTOBuffer()
        {   //выставляем размер буфера "весь экран"
            bufferGraphicsContext.MaximumBuffer = new Size(this.Width + 1, this.Height + 1);
            
            bufferGraphics = bufferGraphicsContext.Allocate(gr,
                 new Rectangle(0, 0, this.Width + 1, this.Height + 1)); //создаём буфер

            bufferGraphics.Graphics.FillRectangle(brushBack, rectBack); //стераем прошлый рисунок
            bufferGraphics.Graphics.DrawRectangle(pen, rectSelected); //рисуем новый прямоугольник
            bufferGraphics.Graphics.FillRectangle(br, rectSelected); //заливаем его цветом
        }
Событие движения мышки по форме с использованием отрисовки:
Код:
                DrawTOBuffer(); //Производим отрисовку в буфере
                bufferGraphics.Render(); //выводим, то что отрисовалось в буфере
Я не предлагаю за меня сделать, если у кого есть какие мысли, то как мне форму перерисовывать правильно, чтобы вылазия из-за экрана она перерисовывалась и не мигала?

Последний раз редактировалось Casper-SC; 02.04.2010 в 04:17.
Casper-SC вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод сообщения по времени DimOn4Ik БД в Delphi 12 31.03.2010 23:00
Вывод сообщения об ошибке... Ho-ho Помощь студентам 12 02.11.2009 16:54
Вывод сообщения о скрытом тексте Busine2009 Microsoft Office Word 12 26.09.2009 23:32
Вывод сообщения в PDF Busine2009 Фриланс 2 13.07.2009 09:39
Вывод сообщения без кнопок transgd Microsoft Office Excel 6 19.06.2009 06:15