Помогите, пожалуйста, решить такую проблему.
Нужно с помощью Delphi написать текст поверх всех окон.
Я знаю, что это можно сделать с помощью функций GetDC(0) и TextOut или DrawText, проблема не в этом. Может кто знает как управлять стилем того шрифта, которым всё рисуется? Есть только одна функция SetTextColor и всё. Мне нужно поменять размер шрифта, стиль и т.д. Есть функция, с помощью которой можно узнать параметры текущего шрифта - GetTextMetrics, а как их изменить?????????
[Ответ]
aerin 15:08 22.11.2005
1. Создаем шрифт: CreateFont(...), CreateFontIndirect(), CreateFontIndirectEx().
2. SelectObject(...) вместо этого можно еще юзать SelectFont(), но я не знаю, определен ли в Delphi этот макрос. После окончания вывода текста следует воостановить старый шрифт.
Вот пример:
///////////////////////////////////////////////////////////////////////
procedure DrawMyText(DC:HDC;x,y,col:integer;strText:string);
var
lFont:TLogFont;{все поля смотри в helpe}
NewFont,OldFont:HFONT;
begin
SetTextColor(DC,col);
with lFont do
begin
lfHeight:=72;
lfWidth:=0;
lfWeight:=fw_normal;
lfUnderline:=0;
lfStrikeOut:=0;
lfEscapement:=450;
StrCopy(lfFaceName,'Arial Black');
end;
NewFont:=CreateFontInDirect(lFont);
OldFont:=SelectObject(DC,NewFont);
TextOut(DC,x,y,PChar(strText),Length(strText));
SelectObject(DC,OldFont);
DeleteObject(NewFont);
end;
//////////////////////////////////////////////////////////////////////
[Ответ]
DWanek 14:22 25.11.2005
А вы случайно не знаете как этот текст вывести на прозрачном фоне, а не на белой картинке.
[Ответ]
Спасибо, помогло. А как можно запомнить картинку под текстом, чтобы потом этот текст стереть?
[Ответ]
aerin 15:45 25.11.2005
DWanek А программу тебе целиком не написать? Ты, это, если что, не стесняйся...
ЗЫ. Купи(скачай) любое издание Ч.Петзолда "Программирование под Windows 95", половина вопросов отпадет сразу. Это азбука. Далее MSDN.
ЗЫЫ. По существу вопроса. Перед выводом текста нужно скопировать закрываемую часть(узнать эту область можно например с помощью функции GetTextExtentPoint32(...)) экранного DC в некий DC в памяти, например с помощью функции BitBlt(). Потом скопировать обратно.
ЗЫЫЫ. Только, пожалуйста, не спрашивай, как создать контекст в памяти [Ответ]
solovey 17:24 30.11.2005
Зачем искать себе трудности, легче создать объект TCanvas, его свойству Handle присвоить нужный HDC и забыть про WinAPI.
[Ответ]