Главная страница
    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.046 c
1-1175536670
Dmitry_177
2007-04-02 21:57
2007.05.27
SetWaitableTimer, таймер не срабатывает несколько раз..


11-1160141707
Zoom Evstrahiev
2006-10-06 17:35
2007.05.27
Зеркало для KOLCoolBar


1-1175504870
Dmitry_177
2007-04-02 13:07
2007.05.27
перезагрузить компьютер


15-1177508337
начинающий
2007-04-25 17:38
2007.05.27
Дауншифтинг


4-1166907320
Степан
2006-12-23 23:55
2007.05.27
НЕстандартная панель инструментов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский