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

Вниз

Рисование в главном цикле программы   Найти похожие ветки 

 
Zergling ©   (2003-09-25 13:13) [0]

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

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;


 
clickmaker ©   (2003-09-25 13:23) [1]

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


 
Zergling ©   (2003-09-26 05:58) [2]

clickmaker © (25.09.03 13:23) [1]

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


 
Zergling ©   (2003-09-26 08:19) [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;


 
clickmaker ©   (2003-09-26 12:42) [4]

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

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

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


 
Zergling ©   (2003-09-27 06:21) [5]

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

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



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

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

Наверх




Память: 0.47 MB
Время: 0.029 c
6-79084
Tommy
2003-09-16 16:18
2003.11.24
Sinxronizacia setevogo vremeni


1-79002
Aik
2003-11-12 10:39
2003.11.24
Кнопка вперёд и назад, Twebbrowser


3-78813
Disruptor
2003-10-10 12:14
2003.11.24
Какую СУБД лучше использовать локально


14-79134
Ihor Osov'yak
2003-11-01 12:21
2003.11.24
Что-то с чатом траблы..


3-78835
WellSlava
2003-11-04 11:36
2003.11.24
Сжатие DBF-файлов.