Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.017 c
1-78956
boby_g
2003-11-11 21:58
2003.11.24
Функция Pos с параметром BegPos???


3-78763
Serg_KG
2003-11-02 18:42
2003.11.24
Поиск в базе


1-78947
Анна
2003-11-12 09:51
2003.11.24
Переместить папку


1-78946
Svin
2003-11-12 09:48
2003.11.24
MS Excel - преобразование синтаксиса


3-78790
Alibaba
2003-11-04 13:17
2003.11.24
Результат




   Наверх