картинки хранятся в массиве, всего 100 карнинок.
При этом необходима таскать одну из картинок мышкой.
может можно как то сделать чтобы не приходилось постоянно перерисовывать?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, shapovalov, Вы писали:
S>>может можно как то сделать чтобы не приходилось постоянно перерисовывать?
VD>Переключи свойство DoubleBuffered (контрола или формы) в true;
Здравствуйте, 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 (один вызов, регион нужно создать объединением прямоугольника старой и новой области) в качестве параметра.
А в обработчике Paint формы кроме прорисовки объектов, закрашивай клиентскую область
S>Если не вызывать Invalidate, то я не могу тащить картинку, т.е. это не видно на форме.
Само собой
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Ты каким фрэймворком пользушся? Если вторым, то делай то что тебе говорят, а не занимайся самодеетельностью.
Если первым, то еще добавь флаг AllPaintInWmPaint. Так же перекрой OnPaintBackground и не делай в нем ничего. Учти, что при этом при отрисовке тебе придется зарисовывать всю область фона. Хотя еще первого действия должно хватить...
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
обосновывая это тем, что сначала должен быть включен UserPaint, а ПОТОМ AllPaintingInWmPaint. Иначе последний остается не включенным. Конечно, может быть это всего лишь "городские легенды", а может....
Если уж перетаскиваешь, почитай про захват мыши и отслеживание WM_CAPTURECHANGED, я бы подумал также об использовании API (ImageList_Drag***), хотя можно и в рисовании потренироваться.