Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];

Вниз

Инверсный текст в компоненте...   Найти похожие ветки 

 
BaryVetaL ©   (2006-03-20 09:26) [0]

Суть проблемы: я пишу компонент аналог TGauge в VCL, скажите как мне вывести текст на компоненте так, чтобы часть текста была одного цвета, а часть другого (в TGauge VCL, к примеру, когда PercentDone около 50% выводится часть текста одним цветом, а часть цветом инверсным к заливке, если более 50%, то цвет полностью инверсный). Смотрел TGauge под авторством Thaddy (спидометр), но он по всей видимости накладывает стрелку спидометра на текст. А этот вариант не подойдет.

Как вывести текст правильно?

С уважением, BaryVetaL.


 
ECM ©   (2006-03-20 16:35) [1]

Можно воспользоваться функцией API ExtTextOut с опцией ETO_CLIPPED
В ней можно задать координаты начала вывода и прямоугольник для "обрезки". Останется дважды написать один и тот же текст разным цветом на разном фоне. Менять только Rect обрезки.


 
BaryVetaL ©   (2006-03-21 09:18) [2]

Это все можно сделать только для горизонтального и вертикального Gauge.
А если в Gauge допустим выбран Pie (круг с заливкой, типа 360 градусов это PercentDone=100%, 180 градусов - 50%, а то что уже пройдено заливается цветом заливки), как там быть? Там ведь Rect никак не изменишь чтобы обрезать текст?


 
Barloggg   (2006-03-21 09:23) [3]

значит придется работать ручками.
попиксельно например...
ну то есть почти попиксельно.
делаешь запасной битмап, на него рисуешь текст, потом закрашиваешь прозрачным цветом, отрисовываешь с прозрачностью, потом очищаешь и рисуешь снова этот текст, но другим цветом и закрашиваешь прозрачностью уже вторую половину и тоже отрисовываешь. потом выводишь результат на экран и вот пожалуйста.

хм... кстати есть еще какой-то хитрый флаг отрисовки. кажется OR или XOR... ну в этих которые copymode при отрисовке. непомню точно, в паскале было, в дельфи даже не искал.


 
BaryVetaL ©   (2006-03-21 13:28) [4]

Все кажись наваял. Тема закрыта...

procedure InvertseTextOut(var Src: PBitmap; X,Y: Integer; Text: String);
var
 Width, Height, i, j: Integer;
 FontColor          : TColor;
 tmp                : PBitmap;

 function InverseColor( Color: TColor ): TColor;
 begin
   Result := rgb( not GetRValue( Color ), not GetGValue( Color ), not GetBValue( Color ) );
 end;

begin
 Width := Src.Canvas.TextWidth( Text );
 Height := Src.Canvas.TextHeight( Text );
 tmp := NewBitmap( Width, Height );

 FontColor := Src.Canvas.Font.Color;
 tmp.Canvas.Pen.Color := InverseColor( FontColor );
 tmp.Canvas.Brush.Color := InverseColor( FontColor );
 tmp.Canvas.Rectangle( 0, 0, tmp.Width, tmp.Height );

 tmp.Canvas.Font.Color := FontColor;

 tmp.Canvas.RequiredState( HandleValid or FontValid or BrushValid );
 SetBkMode( tmp.Canvas.Handle, TRANSPARENT );
 tmp.Canvas.Font.Assign( Src.Canvas.Font );
 tmp.Canvas.TextOut( 0, 0, Text );

 For i:=0 to Width-1 do begin
   For j:=0 to Height-1 do begin
     if tmp.Canvas.Pixels[ i, j ] = InverseColor(FontColor) then begin
       Src.Canvas.Pixels[ X+i, Y+j ] := Src.Canvas.Pixels[ X+i, Y+j ] ;
     end
     else
      Src.Canvas.Pixels[ X+i, Y+j ] := InverseColor( Src.Canvas.Pixels[ X+i, Y+j ]);
   end;
 end;
 tmp.Free;
end;


Спасибо всем!


 
Barloggg   (2006-03-21 14:01) [5]

ага, за тем лишь исключением, что твой вариант гораздо медленнее моего.
ты каждый пиксель сканируешь,  я предлагаю пользоваться блиттингом... впрочем заметная разница появится на площадях этак с экран, так что тонкости реализации неважны вобщем-то.


 
BaryVetaL ©   (2006-03-21 14:06) [6]

Я не стал мудрить т.к. мне нужно вывести максимум 4 символа ;) (показывать PercentDone) Хотя хотелось бы увидеть лучшее решение...


 
Vedun   (2006-03-21 22:10) [7]

Я тоже делал аналог TGauge для KOL. И тоже не мог вывести правильно текст. :( Пришлось проект закрыть. Кстати, в стандартном TGauge текст, по моему,  рисуется как раз так, как предлагает Barloggg. Через дополнительный битмап. Я, правда, до конца так и не разобрался.


 
Vedun   (2006-03-21 22:10) [8]

Я тоже делал аналог TGauge для KOL. И тоже не мог вывести правильно текст. :( Пришлось проект закрыть. Кстати, в стандартном TGauge текст, по моему,  рисуется как раз так, как предлагает Barloggg. Через дополнительный битмап. Я, правда, до конца так и не разобрался.


 
BaryVetaL ©   (2006-03-22 09:19) [9]

В принципе компонент готов (с моим вариантом все прекрасно работает) в дальнейшем, когда напишу зеркало, выложу на kolnmck.ru (если конечно ECM и MTsv DN не будет против :) )


 
doozer   (2006-10-06 23:31) [10]

Не подскажите где можно достать TGauge как в стандартной D7, только под KOL(MCK) ?



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.041 c
1-1175095511
RedLine
2007-03-28 19:25
2007.05.27
Получение пути к файлу через меню


1-1175261360
DelphiLexx
2007-03-30 17:29
2007.05.27
Как запретить эффект Drag&Drop


15-1178004231
antonn
2007-05-01 11:23
2007.05.27
хранение постов форума


2-1178698444
Zahadum
2007-05-09 12:14
2007.05.27
Несколько вопросов по Memo


3-1173595209
_kos
2007-03-11 09:40
2007.05.27
Подключение к удалённой mysql





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский