Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вывод текста поверх приложения OpenGL/DirectX

Автор: UncoNNecteD
Дата сообщения: 10.10.2003 17:55
Нужно выводить сообщение, чтоб оно было видно даже если работает какая нить игрушка или полноэкранное приложение.
Подскажите что делать, я с этим не работал никогда.
Автор: ShIvADeSt
Дата сообщения: 11.10.2003 01:28
Однако была уже такая тема. Что то вроде приложение поверх всех. Я делал это следующим образом. Посылал верхнему окну сообщение спрятаться, выводил сообщение а потом обратно показывал его. Но тебе наверное не ээто надо было . ИМХО нет такого способа чтобы переслать опенгл приложение назад а поверх него вывести стандртное окно.
Автор: UncoNNecteD
Дата сообщения: 11.10.2003 20:01
Не надо выводить окна. Просто текст сообщения.
Я пока решаю проблему сворачиванием всех окон и выводом сообщения стандартным MessageBox.
Это неудобно, не каждое приложение способно развернутся после такого

А ведь можно на активный экран OpenGL вывести некую графику ?
Ну делают так - я видел.

Еще вариант - если знаете &RQ - там hint выводится поверх почти всего - из трея.
Автор: ShIvADeSt
Дата сообщения: 13.10.2003 00:18

Цитата:
Не надо выводить окна. Просто текст сообщения.

А что разве у мессагбокс нету окна? . Я примерно это и предлагал, только вместо сворачивания предложил прятать. По моему проще спрятать и показать чем свернуть развернуть. Тк при этом положение окна не меняется. Попробуй еще получать DC верхнего окна и на него выводить тектс. Сам не пробовал.
Автор: UncoNNecteD
Дата сообщения: 13.10.2003 06:48
ShIvADeSt
Что ты имеешь ввиду - прятать?
Хотя чтобы ты не имел - врядли это будет работать на приложениях DirectX/OpenGL работающих напрямую с экраном.

Цитата:
Попробуй еще получать DC верхнего окна и на него выводить тектс. Сам не пробовал.

Вот что то типа этого охота... буду пробовать...
Как хоть текст в DirectX выводить?
Автор: ShIvADeSt
Дата сообщения: 13.10.2003 08:07

Цитата:
Что ты имеешь ввиду - прятать?
Хотя чтобы ты не имел - врядли это будет работать на приложениях DirectX/OpenGL работающих напрямую с экраном.

Только что попробовал на своих любимых 3 херах. В обработке хоткия написал ShowWindow(GetForegroundWindow,SW_HIDE). И как ты думаешь что произошло? Исчезли они на х... А вот обратно возвратить я код не дописал. Пришлось Таск сносить. Так что не важно что юзает прога, Хайд оно ИМХО и в Африке хайд. Только вот при скрытии разрешение остается как в режиме DirectX. Кстати обратно тоже нормуль вернулось (добавлено 3 минутами позже)

Второй вариант рисование на канве. Тоже работает. Только вот его обновлять приходится, чтобы его всякая там отрисовка не сносила.

В таймере пропиши следующее
hW:=GetForegroundWindow;
TextOut(GetWindowDC(hW),100,100,'qqqqq',6);
И именно там в режиме игры (щас только что проверил) будет написано qqqqq. Тестил опять же на херах. Извени бегалок под рукой нету. Если не пойдет скажи можь че еще придумаю.
Автор: UncoNNecteD
Дата сообщения: 13.10.2003 19:12
ShIvADeSt
Спасибо, в бегалках не проверял, но похоже будет работать.
Ща разберусь тока с шрифтами, цветами и прочей лабудой
Автор: ShIvADeSt
Дата сообщения: 13.10.2003 23:44

Цитата:
Ща разберусь тока с шрифтами, цветами и прочей лабудой

Если хочешь у меня уже есть готовые функции (сам писал), которые позволят это выводить с небольшими наворотами. Хотя наверное, ты и сам разберешься с рисование на DC и сделаешь еще круче как тебе надо (это я не льщу, просто у каждого свои понятия о красоте ).
Автор: UncoNNecteD
Дата сообщения: 14.10.2003 07:45
ShIvADeSt
Уже разобрался
Но кинь - всегда интересно посмотреть на полет чужой фантазии
Автор: Alchem
Дата сообщения: 02.08.2004 14:50

Цитата:
hW:=GetForegroundWindow;
TextOut(GetWindowDC(hW),100,100,'qqqqq',6);


Это дело безбожно мигает и саму игру тормозит..
Есть идеи как от этого избавиться?

Автор: UncoNNecteD
Дата сообщения: 04.08.2004 16:59
Я сделал вывод в цикле, причем на белом фоне черными буквами. Немного моргает, но тормозов не замечал, читабельность нормальная.

Код:
procedure TForm1.Timer_UAPIMessTimer(Sender: TObject);
begin
dec(GV_UAPIMCount);
Timer_UAPIMess.Enabled:=(GV_UAPIMCount>0);
UAPIMessageBoxOut;
end;

procedure UAPIMessageBoxOut;
var HForegW:HWND;
HForegDC:HDC;
begin
HForegW:=GetForegroundWindow;
HForegDC:=GetWindowDC(HForegW);

FillRect(HForegDC,GV_UAPIMRegion,0);
FrameRect(HForegDC,GV_UAPIMRegion,GV_UAPIMBrush);
FrameRect(HForegDC,GV_UAPIMRegionS,GV_UAPIMBrush);
SelectObject(HForegDC,GV_UAPIMFont);
DrawText(HForegDC,PChar(GV_UAPIMMessage),Length(GV_UAPIMMessage),GV_UAPIMRegionS,DT_CENTER+DT_VCENTER+DT_SINGLELINE);
end;

procedure UAPIMessageBox(mess:string;Left,Top,FrameCount:integer);
begin
GV_UAPIMBrush:=CreateSolidBrush(RGB(255,0,0));
GV_UAPIMFont:=CreateFont(30,10,0,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,DEFAULT_PITCH,'Courier New');
GV_UAPIMRegion.Left:=Left;GV_UAPIMRegion.Top:=Top;
GV_UAPIMRegion.Right:=Left+length(mess)*11+30;GV_UAPIMRegion.Bottom:=Top+100;
GV_UAPIMRegionS.Left:=Left+3;GV_UAPIMRegionS.Top:=Top+3;
GV_UAPIMRegionS.Right:=GV_UAPIMRegion.Right-3;GV_UAPIMRegionS.Bottom:=GV_UAPIMRegion.Bottom-3;
GV_UAPIMCount:=FrameCount;
GV_UAPIMMessage:=mess;
Form1.Timer_UAPIMess.Enabled:=(GV_UAPIMMessage<>'');
end;

Страницы: 1

Предыдущая тема: C# переход между элементами формы


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.