Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.048 c
1-1100706304
Apophis
2004-11-17 18:45
2004.12.05
PageControl на Form1 + Form2 на TabSheet...


9-1091170595
VolanD
2004-07-30 10:56
2004.12.05
Где взять графику?


8-1094316563
Sfinks
2004-09-04 20:49
2004.12.05
Анимированый *.jif


1-1100882886
aliced
2004-11-19 19:48
2004.12.05
Incopatible types: String and Char


4-1098296251
Comp
2004-10-20 22:17
2004.12.05
ToolBar и 64-разрядная пиктограмма