Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
2-1178467571
Malik
2007-05-06 20:06
2007.05.27
TMemo


15-1177609948
YurikGL
2007-04-26 21:52
2007.05.27
Спам в одной ветке


15-1177957189
GEd
2007-04-30 22:19
2007.05.27
Вопрос по C, прошу прощения что не там.


2-1178242703
porting
2007-05-04 05:38
2007.05.27
sendkey в неактивном окне как hotkey


2-1178401907
ctudent
2007-05-06 01:51
2007.05.27
Что это?