как я могу назвать событие paint?

<p>моя программа рисует текст на своей панели, но если я хочу удалить текст, мне нужно перекрасить.</p><p>как мне вызвать (поднять) событие paint вручную?</p>

<p>метод invalidate () вызовет перерисовку.</p><p> <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invalidate.aspx">msdn link</a> </p>

<p>в методе вашей формы или контроля у вас есть 3 варианта:</p><pre><code>this.invalidate(); // request a delayed repaint by the normal messageloop system this.update(); // forces repaint of invalidated area this.refresh(); // combines invalidate() and update() </code></pre><p>обычно вы просто вызываете <code>invalidate()</code> и позволяете системе объединить это с другими обновлениями экрана. если вы спешите, вы должны вызвать <code>refresh()</code>, но тогда вы рискуете, что он будет перекрашиваться несколько раз подряд из-за аннулирования других элементов управления (особенно родительского). </p><p>обычный способ, которым windows (win32 и winforms.net) обрабатывает это, состоит в том, чтобы дождаться, пока <a href="http://en.wikipedia.org/wiki/message\_loop\_in\_microsoft\_windows">messagequeue</a> не запустится, а затем обработать все недействительные области экрана. это эффективно, потому что когда что-то меняется, что обычно каскадно переходит в другие вещи (элементы управления). </p><p>наиболее распространенный сценарий для update () - это когда вы изменяете свойство (скажем, label1.text, которое сделает недействительным метку) в цикле for, и этот цикл временно блокирует цикл обработки сообщений. всякий раз, когда вы используете его, вы должны спросить себя, не следует ли вам вместо этого использовать поток. но ответ не всегда да. </p>

<p>я обнаружил, что<em> invalidate () </em>создает слишком много мерцания. вот моя ситуация. пользовательский элемент управления, который я разрабатываю, рисует его<em> все содержимое </em>посредством обработки события<em> paint </em>.</p><pre><code>this.paint += this.onpaint; </code></pre><p>этот обработчик вызывает пользовательскую процедуру, которая выполняет фактическую рисование.</p><pre><code>private void onpaint(object sender, painteventargs e) { this.drawframe(e.graphics); } </code></pre><p>чтобы имитировать прокрутку, я хочу перекрашивать свой элемент управления каждый раз, когда курсор перемещается, пока нажата левая кнопка мыши. моим первым выбором было использование<em> invalidate () </em>, как показано ниже.</p><pre><code>private void redrawframe() { var r = new rectangle( 0, 0, this.width, this.height); this.invalidate(r); this.update(); } </code></pre><p>управление прокручивается в порядке, но<em> мигает </em>далеко за пределы любого удобного уровня. поэтому я решил вместо перерисовки элемента управления вызывать мой метод<em> drawframe () </em>непосредственно после обработки события<em> mousemove </em>. это произвело плавную прокрутку без мерцания.</p><pre><code>private void redrawframe() { var g = graphics.fromhwnd(this.handle); this.drawframe(g); } </code></pre><p>такой подход может быть неприменим ко всем ситуациям, но пока он мне подходит.</p>

<p>я думаю, что вы также можете позвонить <code>refresh()</code>.</p>

<p>вызовите control.invalidate и событие paint будет вызвано.</p>

<p>обновление, вероятно, также сделает код более читабельным, в зависимости от контекста.</p>

<p>используйте <code>control.invokepaint</code> вы также можете использовать его для ручной двойной буферизации</p>