Решил проблему, используя .NET. Оказывается для прорисовки остальных контролов надо было вызвать метод base.OnPaint(), а вместо вызова тяжелого Refresh(), вызывать invalidate(). Эти модификации вкупе с самодельной двойной буферизацией обеспечивают быструю прорисовку без косяков.
- Код: Выделить всё
// pb - PictureBox
private void pb_Paint(object sender, PaintEventArgs e) // обновление картинки
{
base.OnPaint(e);
Graphics g = Graphics.FromImage(bmp); //bmp - буфер-пикча
draw_Back(g);
draw_Cursor(g, pen_Cursor);
g.Dispose();
pb.Image = bmp;
}
private void pb_MouseUp(object sender, MouseEventArgs e)
{// пример вызова отрисовки
need_stop = true;
mouse_down = false;
stb.Text = ""; // по таймеру текст статус бара изменится на приемлимый
pb.Invalidate(); // вызов отрисовки
}
Добавлено спустя 23 минуты 37 секунд:хм, рано радовался. при таком методе on_paint таймер не работает
Добавлено спустя 1 час 34 минуты 46 секунд:похоже проблема в методе invalidate(). на форумах встречал информацию о том, что он вначале очищает холст, и уж потом вызывает Paint(), что естественно приводит к мельканию.
попробовал вызвать on_paint() напрямую:
- Код: Выделить всё
pb.OnPaint()
получил ошибку
Доступ к защищенному члену "System.Windows.Forms.Control.OnPaint(System.Windows.Forms.PaintEventArgs)" через квалификатор типа "System.Windows.Forms.PictureBox" невозможен; квалификатор должен иметь тип "MBGame.frmMain" (или производный от него тип)
можно как-то это обойти?