![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Инверсный текст в компоненте... [Delphi, Windows]
BaryVetaL © (2006-03-20 09:26:00)Суть проблемы: я пишу компонент аналог TGauge в VCL, скажите как мне вывести текст на компоненте так, чтобы часть текста была одного цвета, а часть другого (в TGauge VCL, к примеру, когда PercentDone около 50% выводится часть текста одним цветом, а часть цветом инверсным к заливке, если более 50%, то цвет полностью инверсный). Смотрел TGauge под авторством Thaddy (спидометр), но он по всей видимости накладывает стрелку спидометра на текст. А этот вариант не подойдет.
Как вывести текст правильно?
С уважением, BaryVetaL.
doozer (2006-10-06 23:31:00) [1]Не подскажите где можно достать TGauge как в стандартной D7, только под KOL(MCK) ?
BaryVetaL (2006-03-22 09:19:00) [2]В принципе компонент готов (с моим вариантом все прекрасно работает) в дальнейшем, когда напишу зеркало, выложу на kolnmck.ru (если конечно ECM и MTsv DN не будет против :) )
Vedun (2006-03-21 22:10:00) [3]Я тоже делал аналог TGauge для KOL. И тоже не мог вывести правильно текст. :( Пришлось проект закрыть. Кстати, в стандартном TGauge текст, по моему, рисуется как раз так, как предлагает Barloggg. Через дополнительный битмап. Я, правда, до конца так и не разобрался.
Vedun (2006-03-21 22:10:00) [4]Я тоже делал аналог TGauge для KOL. И тоже не мог вывести правильно текст. :( Пришлось проект закрыть. Кстати, в стандартном TGauge текст, по моему, рисуется как раз так, как предлагает Barloggg. Через дополнительный битмап. Я, правда, до конца так и не разобрался.
BaryVetaL (2006-03-21 14:06:00) [5]Я не стал мудрить т.к. мне нужно вывести максимум 4 символа ;) (показывать PercentDone) Хотя хотелось бы увидеть лучшее решение...
Barloggg (2006-03-21 14:01:00) [6]ага, за тем лишь исключением, что твой вариант гораздо медленнее моего.
ты каждый пиксель сканируешь, я предлагаю пользоваться блиттингом... впрочем заметная разница появится на площадях этак с экран, так что тонкости реализации неважны вобщем-то.
BaryVetaL (2006-03-21 13:28:00) [7]Все кажись наваял. Тема закрыта...
procedureInvertseTextOut( varSrc: PBitmap; X,Y: Integer; Text: String);
var
Width, Height, i, j: Integer;
FontColor : TColor;
tmp : PBitmap;
functionInverseColor( Color: TColor ): TColor;
begin
Result := rgb( notGetRValue( Color ), notGetGValue( Color ), notGetBValue( 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 orFontValid orBrushValid );
SetBkMode( tmp.Canvas.Handle, TRANSPARENT );
tmp.Canvas.Font.Assign( Src.Canvas.Font );
tmp.Canvas.TextOut( 0, 0, Text );
Fori:=0 toWidth-1 do begin
Forj:=0 toHeight-1 do begin
iftmp.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 09:23:00) [8]значит придется работать ручками.
попиксельно например...
ну то есть почти попиксельно.
делаешь запасной битмап, на него рисуешь текст, потом закрашиваешь прозрачным цветом, отрисовываешь с прозрачностью, потом очищаешь и рисуешь снова этот текст, но другим цветом и закрашиваешь прозрачностью уже вторую половину и тоже отрисовываешь. потом выводишь результат на экран и вот пожалуйста.
хм... кстати есть еще какой-то хитрый флаг отрисовки. кажется OR или XOR... ну в этих которые copymode при отрисовке. непомню точно, в паскале было, в дельфи даже не искал.
BaryVetaL (2006-03-21 09:18:00) [9]Это все можно сделать только для горизонтального и вертикального Gauge.
А если в Gauge допустим выбран Pie (круг с заливкой, типа 360 градусов это PercentDone=100%, 180 градусов - 50%, а то что уже пройдено заливается цветом заливки), как там быть? Там ведь Rect никак не изменишь чтобы обрезать текст?
ECM (2006-03-20 16:35:00) [10]Можно воспользоваться функцией API ExtTextOut с опцией ETO_CLIPPED
В ней можно задать координаты начала вывода и прямоугольник для "обрезки". Останется дважды написать один и тот же текст разным цветом на разном фоне. Менять только Rect обрезки.