Форум: "Игры";
Текущий архив: 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("Îêíî íå ñîçäàíî");
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