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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Изменение атрибутов текста, функция DrawText?

Eugie » 13 июл 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;

Eugie » 13 июл 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 - не совсем то, что расчитывали получить, не так ли? ;)

Vet_chv » 13 июл 2006, 10:31

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

BBB » 13 июл 2006, 09:31

Romeo писал(а):Плюс не подходит. Ты получишь совсем не то, что требуется. В Делфи используй 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
Видно, что все значения таковы, что в двоичной форме содержат лишь одну единичку в каком-то одном разряде.

Romeo » 12 июл 2006, 19:49

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

Vet_chv » 12 июл 2006, 19:42

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

Romeo » 12 июл 2006, 15:57

Мдаа. Не сосредоточенно ответил :)

Eugie » 12 июл 2006, 15:29

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

Romeo » 12 июл 2006, 14:31

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

Eugie » 07 июл 2006, 20:21

Vet_chv, я уже приводил пример вызова DrawText(), в т.ч. как задавать размер прямоугольника, куда вписывается текст (см. forum/topic6751.html ). Что непонятно?
Насчет фона, есть такая функция SetBkMode(), используй в ней режим TRANSPARENT (см. http://msdn.microsoft.com/library/defau ... w_47hh.asp )

Вернуться к началу