EugeneBoss3
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору //-------------------------------------------- прорисовка текста с градиентом: procedure DrawGradientText( Canvas : TCanvas; iLeft,iTop : Integer; const Text : String; const ColorStart : TColor; const ColorEnd : TColor; const Gradient : TEkTextGradient = gtVertical); var I,Steps : Integer; GradRect, TextBounds : TRect; RedStart,GreenStart,BlueStart : Byte; RedEnd, GreenEnd, BlueEnd : Byte; Red, Green, Blue : Single; DifRed, DifGreen, DifBlue : Single; iTextWidth, iTextHeight : Integer; sTextNew: String; begin sTextNew:= ''; for I := 1 to Length(Text) do begin if not (Text[I]='&') then sTextNew:= sTextNew + Text[ I ] ; end; with Canvas do begin // размер текста: iTextWidth := TextWidth (sTextNew); iTextHeight := TextHeight(sTextNew); if (iTextWidth=0) or (iTextHeight=0) then Exit; TextBounds := Rect( iLeft, iTop, iLeft + iTextWidth, iTop + iTextHeight); // Рисуем на прозрачном фоне Brush.Style := bsClear; // Определение цветов RedStart := GetRValue(ColorStart); GreenStart := GetGValue(ColorStart); BlueStart := GetBValue(ColorStart); RedEnd := GetRValue(ColorEnd); GreenEnd := GetGValue(ColorEnd); BlueEnd := GetBValue(ColorEnd); Red := RedStart; Green := GreenStart; Blue := BlueStart; if (Gradient = gtNone ) then begin SetTextColor( Handle, RGB( Trunc(Red), Trunc(Green), Trunc(Blue)) ); Windows.TextOut( Handle, iLeft, iTop, PChar(sTextNew), Length(sTextNew)); Exit; end; if (Gradient = gtHorizontal ) then Steps:= iTextWidth else Steps:= iTextHeight ; DifRed := ( RedEnd - RedStart)/Steps; DifGreen := ( GreenEnd - GreenStart)/Steps; DifBlue := ( BlueEnd - BlueStart)/Steps; for I:=0 to Steps do begin SetTextColor( Handle, RGB( Trunc(Red), Trunc(Green), Trunc(Blue)) ); if (Gradient = gtHorizontal ) then begin GradRect.Left := TextBounds.Left+I; GradRect.Top := TextBounds.Top; GradRect.Right := GradRect.Left+1; GradRect.Bottom := TextBounds.Bottom end else begin GradRect.Left := TextBounds.Left; GradRect.Top := TextBounds.Top+I; GradRect.Right := TextBounds.Right; GradRect.Bottom := GradRect.Top+1; end; Windows.ExtTextOut( Handle, iLeft, iTop, ETO_CLIPPED, @GradRect, PChar(sTextNew), Length(sTextNew), nil); Red := Red + DifRed; Green := Green + DifGreen; Blue := Blue + DifBlue; end; end; end; |