Проблема с обработкой сообщения WM_PAINT
От: KingT  
Дата: 25.03.09 16:37
Оценка:
создал простое MDI приложение в котором есть окно для рисования графики.Для окна написал простой обработчик сообщения WM_PAINT.

Код C#

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
int boarder = 10;
int Height = e.ClipRectangle.Height;
int Width = e.ClipRectangle.Width;

System.Console.Beep(4000,10);
System.Drawing.Graphics gr = e.Graphics;
Color color = Color.Red;
Pen pen = new Pen(color);

Rectangle rect = new Rectangle(boarder,boarder,Width-20,Height-20);
gr.DrawRectangle(pen,rect);
}

этот код просто рисует рамку в форме.Проблема в том что когда я начинаю менять размер окна то рамка не прорисовывается с учетом нового размера окна.Хотя сообщение WM_PAINT пирходит так как идет звуковой сигнал.Но если растянутое окно минимизировать а затем поднять то все прорисовывается.В чем проблема.Единственное что приходит на ум так то что при ресайзе
int Height = e.ClipRectangle.Height;
int Width = e.ClipRectangle.Width;
не получают новые размеры окна.А при минимайзе получают.
Как исправить?
Re: Проблема с обработкой сообщения WM_PAINT
От: Кондраций Россия  
Дата: 26.03.09 06:00
Оценка:
Здравствуйте, KingT, Вы писали:

KT>создал простое MDI приложение в котором есть окно для рисования графики.Для окна написал простой обработчик сообщения WM_PAINT.


KT>Код C#


KT>protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)

KT> {
KT> int boarder = 10;
KT> int Height = e.ClipRectangle.Height;
KT> int Width = e.ClipRectangle.Width;

KT> System.Console.Beep(4000,10);

KT> System.Drawing.Graphics gr = e.Graphics;
KT> Color color = Color.Red;
KT> Pen pen = new Pen(color);

KT> Rectangle rect = new Rectangle(boarder,boarder,Width-20,Height-20);

KT> gr.DrawRectangle(pen,rect);
KT> }

KT>этот код просто рисует рамку в форме.Проблема в том что когда я начинаю менять размер окна то рамка не прорисовывается с учетом нового размера окна.Хотя сообщение WM_PAINT пирходит так как идет звуковой сигнал.Но если растянутое окно минимизировать а затем поднять то все прорисовывается.В чем проблема.Единственное что приходит на ум так то что при ресайзе

KT>int Height = e.ClipRectangle.Height;
KT>int Width = e.ClipRectangle.Width;
KT>не получают новые размеры окна.А при минимайзе получают.
KT>Как исправить?
Строго говоря, ClipRectangle содержит минимальный прямоугольник, охватывающий инвалидную область окна, которую и нужно перерисовать. ИМХО, лучше сразу брать ClientRectangle.
А для исправления добавь обработчик:

private void Form1_Resize(object sender, EventArgs e)
{
    Invalidate();
}

Тогда добавляется сообщение WM_ERASEBKGND.
Сообщение заговорено потомственным колдуном, целителем и магом в девятом поколении!
Модерирование или минусование сообщения ведет к половому бессилию, венерическим заболеваниям, венцу безбрачия и диарее!
Re[2]: Проблема с обработкой сообщения WM_PAINT
От: MxKazan Португалия  
Дата: 26.03.09 07:54
Оценка:
Здравствуйте, Кондраций, Вы писали:

К>Строго говоря, ClipRectangle содержит минимальный прямоугольник, охватывающий инвалидную область окна, которую и нужно перерисовать. ИМХО, лучше сразу брать ClientRectangle.

К>А для исправления добавь обработчик:
К>
К>private void Form1_Resize(object sender, EventArgs e)
К>{
К>    Invalidate();
К>}
К>


Ну, или другой вариант. Установить в конструкторе в стиле флаг ResizeRedraw.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.