2015-11-10 2 views
0

Я сделал приложение на Visual Studio 2012 и попытался ускорить время рисования форм.C# Form Draws Slowly

У меня есть основная форма, и внутри нее у меня есть контейнер, в котором в зависимости от выбора инструментальной полосы новая форма будет отображаться внутри него. Он работает как шарм, но проблема в том, что требуется много времени для рисования, независимо от того, насколько хорош компьютер (используется на разных компьютерах), и проблема кажется фоном.

Я установил фоновое изображение для основной формы, для контейнера внутри этой формы и для всех форм в моем проекте, поэтому, когда они появляются, фоновое изображение не прерывается, и оно продолжает изображение. Но, если вместо использования фона для изображения и я оставляю спину в белом, для всех, основной форме, контейнере и формах, он работает как шарм.

Я читал в Интернете о настройке двойного буфера внутри формы и материала на true, но он ничего не делал, он требует того же количества времени.

Любые советы? Заранее спасибо!

+1

WinForms не работает с фоновыми изображениями, особенно если они имеют высокое разрешение. Тем не менее, я не могу выставлять программы с фоновыми изображениями. Вместо этого попробуйте использовать сплошной цвет. – Dai

+0

Эй, если вы хотите создать собственный макет, просто взгляните на WPF. Он использует Direct X (вместо GDI) для визуализации окна, которое делает его чрезвычайно быстрым. – Snicker

+0

@Dai Спасибо за подсказку, но использование сплошного цвета не является вариантом. – Lobialkon

ответ

2

Вы можете сжать маленькую больше скорости из нее, рисуя фон вручную. Это помогает, поскольку позволяет отключить базовый цвет фона, который просто тратит время, потому что он все равно перезаписывается.

// Reference to manually-loaded background image 
Image _bmp; 

// In your constructor, set these styles to ensure that the background 
// is not going to be automatically erased and filled with a color 
public Form1() { 
    InitializeComponent(); 
    SetStyle(
     ControlStyles.Opaque | 
     ControlStyles.OptimizedDoubleBuffer | 
     ControlStyles.AllPaintingInWmPaint, true); 

    // Load background image 
    _bmp = Image.FromFile("c:\\path\\to\\background.bmp"); 
} 

// Override OnPaint to draw the background 
protected override void OnPaint(PaintEventArgs e) { 
    var g = e.Graphics; 
    var srcRect = new Rectangle(0, 0, _bmp.Width, _bmp.Height); 
    int startY = Math.Max(0, (e.ClipRectangle.Top/_bmp.Height) * _bmp.Height); 
    int startX = Math.Max(0, (e.ClipRectangle.Left/_bmp.Width) * _bmp.Width); 
    for (int y = startY; y < e.ClipRectangle.Bottom; y+= _bmp.Height) 
     for (int x = startX; x < e.ClipRectangle.Right; x += _bmp.Width) 
     { 
      var destRect = new Rectangle(x, y, _bmp.Width, _bmp.Height); 
      g.DrawImage(_bmp, destRect, srcRect, GraphicsUnit.Pixel); 
     } 
    base.OnPaint(e); 
} 
+0

Хотя он рисует довольно много быстрее, это изменило то, как выглядит фон, здесь, я оставляю для него два изображения. Оригинал: http://imgur.com/fWYvrpH; Изменено: http://imgur.com/Rg4ddPG – Lobialkon

+0

Хорошо, поэтому он рисует изображение, используя другой масштаб, потому что DPI растрового изображения не соответствует вашему DPI рабочего стола. Кроме того, исходное поведение (с использованием свойства BackgroundImage) состоит в том, чтобы повторить битмап по мере необходимости, чтобы заполнить все пространство. Я изменил свой ответ на учет обоих этих вопросов. – RogerN

+0

Спасибо большое! Не его загрузка намного быстрее, чем раньше! Я делаю некоторые исследования некоторых из вещей, которые вы упомянули в своем коде, поскольку они не знакомы с ними! – Lobialkon