2013-03-10 2 views
1

Я выполняю пользовательскую обработку WM_PAINT и WM_ERASEBKGD в переопределении WndProc в элементе управления.Как правильно обрабатывать WM_PAINT, получая постоянную перекраску

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 0xF) 
    { 
     // [Draw using stored hDC] 

     m.Result = (IntPtr)1; 
    } 
    else if (m.Msg == 0x14) 
    { 
     m.Result = (IntPtr)1; 
    } 
    else 
     base.WndProc(ref m); 
} 

Он отлично работает, за исключением того, что называется постоянно, около 300 раз в секунду, и если я позволяю основание для того чтобы справиться с этим, она вызывается один раз. Что я оставляю?

+0

Чтобы сообщить Windowd, что окно окрашено, вы должны позвонить либо BeginPaint (стандартный путь), либо ValidateRect (если вы не используете стандартный цикл рисования, который, по-видимому, не так, по причинам, которые не объясняются). –

ответ

3

Это происходит потому, что вы не сказали Windows, что «грязный прямоугольник» больше не загрязнен и окрашен. Поэтому он продолжает генерировать сообщения WM_PAINT.

Обычно это делается с помощью BeginPaint/EndPaint(), вызываемого обработчиком сообщений по умолчанию, встроенным в .NET. Что вызывает виртуальный метод OnPaint(). Это рекомендуется для переопределения или обработки события Paint. Если вы не хотите использовать это по какой-то причине, вам придется вызывать ValidateRect().

Смежные вопросы