Форум: "WinAPI";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];
ВнизРисование в главном цикле программы Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c