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

Вниз

Правильное востановление окна   Найти похожие ветки 

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

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


 
cyborg ©   (2004-07-24 22:28) [1]

Я длеаю освобождение граф ресурсов и инициализацию заново, так надёжнее :), а без этого глюки всякие, в которых, скорей всего я виноват.


 
Белый Крыс ©   (2004-07-24 22:30) [2]

Скажем, в начале рендера, или вообще при рендери проверяй результат функций. Пример:

hRet  : HRESULT;
...
hRet := FBackGround.BltFast(0, 0, FBack, @Rec, DDBLTFAST_WAIT);  
if hRet = DDERR_SURFACELOST then //то восстанавливаем
 
 FPrimarySurface._Restore;
 FSurface1 := DDLoadBitmap(FDirectDraw, "objs.bmp", 0, 0);
 DDSetColorKey(FObjs, rgb(255, 0, 255));
 FSurface := CreateSurf(FDirectDraw, ScrWidth, ScrHeight);
 ...


 
Белый Крыс ©   (2004-07-24 22:36) [3]

Достаточно один раз в начале. Освобождения я не делал. Ну вроде глюков не было, не только у меня не было :)


 
cyborg ©   (2004-07-24 22:41) [4]


> Достаточно один раз в начале. Освобождения я не делал. Ну
> вроде глюков не было, не только у меня не было :)

Просто столкнуллся с проблемой, что в некоторых случаях экранное разрешение не восстанавливается, плюнул на всё и сделал переинициализацию.


 
Zak3D[@Tm] ©   (2004-07-24 22:58) [5]

Спасибо, но я немного не то просил, вот какая проблеам, куда вообще поместить обработчик этого события??? Нажал я alt+tab, окно свернулось, а как его востановить???


 
cyborg ©   (2004-07-24 23:15) [6]

Если форма Дельфи, то OnShow.


 
Zak3D[@Tm] ©   (2004-07-24 23:23) [7]

cyborg
Тогда уж WM_SHOW... ( Я же сказал API)


 
Zak3D[@Tm] ©   (2004-07-24 23:26) [8]

Даже не так, а WM_SHOWWINDOW


 
cyborg ©   (2004-07-24 23:41) [9]

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


 
Zak3D[@Tm] ©   (2004-07-25 13:07) [10]

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


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


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

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


 
Zak3D[@Tm] ©   (2004-07-25 14:34) [12]

Вот модуль отвечающий за создание окна
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 <= ScreenWidth - 25
                     then xPos := xPos
                     else xPos := ScreenWidth - 25;
                     if yPos <= ScreenHeight - 25
                     then yPos := yPos
                     else yPos := ScreenHeight - 25;
                     end;

  WM_CLOSE      : begin
                   Quit:= True;
                   DestroyWindow(WinHWND);
                   Halt;                  
                  end;
 end;  
 WndProc := DefWindowProc (WinHWND, Msg, WParam, LParam);
end;

function zCreateWindow : Boolean;
var
 WC : TWndClass;                
begin
 ZeroMemory( @WC, sizeof(wc));

 WC.style := CS_HREDRAW or CS_VREDRAW;
 WC.Lpfnwndproc := @WndProc;
 WC.Hinstance := hInstance;
 WC.hbrBackground := HBRUSH(GetStockObject(BLACK_BRUSH));
 WC.LpszClassName := "Window";
 WC.Hcursor := LoadCursor(0,IDC_ARROW);

 if RegisterClass(WC) = 0 then
 Halt(255);

 WinHWND := CreateWindow("Window",
 "",
  WS_POPUP or WS_VISIBLE,
  0,
  0,
  ScreenWidth,
  ScreenHeight,
  0,
  0,
  hInstance,
  nil);
 if (WinHWND = 0) then
 begin
   WriteLog("&#206;&#234;&#237;&#238; &#237;&#229; &#241;&#238;&#231;&#228;&#224;&#237;&#238;");
   exit;
 end;
end;


 
parovoZZ ©   (2004-07-25 20:25) [13]

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


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

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


 
cyborg ©   (2004-07-25 22:25) [15]


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

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


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

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


 
cyborg ©   (2004-07-26 09:45) [17]


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

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


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

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


 
cyborg ©   (2004-07-26 12:51) [19]


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

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


 
Zak3D[@Tm] ©   (2004-07-26 18:15) [20]

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


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

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


 
parovoZZ ©   (2004-07-26 20:51) [22]

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


 
cyborg ©   (2004-07-28 20:02) [23]

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


 
parovoZZ ©   (2004-07-28 22:09) [24]

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


 
Zak3D[@Tm] ©   (2004-07-29 11:40) [25]

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


 
Zak3D[@Tm] ©   (2004-07-30 07:40) [26]

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;  //Код находится в основном модуле проекта.


 
cyborg ©   (2004-07-30 08:52) [27]

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


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; - Ждём, пока не закончится рендеринг (флаг ставится перед началом рендеринга сцены и сбрасывается по окончании. Чтобы не было переключений когда идёт рендеринг, могут ошибки вылезти.


 
cyborg ©   (2004-07-30 08:53) [28]

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.53 MB
Время: 0.037 c
1-1101290926
Prove
2004-11-24 13:08
2004.12.05
как такое возможно?


14-1100511354
помаранчевий Жук
2004-11-15 12:35
2004.12.05
Андрей Шевченко забил 100-й мяч в Серии А!


1-1101313562
Ilg
2004-11-24 19:26
2004.12.05
Variable Name Expected


3-1099639485
diabolik_krsk
2004-11-05 10:24
2004.12.05
Сохранение данных их ComboBox в Access


1-1100691323
dron-s
2004-11-17 14:35
2004.12.05
Обработка нажатия клавиши Enter





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