Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рисование в главном цикле программы [D7, Win95/98, WinXP]


Zergling ©   (2003-09-25 13:13:00) 

Есть главный цикл программы

While GetMessage(WC_MSG, 0, 0, 0) do
begin
TmpTime := GetTickCount;
// Преобразование клавиатурного ввода
TranslateMessage(WC_MSG);
// Посылка сообщения в процедуру обработки сообщений (WndProc)
DispatchMessage(WC_MSG);
// Отлавливаем состояние нажатия клавиши ESCAPE
if Boolean(GetAsyncKeyState(VK_ESCAPE) shr 16) then
PostMessage(WC_HWND, WM_DESTROY, 0, 0);
SetPixel(WC_HDC, Random(300), Random(100), RGB(Random(255), Random(255), Random(255)));
while GetTickCount - TmpTime < 100 do
// PostMessage(WC_HWND, WM_PAINT, 0, 0);
end;

В нем рисую, но обновление окна происходит когда я вожу курсором мыши в клиенсткой части окна. Если посылать сообщение PostMessage(WC_HWND, WM_PAINT, 0, 0);, то происходит перерисовка, но программе уже не реагирует на действия пользователя. Чего мне нужно добавить?
Пробовал и такой цикл, но окно сразу закрывается:
While PeekMessage(WC_MSG, 0, 0, 0, PM_REMOVE) do
begin
...
end;


Zergling   (2003-09-27 06:21:00) [1]

Вот моя ошибка!
WC_PRect^ := WC_Rect;
А нужно
WC_PRect := @WC_Rect;

Всем спасибо за ответы!


clickmaker   (2003-09-26 12:42:00) [2]

Говорить InvalidateRect в обработчике WM_PAINT не есть правильно. Собственно эта функция и ставит в очередь WM_PAINT, помечая указанный Rect как требующий перерисовки. А в обработчике этого сообщения обычно рисуют содержимое окна

BeginPaint
// рисование на полученном из BeginPaint HDC
...
EndPaint

А если у тебя в главном цикле после SetPixel не обновляется картинка, то поставь после него RedrawWindow c флагами RDW_INVALIDATE or RDW_UPDATENOW


Zergling   (2003-09-26 08:19:00) [3]

По InvalidateRect. Добавил это, программа работает некоторое время, а потом вылетает, что не выполнила недопустимую операцию в модуле Kernell32.dll ...

var
WC_Rect: TRect;
WC_PRect: PRect;

case uMsg of
WM_SIZE: GetClientRect(WC_HWND, WC_Rect);
WM_PAINT:
begin
WC_PRect^ := WC_Rect;
InvalidateRect(WC_HWND, WC_PRect, false);
end;
end;


Zergling   (2003-09-26 05:58:00) [4]

clickmaker © (25.09.03 13:23) [1]

Пробовал объявить не действительной клиентскую часть окна с помощью InvalidateRect в обработке сообщения WM_PAINT, но не могу подружиться с типом PRect, вылетает ошибка RunTime 256. Можно пример использовния PRect.


clickmaker   (2003-09-25 13:23:00) [5]

Не стоит посылать окну WM_PAINT. Лучше функциями InvalidateRect или RedrawWindow


Наверх

Титульная страница Поиск, карта сайта Написать письмо