Моргание при отрисовке
От: shapovalov Канада https://www.yaplex.com
Дата: 04.01.06 13:52
Оценка:
При отрисовке картинок на форме, происходит моргание, как это можно убрать.

        private void timer1_Tick(object sender, System.EventArgs e) {
            Graphics g = CreateGraphics();
            
            for (int imgNo = 0; imgNo < _PuzzleItemsCount; imgNo++ ) {
                if ( ( null != _PuzzleItems[ imgNo ] ) && ( null != _PuzzleItems[ imgNo ].Btm ) ) {
                    g.DrawImage( _PuzzleItems[ imgNo ].Btm, _PuzzleItems[ imgNo ].Rc );
                }
            }    
            g.Dispose();


картинки хранятся в массиве, всего 100 карнинок.
При этом необходима таскать одну из картинок мышкой.
может можно как то сделать чтобы не приходилось постоянно перерисовывать?

Чтобы понятно было что я делаю — это игра пазлы.
.NET Software developer @ www.yaplex.com
Re: Моргание при отрисовке
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.01.06 18:05
Оценка:
Здравствуйте, shapovalov, Вы писали:

S>может можно как то сделать чтобы не приходилось постоянно перерисовывать?


Переключи свойство DoubleBuffered (контрола или формы) в true;
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Моргание при отрисовке
От: shapovalov Канада https://www.yaplex.com
Дата: 05.01.06 06:43
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, shapovalov, Вы писали:


S>>может можно как то сделать чтобы не приходилось постоянно перерисовывать?


VD>Переключи свойство DoubleBuffered (контрола или формы) в true;


Не помогает.
В конструкторе
            this.SetStyle( ControlStyles.DoubleBuffer, true );


Может я не правельно отрисовку делаю?
Я каждый раз при движении мыши(тащу какую-то картинку), делаю Invalidate, чтобы вызвать Paint
        private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
            if ( _dragItem >= 0) {
                                // код пересчета координат картинки, которую я тащу.
                Invalidate();
            }
        }

далее в событии Паинт отрисовываю все картинки

        private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {
            Graphics g = CreateGraphics();
            g.Clear( Color.Gray );
            for (int imgNo = 0; imgNo < _PuzzleItemsCount; imgNo++ ) {
                if ( ( null != _PuzzleItems[ imgNo ] ) && ( null != _PuzzleItems[ imgNo ].Btm ) ) {
                    g.DrawImage( _PuzzleItems[ imgNo ].Btm, _PuzzleItems[ imgNo ].Rc );
                }
            }    
            g.Dispose();
        }

Если не вызывать Invalidate, то я не могу тащить картинку, т.е. это не видно на форме.
.NET Software developer @ www.yaplex.com
Re[3]: Моргание при отрисовке
От: ekamaloff Великобритания  
Дата: 05.01.06 07:26
Оценка:
Здравствуйте, shapovalov, Вы писали:

S>Может я не правельно отрисовку делаю?

S>Я каждый раз при движении мыши(тащу какую-то картинку), делаю Invalidate, чтобы вызвать Paint
S>
S>        private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
S>            if ( _dragItem >= 0) {
S>                                // код пересчета координат картинки, которую я тащу.
S>                Invalidate();
S>            }
S>        }
S>

S>далее в событии Паинт отрисовываю все картинки

Вызывая перегруженный Invalidate без параметров ты указываешь на необходимость перерисовки всей клиентской области формы. А перерисовывать необходимо только две области: ту где объект находился ранее и ту, куда он переместился в результате движения курсора мышки. Т.е. тебе надо использовать ту версию Control.Invalidate, которая принимает Rectangle (тогда будет два вызова — для старой и новой области) или Region (один вызов, регион нужно создать объединением прямоугольника старой и новой области) в качестве параметра.

Еще совет — вместо:
this.SetStyle( ControlStyles.DoubleBuffer, true );

указывай:
this.SetStyle( ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true );


А в обработчике Paint формы кроме прорисовки объектов, закрашивай клиентскую область

S>Если не вызывать Invalidate, то я не могу тащить картинку, т.е. это не видно на форме.


Само собой
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: Моргание при отрисовке
От: mbrodin Украина  
Дата: 05.01.06 09:04
Оценка:
Здравствуйте, shapovalov, Вы писали:

S>При отрисовке картинок на форме, происходит моргание, как это можно убрать.


Может этот примерчик наведет на мысли...

http://www.gotdotnet.ru/Downloads/Examples/89800.aspx
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Моргание при отрисовке
От: Аноним  
Дата: 05.01.06 09:41
Оценка:
Здравствуйте, shapovalov, Вы писали:

S>При отрисовке картинок на форме, происходит моргание, как это можно убрать.


здесь
Re[3]: Моргание при отрисовке
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.01.06 11:01
Оценка:
Здравствуйте, shapovalov, Вы писали:

S>Не помогает.

S>В конструкторе
S>
S>            this.SetStyle( ControlStyles.DoubleBuffer, true );
S>


Ты каким фрэймворком пользушся? Если вторым, то делай то что тебе говорят, а не занимайся самодеетельностью.

Если первым, то еще добавь флаг AllPaintInWmPaint. Так же перекрой OnPaintBackground и не делай в нем ничего. Учти, что при этом при отрисовке тебе придется зарисовывать всю область фона. Хотя еще первого действия должно хватить...
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Моргание при отрисовке
От: Smarty Россия  
Дата: 05.01.06 16:17
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Еще совет — вместо:

E>
E>this.SetStyle( ControlStyles.DoubleBuffer, true );
E>

E>указывай:
E>
E>this.SetStyle( ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true );
E>


Кстати — это, уже практически каноническое выражение, некоторые... ортодоксы рекомендуют писать так:
this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

обосновывая это тем, что сначала должен быть включен UserPaint, а ПОТОМ AllPaintingInWmPaint. Иначе последний остается не включенным. Конечно, может быть это всего лишь "городские легенды", а может....
Re[4]: Дополнение
От: Alexander__S  
Дата: 05.01.06 22:13
Оценка:
Если уж перетаскиваешь, почитай про захват мыши и отслеживание WM_CAPTURECHANGED, я бы подумал также об использовании API (ImageList_Drag***), хотя можно и в рисовании потренироваться.
Re[3]: Моргание при отрисовке
От: kukum  
Дата: 05.01.06 23:05
Оценка:
Замени
Graphics g = CreateGraphics();
на
Graphics g = e.Graphics();
Re[4]: Моргание при отрисовке
От: kukum  
Дата: 05.01.06 23:25
Оценка:
Опечатка

Замени
Graphics g = CreateGraphics();
на
Graphics g = e.Graphics;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.