![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильное востановление окна [Delphi, Windows]
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 повесил.