Форум: "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.045 c