Текущий архив: 2004.08.15;
Скачать: CL | DM;
Вниз
WM_PAINT? Найти похожие ветки
← →
parovoZZ © (2004-07-02 18:46) [0]Собственно как правильно перехватывать сообщение о перерисовке окна (аналогичное OnPaint)? Почему-то всё зацикливается на обработке этого сообщения. Ежели делать через процедуру procedure TfrmDD.FormPaint(Sender: TObject), то всё нормально. Испоьзуется DirectDraw.
← →
VMcL © (2004-07-02 20:10) [1]>>parovoZZ © (02.07.04 18:46)
>Почему-то всё зацикливается на обработке этого сообщения.
Код в студию.
← →
parovoZZ © (2004-07-03 01:36) [2]function WindowProc (h_Wnd : THandle; MSG, wParam, lParam : Integer) : Integer; stdcall;
begin
Result := 0;
case MSG of
WM_DESTROY : begin
DestroyDirectDraw;
PostQuitMessage (0);
exit;
end;
WM_PAINT : begin
DDPaint;
end;
else Result := DefWindowProc (h_Wnd, MSG, wParam, lParam);
end;
end;
procedure DDPaint;
var
hRet : HRESULT;
ddbltfx : TDDBLTFX;
srcRect, dstRect : TRect;
begin
ZeroMemory (@ddbltfx, SizeOf (ddbltfx));
ddbltfx.dwSize := SizeOf (ddbltfx);
ddbltfx.dwFillColor := 0;
while true do
begin
hRet := FDDSPrimary.Blt (nil, nil, nil, DDBLT_WAIT or DDBLT_COLORFILL, @ddbltfx);
if hRet = DDERR_SURFACELOST then
begin
if failed (RestoreAll) then exit;
end
else Break;
end;
SetRect (dstRect, 100, 100, 356, 356);
SetRect (srcRect, 0, 0, 256, 256);
while true do
begin
hRet := FDDSPrimary.Blt (@dstRect, FDDSImage, @srcRect, DDBLT_WAIT, nil);
if hRet = DDERR_SURFACELOST then
begin
if failed (RestoreAll) then exit;
end
else Break;
end
end;
Я так понимаю, что сабж посылается процедурой DDPaint, отлавливается окном, обрабатывается процедура и так по кругу. Но почему с событием OnPaint главной формы такого не происходит?
← →
VMcL © (2004-07-03 12:59) [3]AFAIK, обычно перерисовку делают при простое программы. Т. е. если пользуешься Forms, то в Application.OnIdle. Если не пользуешься, тогда в своем цикле выборки сообщений как-нибудь так:
while True do
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
if Msg.Message <> WM_QUIT then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end
else
Break;
end
else
CallMyPaintProc(...); // Render a frame during idle time (no messages are waiting)
← →
parovoZZ © (2004-07-05 22:46) [4]Хм, работает, но опять таки цикл. И надо ещё флаг активности вводить. А вообще обязательно в DirectDraw обновлять картинку так часто? Ведь если она остаётся без изменений, зачем тогда так часто обновлять, или я чт-то не понимаю. И почему при анимации используется часто именно такой вариант, а не таймер? Для быстродейстия? Тогда на разных машинах будет разная скорость анимации или я не прав?
← →
VMcL © (2004-07-06 11:19) [5]>>parovoZZ © (05.07.04 22:46) [4]
>Для быстродейстия? Тогда на разных машинах будет разная скорость анимации или я не прав?
Ну а чего бы иначе в играх разные FPS были? :-)
>И надо ещё флаг активности вводить.
Да, обычно, так и делают.
P.S.
(Шепотом) Ключевая фраза написана в комментарии:
// Render a frame during idle time (no messages are waiting)
← →
inic © (2004-07-06 11:32) [6]Может поможет ??
ValidateRect (wnd, nil)
или BeginPaint() & EndPaint()
Страницы: 1 вся ветка
Текущий архив: 2004.08.15;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.027 c