Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.035 c
14-1090934233
Gorlum
2004-07-27 17:17
2004.08.15
CD-RW c возможностью прожига букв на диске


6-1087165146
alienserg
2004-06-14 02:19
2004.08.15
Кто юзал Indy при большом к-ве клиентов на сервере?


1-1091181272
Sancho
2004-07-30 13:54
2004.08.15
Хэндл, динамически загружаемый пакет


1-1091337420
Navi
2004-08-01 09:17
2004.08.15
Code Explorer


14-1091292852
nelud
2004-07-31 20:54
2004.08.15
Задачи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский