Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод сообщения. DoubleBuffered. Это ли нужно. Не совсем понятно как это использовать 
:(
    Опции темы
CasperSC
Дата 2.4.2010, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Здравствуйте! Вопрос такой: Вот у меня программа когда это нужно, она  выводит сообщение. Оно "вылазит" справа снизу (часы, трей) и при этом сильно мерцает, так как в качестве фона используется 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();
        }


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

Событие загрузки формы:
Код

            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(); //выводим, то что отрисовалось в буфере


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

Это сообщение отредактировал(а) CasperSC - 2.4.2010, 03:18
PM MAIL   Вверх
CasperSC
Дата 2.4.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Разобрался сам. Короче, чтобы не мигало, надо в качестве фоновой картинки использовать изображение *.bmp формата. А у меня был *.png с прозрачными областями. Это конечно не выход, так как теперь нельзя сделать форму прозрачной, так как углы закруглены и закрашены аква цветом при прозрачности становятся видимыми.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.