Главная страница
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
9-78746
greenrul
2003-05-16 19:45
2003.11.24
Проблемы с динамически создаваемыми объектами.


14-79157
alxx
2003-10-31 11:04
2003.11.24
Быстрая графика в Delphi


14-79177
undert
2003-10-30 19:17
2003.11.24
ПОМОГИТЕ ! TStringGrid


3-78754
Vemer
2003-11-03 12:58
2003.11.24
Sweep БД из-под Delphi.


3-78789
Term
2003-11-05 12:38
2003.11.24
QReport, помогите решить проблему....