{{notification.text}}

MirGames

adskiy_sotona
23.11.07 21:30
0
Разбираюсь в директх через дельфи по соответствующей книге Фленова, и никак не могу вкурить, как правильно организовать обработку окна, чтобы оно обновлялось и перерисовывалось, как надо...
Использую приложенные к книге шаблоны пока, там идёт, ну, стандартная, насколько я понимаю (я просто винапи не знаю нифига, щас вот как зароюсь...), "подмена" класса окна своим классом с нужными обработчиками сообщений:
Код

function WindowProc(wnd: HWND; Msg: Integer; wParam: wParam; lParam: lParam): Lresult; stdcall;
begin
Result:=0;
case msg of
  WM_CREATE:
   begin
   end;
  WM_DESTROY:
   begin
    backsurf :=nil;
    primsurf :=nil;
    ppiDD :=nil;
    PostQuitMessage(0);
    exit;
   end;
  WM_PAINT:
   begin
     processing;
     drawscene;
   end;
else
  Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
end;
....
begin
wc.cbSize       := sizeof(wc);
wc.lpfnWndProc  := @WindowProc;
wc.cbClsExtra   := 0;
wc.cbWndExtra   := 0;
wc.hInstance    := HInstance;
wc.hCursor      := LoadCursor(0, IDC_ARROW);
wc.hbrBackground:= COLOR_BTNFACE+1;
wc.lpszMenuName := nil;
wc.lpszClassName:= 'delphi_directdraw';
RegisterClassEx(wc);

pWnd := CreateWindowEx(WS_EX_APPWINDOW, 'delphi_directdraw', 'Delphi DirectX Demo',
    WS_OVERLAPPED or WS_SYSMENU, 0, 0, 250, 130, 0, 0, Hinstance, nil);

ShowWindow(pWnd, SW_SHOW);
while GetMessage(pMsg, 0, 0, 0) do
  begin
    TranslateMessage(pMsg);
    DispatchMessage(pMsg);
  end;
end.


Суть конкретной проблемы в том, что программа (простое приложение использующее директдрав и выводящее на экран спрайтики) прорисовывается один раз (причём видно, что рисует всё правильно, корректно выполняя обе прописанные функции processing и drawscene), и далее наотрез отказывается обновляться сама. Подозреваю, что нужно как-то простимулировать появление события WM_PAINT. Но как?

В винапи ничего не понимаю, сплагиатить тоже не получилось (смотрел, например, исходники DGLEngine, нашёл подобную же структуру, но пока не понял, как она так ловко крутится, предоставляя программисту уже готовые к употреблению места для процессинга и рисования, и избавляя от рутинной организации всякого основного...).

В общем, если не трудно, подскажите, как без затей программе можно говорить, что WM_PAINT надо обрабатывать раз, да ещё раз, да ещё много-много раз.

з.ы. поиском не воспользовался, потому что не понимаю толком, что искать .
з.ы.ы. побёг русскую справку по винапи читать.
Отредактировано: 23.11.07 21:32
#21
07.12.07 18:03
0
DeadMage
Это удобно для тех случаев, когда надо выполнять какое-то действие пока нажата клавиша (например, WASD в шутерах), для тех случаев когда надо реагировать на нажатие - тогда удобнее сообщения.
#22
adskiy_sotona
09.12.07 07:32
0
Что касается клавиатуры, я потом сплагиатил принцип из DGLEngine - создаётся булевский массив, где номера элементов соответствуют wParam собщения нажатой клавиши. По KeyDown элементу присваивается "труъ", по KeyUp - "не труъ". Хоть все сразу нажимай.
#23
11.12.07 22:55
0
Цитата(MegaI2 @ 27.11.2007 - 22:10) [snapback]70640[/snapback]

сообщение о выходе обрабатываеться после того как окну послано WM_DESTROY
вывод - обрабатывать WM_QUIT и WM_DESTROY в WindowProc вместе :)

Отвечу лишь цитатой из MSDN
Цитата
The WM_QUIT message is not associated with a window and therefore will never be received through a window's window procedure. It is retrieved only by the GetMessage or PeekMessage functions.
#24
mov, просто mov
13.12.07 00:22
0
Drako
ошибся )) но суть в том что код неправильный :)
посылать WM_QUIT в WM_DESTROY чтобы поставить флаг ExitProgram на следующем цыкле - бред
лучше в WM_DESTROY ставить флаг ExitProgram )
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}