{{notification.text}}

MirGames

Mahno
18.08.12 19:52
0
Доброго времени суток!
Вопрос состоит в следующем: можно ли каким либо образом работать с окном, создаваемым OMEGA Engine (не Project Omega), так же как с обычной формой, например, в Delphi? В частности, требуется научить программу прятаться в трей и отображаться без стандартного обрамления Windows.
Впервые работаю с движком, отличным от GDI, у OMEGA Engine очень понравился функционал и простота использования, но без вышеупомянутых функций программа теряет смысл.

Заранее прошу прощения за, возможно, глупый вопрос или же вопрос не по теме.
#1
18.08.12 23:41
0
Если хендл окна доступен, то все необходимое можно сделать функциями WinAPI - поменять стили, спрятать/показать.
#2
Mahno
19.08.12 08:47
0
А не подскажете какой функцией стоит воспользоваться, например, для изменения BorderStyle? Или же хотя бы в каком направлении стоит копать.
#3
19.08.12 08:53
0
SetWindowLong, SetWindow*, ShowWindow.
Еще могут быть полезны некоторые сообщения, но это уже сам ищи.
Отредактировано: 19.08.12 08:53
#4
Mahno
19.08.12 09:24
0
Цитата(Vga @ Сегодня, 08:53)
[snapback]110612[/snapback]
SetWindowLong, SetWindow*, ShowWindow.

Можете привести какой нибудь конкретный пример? Никак не могу поладить со стилями.
Для сообщений вроде бы понадобится имя объекта, которому посылаем сообщения, а его у меня опять же нет. Поправьте если не прав.
#5
Mahno
19.08.12 09:39
0
Заставил пропасть обрамление у обычной формы вот такими строками:
Код
procedure TForm1.FormShow(Sender: TObject);
var
  H: hwnd;
begin
  H:= FindWindow(nil, 'Form1');
  SetWindowLong(h, GWL_STYLE, WS_MINIMIZE);
end;

Судя по всему, я снёс не только рамку.

С формой Омеги это фокус не проходит.
Отредактировано: 19.08.12 09:48
#6
19.08.12 10:06
0
Во первых, ты выбрал не тот стиль.
Во вторых - у окна несколько стилей, и надо сперва получить текущий стиль, затем добавить/убрать требуемые и только после этого установить. Примерно так:
Код
Style:=GetWindowLong(Handle, GWL_STYLE);
Style:=Style and (not WS_CAPTION) and (not WS_BORDER); //тут можно поэкспериментировать, убирая только WS_BORDER или только WS_CAPTION
SetWindowLong(Handle, GWL_STYLE, Style);


Алсо, хэндл лучше получить средствами движка, если конечно там есть такая функция (а она с достаточно высокой степенью вероятности есть). Ну и у формы хэндл доступен как Form.Handle (а в случае работы с формой в ее же обработчике, как у тебя - можно просто писать Handle).

А вообще, рекомендую поизучать WinAPI. В Delphi, кстати, справка по WinAPI включена.

Задача с трейиконкой решается в два этапа:
1) Прячем окно: ShowWindow(Handle, SW_HIDE)
2) Создаем иконку и обработчик ее меню (это вопрос популярный, сам нагуглишь).
Соответсвенно для разворачивания делаем обратные действия - убираем иконку и показываем окно.
#7
Mahno
19.08.12 10:41
0
С треем нашёл у себя исходник, в котом стандартными средствами сворачивается программа в трей, с ним не пропаду) А вот со стилями засада, но подозреваю, что в этом виноват ошибочный хэндл, а получить его средствами движка если и можно, то пока не ясно как (в прилагающейся к движку справке слово Handle не упоминалось ни в одной статье).
За разъяснение спасибо.
#8
Mahno
19.08.12 10:56
0
Ха) Только что нашёл таки хэндл нужного окна через функцию GetForegroundWindow (возвращает хэндл активного окна), но глупость моя была в том, что кинул я эту функцию и функцию удаления рамки в рисовалку, а она то выполняется безостановочно.. в итоге у меня сначала пропала рамка нужного мне окна, затем я полез закрывать это окно через панель задач (крестик то ушёл вместе с рамкой) и так да, она повисла, я вызываю таск мэнеджер и он тоже виснет и только после перезагрузки мне пришло осознание того, что происходило= )
Вывод: за изучение функций следует садиться выспавшимися и думать наперёд.
Отредактировано: 19.08.12 10:58
#9
Mahno
19.08.12 11:44
0
Нужного эффекта добился следующим путём:
Код
procedure Load;  
var
  h: HWND;
  i: integer;
begin

  h:= GetForegroundWindow;
  i:= GetWindowLong(h, gwl_style);
  SetWindowLong(h, GWL_STYLE, i and (not WS_BORDER));

End;

С небольшими минусами: рамка не убирается, а становится более строго стиля, от чего чуть менее заметна, а вверху остаётся чёрная полоса от бывшей рамки.
#10
19.08.12 20:38
0
Насчет GetForegroundWindow идея плохая - нет ни малейшей гарантии, что на переднем плане будет окно движка. Лучше всего посмотреть какой класс имеет окно движка и искать по классу и заголовку. Кроме того, желательно проверить возвращенное значение на корректность.
Что до черной рамки и прочего - видимо это связано с тем, что в движке не обновляются вьюпорт и подобные моменты, связанные с изменением размеров окна (точнее, его клиентской области). Можешь попробовать после изменения стиля окна изменить его размер так, чтобы новый размер соответствовал размерам клиентской области до убирания рамки.
Но вообще лучше оставить рамку как есть.
#11
Mahno
19.08.12 23:17
0
Согласен, идея с GetForegroundWindow не лучшая, но с другой стороны, узнать класс окна тоже не могу (в исходнике движка по-капался, не нашёл, а средствами виндовс знаний маловато).
Попробовал изменять размер окна. Само окно размер менять отказывается (использовал OE_ResizeWindow(int1, int2), функцией, встроенной в движок), зато область вывода поплыла вверх при увеличении размеров по вертикали и соответственно вниз при уменьшении (сложилось впечатление, что она привязана к нижнему краю этого изменяемого окна). В итоге: полосу убрать не удалось, зато удалось её "перенести" вниз.
А если правильно подобрать размер окна, то можно добиться одинаковой рамки сверху и снизу, как в фильмах = )
#12
19.08.12 23:32
0
Цитата(Mahno @ Сегодня, 23:17)
[snapback]110622[/snapback]
А если правильно подобрать размер окна, то можно добиться одинаковой рамки сверху и снизу, как в фильмах = )

Только оно наверняка будет сильно зависеть от настроек вида операционной системы.

Алсо, если есть сорцы двигла - лучше их и подкрутить.
#13
Mahno
19.08.12 23:48
0
Весь движок заключён в .dll файл, в пас файле только вершки. Только что заметил, что при создании формы эту dll'ку мы подгружаем.
Пойду ка я лучше попробую осилить чистый OpenGL.
#14
Больше не иждивенец!
20.08.12 04:56
0
А чтобы ты с окнами не мучался, то предлагаю тебе использовать OpenGL в связке с SDL. А к нему еще и плюшки прилагаются (звук, клавиатура, мышь, джойстик и еще что-то).
#15
Mahno
20.08.12 11:24
0
Благодарю за подсказку.
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}