Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.27;
Скачать: CL | DM;

Вниз

Рисование на форме   Найти похожие ветки 

 
Вова   (2002-12-12 03:43) [0]

Доброе время суток, уважаемые мастера!
Задача такая:
Есть форма созданная средствами VCL, пытаюсь на ней рисовать при-
меняя такой код:

procedure Show;
var
i,j:Byte;
x,y:Integer;
Window:HWnd;
dc:HDC;
MyPaint : TPAINTSTRUCT;
Brush:hBrush;
Pen:hPen;
begin
Window:=TetFrm.Handle;
dc := BeginPaint (Window, MyPaint);
for i:=1 to 16 do
for j:=1 to 10 do begin
x:=x0+16*(j-1); y:=y0+16*(i-1);
if Matrix[i,j] then begin
Brush := CreateSolidBrush (RGB (255, 255,0));
Pen := CreatePen (PS_SOLID, 1, RGB (0, 255, 255));
SelectObject (dc, Brush);
SelectObject (dc, Pen);
Rectangle(dc,x,y,16,16)
end else begin
Brush := CreateSolidBrush (RGB (0, 255,0));
Pen := CreatePen (PS_SOLID, 1, RGB (0, 255, 0));
SelectObject (dc, Brush);
SelectObject (dc, Pen);
Rectangle(dc,x,y,16,16)
end;
end;{for}
DeleteObject(Pen);
DEleteObject(Brush);
EndPaint (Window, MyPaint);
ReleaseDC (Window, dc);
end;

procedure TTetFrm.FormCreate(Sender: TObject);
begin
........
Show
end;

Вопрос: почему ничего не рисуется? В чем мое заблуждение?

Спасибо!


 
Игорь Шевченко ©   (2002-12-12 09:49) [1]

В том, что как минимум, необходимо обрабатывать сообщение WM_PAINT а не вызывать процедуру из события OnCreate формы.
Или альтернативный способ - обрабатывать событие OnPaint формы, при этом вызовы BeginPaint/EndPaint не нужны, а DC получается из Form.Canvas.Handle.


 
KSergey ©   (2002-12-12 09:55) [2]

Ессли позволите, немного дополню ответ Игоря.
В Win рисование на окне (а более в Win ничего и нет, вернее ни на каком другом объекте рисовать нельзя) надо делать ни когда захочется, а только в обработчике сообщения WM_PAINT. В принципе, часто можно рисовать и не в нем, но... Короче почитайте про архитектуру виндов, сообщения, когда что надо делать и т.д. Долговасто однако выйдет тут описывать все.


 
Ich Hasse ©   (2002-12-12 10:36) [3]

> KSergey
позволю не согдаситься- рисовать можно всегда, но что получится никто не знает, может появиться мелькание, а может и не появится...


 
Игорь Шевченко ©   (2002-12-12 10:54) [4]

KSergey © (12.12.02 09:55)

> В Win рисование на окне

Рисуют обычно на Device context.

> а только в обработчике сообщения WM_PAINT

Неправда. В любом месте.


 
KSergey ©   (2002-12-12 11:31) [5]

> Игорь Шевченко © (12.12.02 10:54)
> Рисуют обычно на Device context.

Согласен, учиться мне еще долго.

> а только в обработчике сообщения WM_PAINT
> Неправда. В любом месте.

В любом месте можно или в любом месте нужно? Вот тут бы я поспорил (хотя лучше не буду, однако). Можно - да. Иногда и нужно, но чаще - не надо в любом месте рисовать. Для это, как сами понимаете, и есть WM_PAINT.


 
Игорь Шевченко ©   (2002-12-12 11:47) [6]

KSergey © (12.12.02 11:31)

При всем своем к тебе уважении, позволю себе заметить, что сообщение WM_PAINT посылается окну в тот момент, когда в очереди нет более важных сообщений и у онка есть области нуждающиеся в перерисовке, например, окно перестало заслоняться другим окном или изменило размер. У Windows есть принцип, что каждое окно само отвечает за свой внешний вид и обязано себя уметь перерисовывать по требованию. Когда такое требование возникает, посылается сообщение WM_PAINT. Но рисовать в любой другой момент (например, окно отображает динамику какого-то процесса графически) ни одна сура Корана не запрещает.

С уважением,


 
Юрий Зотов ©   (2002-12-12 12:02) [7]

Дык... рисовать-то, конечно, можно когда хочешь, никто не запрещал. Однако же, это рисование придется продублировать в обработчике OnPaint/WM_PAINT, иначе при первой же перерисовке окна нарисованное будет затерто (что и наблюдает автор вопроса). А если так, то какой же смысл в 2-х одинаковых рисованиях, если можно обойтись одним?


 
Игорь Шевченко ©   (2002-12-12 12:18) [8]

Юрий Зотов © (12.12.02 12:02)

:-)

Автор, да, наблюдает. Согласен.
Есть два пути, либо, по изменению состояния окна изнутри приложения изменить состояние флажков рисования, сказать Invalidatexxxx и дождаться сообщения WM_PAINT, где по состоянию нарисовать, либо, нарисовать сразу и запомнить состояние для дальнейшей правильной прорисовки в WM_PAINT, если на то будет нужда. Дело в том, что в обработчике WM_PAINT вычислять только те области, которые нуждаются в прорисовке, не всегда выгодно, а возлагать всю работу на GDI и рисовать все окно, полагаясьн на отсечение, не всегда быстро.

С уважением,



Страницы: 1 вся ветка

Текущий архив: 2003.01.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
8-86979
Ya Mama
2002-10-08 01:30
2003.01.27
Регулировка уровня громкости Media Player a


1-86816
Urn
2003-01-17 20:21
2003.01.27
Как сделать default?


4-87183
LazorenkoX
2002-12-11 00:32
2003.01.27
Помогите с версией файла!!!


3-86635
Natalie
2003-01-07 06:16
2003.01.27
как в репотре перейти на новую страницу??


9-86610
Карлсон
2002-07-27 15:27
2003.01.27
Почему столкновения не всегда срабатывают?