Форум: "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