Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Инверсный текст в компоненте... [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 обрезки.


Наверх

Титульная страница Поиск, карта сайта Написать письмо