Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.038 c
14-1090834950
myor
2004-07-26 13:42
2004.08.15
конвертирование sc4 в doc


3-1090358453
sashok
2004-07-21 01:20
2004.08.15
Interbase


14-1090991486
Мазут Береговой
2004-07-28 09:11
2004.08.15
Интересные факты.


14-1090881349
Sanek_metaller
2004-07-27 02:35
2004.08.15
Люди! Кто нибудь играл в Gothic 2 !!!!?????


3-1090227197
Rusty
2004-07-19 12:53
2004.08.15
Как преобразовать дату в формате dd.mm.yyyy в формат dd/mm/yyyy?