Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.017 c
4-79243
free
2003-09-25 23:04
2003.11.24
Нажатие клавишь


14-79145
VictorT
2003-10-30 23:38
2003.11.24
Отладка PHP


1-79026
bers
2003-11-13 22:04
2003.11.24
Ожидание завершения чужой программы


3-78839
Svin
2003-11-04 09:52
2003.11.24
Перехват исключительных ситуаций из MS SQL Server 2000


1-79003
Aik
2003-11-14 10:05
2003.11.24
Ошибка при использовании Webbrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский