PDA

Просмотр полной версии : Изменение атрибутов текста, функция DrawText?



Vet_chv
07.07.2006, 18:26
Продолжаю изучать возможности функции DrawText. Пытаюсь изменить атрибуты текста. Возможно ли это сделать используя данную функцию? Если нет, то какой альтернативный вариант? И ещё, DrawText дает свой фон, как можно от этого избавиться (чтобы выводился чисто текст)? Подскажите пожалуйста. :(

Vet_chv
07.07.2006, 19:15
Под атрибутами текста я имею в виду размер, и не пойму как указать несколько параметров для форматирования текста. Потому что flags:= (параметр1, параметр2, ...); - не проходит.

Eugie
07.07.2006, 20:21
Vet_chv, я уже приводил пример вызова DrawText(), в т.ч. как задавать размер прямоугольника, куда вписывается текст (см. http://www.developing.ru/forum/topic6751.html ). Что непонятно?
Насчет фона, есть такая функция SetBkMode(), используй в ней режим TRANSPARENT (см. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_47hh.asp )

Romeo
12.07.2006, 14:31
Flag - это параметр функции содержащий логическое пересечение параметров. Другими словами для того, что передать в качестве Flag несколько параметров, нужно перечислить их через логическое ИЛИ (or - в Паскаль подобных языках, | - в С подобных).

Eugie
12.07.2006, 15:29
только не пересечение, а объединение :)

Romeo
12.07.2006, 15:57
Мдаа. Не сосредоточенно ответил :)

Vet_chv
12.07.2006, 19:42
Спасибо, за ответы. Я тут поэксперементировал, у меня знаком + получается (компилятор не ругается). А вот насчёт форматирования текста вижу глубину неизмеримую (по моему слишком мудрено описано всё это в хэлпе Делфи).

Romeo
12.07.2006, 19:49
Плюс не подходит. Ты получишь совсем не то, что требуется. В Делфи используй or.

BBB
13.07.2006, 09:31
Плюс не подходит. Ты получишь совсем не то, что требуется. В Делфи используй or.
Если подходить логически, то "+", конечно, не правильно, но практически - прокатит. Дело в том, что значения тех флагов таковы, что для ТАКИХ ЗНАЧЕНИЙ арифметичекий "+" и логическое побитовое сложение дадут одинаковый результат :)
#define DT_CENTER 0x00000001
#define DT_RIGHT 0x00000002
#define DT_VCENTER 0x00000004
#define DT_BOTTOM 0x00000008
#define DT_WORDBREAK 0x00000010
#define DT_SINGLELINE 0x00000020
#define DT_EXPANDTABS 0x00000040
#define DT_TABSTOP 0x00000080
#define DT_NOCLIP 0x00000100
#define DT_EXTERNALLEADING 0x00000200
#define DT_CALCRECT 0x00000400
#define DT_NOPREFIX 0x00000800
#define DT_INTERNAL 0x00001000
Видно, что все значения таковы, что в двоичной форме содержат лишь одну единичку в каком-то одном разряде.

Vet_chv
13.07.2006, 10:31
Спасибо за все ответы, приятно просвещаться :-). Я попытался поискать инфо о форматировании текста (размер, остальные атрибуты) в хэлпе Делфи - мудрено как-то, тяжело понять как это всё воплотить. Если не затруднит, объясните пожалуйста (примером с небольшими пояснениями) как задавать атрибуты текста. Спасибо за помощь. Всегда рад ответам-советам!

Eugie
13.07.2006, 16:48
Romeo прав, плюсы опасны, лучше не практиковать. Хотя в данном случае работает.
Но представим ситуацию, если случайно продублировали какой-нить флаг:
а) DT_RIGHT or DT_WORDBREAK or DT_WORDBREAK = DT_RIGHT or DT_WORDBREAK;
б) DT_RIGHT + DT_WORDBREAK + DT_WORDBREAK <> DT_RIGHT or DT_WORDBREAK, а равно DT_RIGHT or DT_SINGLELINE - не совсем то, что расчитывали получить, не так ли? ;)

Eugie
13.07.2006, 19:21
Vet_chv, по DrawText() в дельфовом хэлпе и нет ничего, т.к. это функция WinAPI, а по ним нужно смотреть MSDN. Там, правда, тоже далеко не для всех функций есть примеры.

По DrawText(), вот пример:


{ в обработчике события отрисовки формы OnPaint }
procedure TForm1.FormPaint(Sender: TObject);
const vText: String = 'This is a text.';
var vRect: TRect;
begin
vRect := Rect(10, 10, 70, 40); { задаем размеры прямоугольника, куда будет вписан текст }
Font.Color := clRed; { цвет текста }
SetBkColor(Canvas.Handle,
ColorToRGB(clWhite)); { цвет фона }
SetBkMode(Canvas.Handle, OPAQUE); { режим фона: OPAQUE - будет заливать фон под текстом заданным цветом }
DrawText(
Canvas.Handle, { дескриптор канвы }
PChar(vText), { указатель на строку }
-1, { длина строки вычисляется автоматически }
vRect, { размер прямоугольника }
DT_CENTER or DT_WORDBREAK { флаги, требующие выровнять текст по левому краю и автоматически переносить слова }
);
Font.Color := Self.Font.Color; { вернули старые значения }
end;