Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Вова   (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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
4-87205
kofman
2002-12-12 00:14
2003.01.27
Как после восстановления проги из трея расположит ее поверх всех?


14-87139
smitt
2003-01-08 13:27
2003.01.27
Минимальное приложение


6-87000
RGG
2002-11-27 13:29
2003.01.27
Помогите примером


14-87145
Феликс
2003-01-10 02:41
2003.01.27
В чем сила?


3-86696
soware
2003-01-08 08:49
2003.01.27
Halcyon & SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский