Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Правильное востановление окна [Delphi, Windows]


Страницы:   1 2

Zak3D[@Tm] ©   (2004-07-24 22:15:00) 

Мне необходимо востановить окно (сознанное на  API), после его сворачивания. На окне выводится сцена на DirectDraw, как это правильно сделать? Знаю, что нужно узать ф-цию (RestoreALL) и в ней востанавливать все объекты, но где эту замую ф-цию обрабатывать? В какой обработчик её поместить?


cyborg   (2004-07-30 08:53:00) [1]

exit(0); - это Фрипаскалевский выход, в Дельфи делай:
Result:=0;
Exit;


cyborg   (2004-07-30 08:52:00) [2]

Вот мой обработчик:


function WndProc(wnd : HWnd; msg : Cardinal; wParam, lParam : Longint) : LResult; stdcall;
begin
 case msg of
 WM_PAINT:
   begin
    ValidateRect(Wnd,0);
    Result:=0;
   end;
 //Пользователь переключает задачи:
 WM_ACTIVATE :
  Begin
   case Lo(wParam) of
    WA_ACTIVE,WA_CLICKACTIVE :
     Begin
      if Hi(wParam)=0 then
      if not ActiveProgram then
      begin
        Repeat until not Rendered;
        ResetKeysState;      //Сброс состояния нажатых клавиш
        ActiveProgram:=True; //Флаг активности программы
        Result:=0;
      end;
     End;
    WA_INACTIVE :
     if ActiveProgram then
     Begin
       Repeat until not Rendered;
       ActiveProgram:=False; //Флаг активности программы
       ResetKeysState;       //Сброс состояния нажатых клавиш
       Result:=0;
     End;
    end;//case Lo(wParam)
   End;

   WM_CLOSE:
     begin
       DestroyWindow(wnd);
       exit(0);
     end;

   WM_DESTROY:
     begin
       _Quit_:=True;
       PostQuitMessage(0);
       exit(0);
     end;
   else exit(DefWindowProc(wnd, msg, wParam, lParam));
 end; //case msg
end;


ResetKeysState; - сбрасывает состояние клавишь, чтобы при переключении из игры при нажатой клавише "идти вперёд" и затем обратно в игру герой не шёл, например, вперёд пока не нежмём ещё раз клавишу вперёд.

_Quit_:=True; - установка флага выхода из главного цикла игры.

Repeat until not Rendered; - Ждём, пока не закончится рендеринг (флаг ставится перед началом рендеринга сцены и сбрасывается по окончании. Чтобы не было переключений когда идёт рендеринг, могут ошибки вылезти.


Zak3D[@Tm]   (2004-07-30 07:40:00) [3]

cyborg - Я сделал как ты, т.е.
================================
WM_ACTIVATE :    begin
                    case Lo(wParam) of
                    WA_ACTIVE,WA_CLICKACTIVE : ActiveProgram:=True;  
                    WA_INACTIVE              : ActiveProgram:=False;
                    end;
                  End;
=================================
Я рисую олько если ActiveProgram = true, правильно ли я делаю?
Вот код :
if ActiveProgram then;
   Draw;  //Код находится в основном модуле проекта.


Zak3D[@Tm]   (2004-07-29 11:40:00) [4]

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


parovoZZ   (2004-07-28 22:09:00) [5]

А вот если я с окном ничего не делаю(не сворачиваю/разворачиваю), то поверхность может потеряться? Просто я копирую поверхность в буфер и изображение на ней исчезает (так происходит в 98-ой, в ХР всё нормально). Может из-за версии DirectDraw зависит?


cyborg   (2004-07-28 20:02:00) [6]

Сейчас сделал 2ДЕнгине для Танчиков, восстановление по человечески сделал, как ни странно работает :).


parovoZZ   (2004-07-26 20:51:00) [7]

Да программа на отрисовке зацикливается, потому и не реагирует на сообщения. Решение проблемы: либо предложенное выше, либо закрываить программу))


Белый Крыс   (2004-07-26 19:24:00) [8]

~ОФИГЕВШИЙ~
Эээ... Оно не разворачивается вообще? Или разворачивается, но нер исует ничего?
Я так понял - первое. А на чем прога? VCL?
Вообще это само делаться должно. Я с таким не сталкивался. Может, при сворачивании надо ставить флаг, и если он включен, то ничего не рисовать. Возможно, программа виснет или зацикливается.
Как у тебя организован главный цикл программы. Возможно дело в этом.


Zak3D[@Tm]   (2004-07-26 18:15:00) [9]

Белый Крыс
//В каких случаях, если не секрет.
//а как его востановить???
//Попробуй, нажимая Alt+Tab, найти его и отпустить комбинацию,оно снова развернется :) Есть и другие способы ;)
----------
Остро, но в том то и дело, что не получается!!!(Alt+Tab сворачивает окно, а на разворачивание никак не реагирует.


cyborg   (2004-07-26 12:51:00) [10]


> Может дело в дровах?

А может и во мне :)


Белый Крыс   (2004-07-26 12:37:00) [11]

Удалено модератором


cyborg   (2004-07-26 09:45:00) [12]


> [16] parovoZZ ©   (26.07.04 00:31)

Чего? Моя твоя не понимать!


parovoZZ   (2004-07-26 00:31:00) [13]

А не проще ли запретить или вообще сворачивать удочки при таком отношении юзверя к проблеме?


cyborg   (2004-07-25 22:25:00) [14]


> [14] Белый Крыс ©   (25.07.04 20:50)
> В каких случаях, если не секрет.

Нажимаешь Alt+Tab и обратно, всё восстанавливается нормально, повторяешь второй раз или третий или четвёртый (когда как) и бздыкс, приехали.


Белый Крыс   (2004-07-25 20:50:00) [15]

2 Zak3D[@Tm]
Если ты не заметил, то еще в первом своем посте я указал, куда это вставить. А именно после получения результата DDERR_SURFACELOST при рисовании. Проверяй результат первой функции рисования, которая вызывается и если он равен вышеупомянотому, то делай восстановление.
При активизации окна лучше не ставить. Ведь могут быть и случаи, когда не деактивизация приводит к потере поверхности, а что-то другое.
2 cyborg
В каких случаях, если не секрет.
а как его востановить???
Попробуй, нажимая Alt+Tab, найти его и отпустить комбинацию, оно снова развернется :) Есть и другие способы ;)


parovoZZ   (2004-07-25 20:25:00) [16]

Флаг активности окна вводи. Когда окно свёрнуто, все перерисовки сворачивай (заодно и игровой процесс остановишь), чтоб окно смогло обрабатывать сообщения. По этому же флагу можно делать переинициализацию.


Zak3D[@Tm]   (2004-07-25 14:34:00) [17]

Вот модуль отвечающий за создание окна
function WndProc(WinHWND: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
Var              
 MyPaint : TPaintStruct;
 Brush : hBrush;
begin
 WndProc := 0;
 case Msg of

  WM_DESTROY    : begin
                   Quit:= True;
                   PostQuitMessage(0);                      
                   Exit;
                  end;

  WM_KEYDOWN :    begin
                  case LoWord(Wparam) of
                  VK_ESCAPE:  SendMessage(WinHWND, WM_CLOSE, 0, 0);
                  VK_LEFT:   lft := lft - step;
                  VK_RIGHT:  lft := lft + step;
                  end;
                  end;

  WM_MOUSEMOVE  : begin
                     xpos := LoWord ( LParam );
                     ypos := HiWord ( LParam );
                     if xPos


ПсихЪ_задумчивый   (2004-07-25 13:20:00) [18]


> Zak3D[@Tm] ©   (25.07.04 13:07) [10]

Ты лучше напиши, что в параметрах окна ты указал. Напиши код создания окна.


Zak3D[@Tm]   (2004-07-25 13:07:00) [19]

ммм, вот, ща объясню, в чём у меня проблема.
Когда я нажимаю alt+tab окно сворачивается, но востановить его я не могу, т.е. оно вообще не реагирует и так и остается свёрнутым. (сори, что с начала не объяснил толком в чем состоит вопрос ...)
Что в параметрах окна я забыл указать?, почему оно не востанавливается вообще?


cyborg   (2004-07-24 23:41:00) [20]

я на wm_Activate - WA_ACTIVE, WA_INACTIVE повесил.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо