fcCanvas.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:9k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit fcCanvas;
  2. {
  3. //
  4. // Components : TfcCanvas
  5. //
  6. // Copyright (c) 1999 by Woll2Woll Software
  7. }
  8. interface
  9. uses
  10.   Windows, Graphics, Messages, SysUtils, Classes, Controls, fcCommon;
  11. const
  12.   DT_DISABLED = $80000;
  13. type
  14.   TwwRectSide = (rsLeft, rsTop, rsRight, rsBottom);
  15.   TwwRectSides = Set of TwwRectSide;
  16.   TfcCanvas = class(TControlCanvas)
  17.   public
  18.     procedure Refresh;
  19.     function DrawText(AText: string; ARect: TRect; Style: LongInt): TRect;
  20.     procedure DottedLine(p1, p2: TPoint);
  21.     procedure VCenterDrawText(AText: string; ARect: TRect; Style: Integer);
  22.     procedure CenterDraw(SourceBitmap: TGraphic; ClipRect: TRect);
  23.     procedure CenterRect(SourceBitmap: TBitmap; SourceRect, ClipRect: TRect);
  24.     procedure DisabledDraw(X, Y: Integer; Bitmap: TBitmap);
  25.     procedure FrameRectPen(ARect: TRect);
  26.     procedure ClearRect(ARect: Trect; AGraphic: TGraphic; Stretch: Boolean; FillColor: TColor);
  27.     procedure TileDraw(SourceBitmap: TBitmap);
  28.     procedure Dither(r: TRect; ABrush: TBitmap);
  29.     procedure DrawFrameControl(r: TRect; uType, uState: Integer);
  30.     procedure ParseDraw(DestRect: TRect; ABitmap: TBitmap; NumImages, ImageIndex: Integer);
  31.     procedure ParseCenterDraw(DestRect: TRect; ABitmap: TBitmap; NumImages, ImageIndex: Integer);
  32.   end;
  33. implementation
  34. uses AxCtrls;
  35. procedure TfcCanvas.TileDraw(SourceBitmap: TBitmap);
  36. var CurLeft, CurTop: Integer;
  37. begin
  38.   if (SourceBitmap.Width <= 0) or (SourceBitmap.Height <= 0) then Exit;
  39.   CurLeft := 0;
  40.   while (CurLeft < ClipRect.Right) do
  41.   begin
  42.     CurTop := 0;
  43.     while (CurTop < ClipRect.Bottom) do
  44.     begin
  45.       Draw(CurLeft, CurTop, SourceBitmap);
  46.       inc(CurTop, SourceBitmap.Height);
  47.     end;
  48.     inc(CurLeft, SourceBitmap.Width);
  49.   end;
  50. end;
  51. procedure TfcCanvas.Refresh;
  52. begin
  53.   SelectObject(Handle, Pen.Handle);
  54.   SelectObject(Handle, Font.Handle);
  55.   SelectObject(Handle, Brush.Handle);
  56. end;
  57. procedure TfcCanvas.DottedLine(p1, p2: TPoint);
  58. var i: integer;
  59.     x, y: integer;
  60.     tot: integer;
  61. begin
  62.   Refresh;
  63.   x := p1.x;
  64.   y := p1.y;
  65.   tot := fcMax(Abs(p2.y - p1.y), Abs(p2.x - p1.x));
  66.   for i := 0 to tot do if i mod 2 = 0 then
  67.   begin
  68.     Polyline([Point(x,y), Point(x+1,y+1)]);
  69.     inc(x, (p2.x - p1.x) div fcMax(1, (tot div 2)));
  70.     inc(y, (p2.y - p1.y) div fcMax(1, (tot div 2)));
  71.   end;
  72. end;
  73. procedure TfcCanvas.CenterRect(SourceBitmap: TBitmap; SourceRect, ClipRect: TRect);
  74. var ALeft, ATop: Integer;
  75.     ABitmap: TBitmap;
  76. begin
  77.   ALeft := (fcRectWidth(ClipRect) - fcRectWidth(SourceRect)) div 2 + ClipRect.Left;
  78.   ATop := (fcRectHeight(ClipRect) - fcRectHeight(SourceRect)) div 2 + ClipRect.Top;
  79.   FillRect(Rect(ALeft, ATop, ALeft + fcRectWidth(SourceRect), ATop + fcRectHeight(SourceRect)));
  80.   ABitmap := TBitmap.Create;
  81.   ABitmap.Transparent := True;
  82.   SourceBitmap.Transparent := True;
  83.   SourceBitmap.TransparentColor := SourceBitmap.Canvas.Pixels[0,0];
  84. //  SourceBitmap.Mask($00808000);
  85.   ABitmap.Width := SourceBitmap.Width;
  86.   ABitmap.Height := SourceBitmap.Height;
  87.   ABitmap.Canvas.Brush.Color := SourceBitmap.Canvas.Brush.Color;
  88.   ABitmap.Canvas.FillRect(ABitmap.Canvas.ClipRect);
  89.   ABitmap.Canvas.Draw(0, 0, SourceBitmap);
  90.   CopyRect(Rect(ALeft, ATop, ALeft + fcRectWidth(SourceRect), ATop + fcRectHeight(SourceRect)),
  91.            ABitmap.Canvas, SourceRect);
  92.   ABitmap.Free;
  93. end;
  94. procedure TfcCanvas.CenterDraw(SourceBitmap: TGraphic; ClipRect: TRect);
  95. begin
  96.   if (SourceBitmap.Width = 0) or (SourceBitmap.Height = 0) then Exit;
  97.   Draw((fcRectWidth(ClipRect) - SourceBitmap.Width) div 2 + ClipRect.Left,
  98.     (fcRectHeight(ClipRect) - SourceBitmap.Height) div 2 + ClipRect.Top, SourceBitmap);
  99. end;
  100. procedure TfcCanvas.Dither(r: TRect; ABrush: TBitmap);
  101. begin
  102.   Brush.Bitmap := ABrush;
  103.   SetBKColor(Handle, ColorToRGB(clRed));
  104.   SetTextColor(Handle, ColorToRGB(clGreen));
  105.   FillRect(r);
  106.   Brush.Bitmap := nil;
  107. end;
  108. function TfcCanvas.DrawText(AText: string; ARect: TRect; Style: Integer): TRect;
  109. begin
  110.   // Used by DrawText API Function when "Item" has focus.
  111.   SetBkColor(Handle, ColorToRGB(Brush.Color));
  112.   SetTextColor(Handle, ColorToRGB(Font.Color));
  113.   Refresh;
  114.   if (Style and DT_DISABLED <> 0) and (Style and DT_CALCRECT = 0) then
  115.   begin
  116.     Font.Color := clBtnHighlight;
  117.     OffSetRect(ARect, 1, 1);
  118.     Windows.DrawText(Handle, PChar(AText), Length(AText), ARect, Style);
  119.     SetBkMode(Handle, TRANSPARENT);
  120.     OffSetRect(ARect, -1, -1);
  121.     Font.Color := clBtnShadow;
  122.   end;
  123.   Windows.DrawTextEx(Handle, PChar(AText), Length(AText), ARect, Style, nil);
  124.   result := ARect;
  125. end;
  126. procedure TfcCanvas.VCenterDrawText(AText: string; ARect: TRect; Style: Integer);
  127. var r: TRect;
  128. begin
  129.   r := DrawText(AText, ARect, Style or DT_CALCRECT);
  130.   r := Rect(ARect.Left, fcMax(ARect.Top, ARect.Top + ((fcRectHeight(ARect) - fcRectHeight(r)) div 2)), ARect.Right, ARect.Bottom);
  131.   DrawText(AText, r, Style);
  132. end;
  133. procedure TfcCanvas.DisabledDraw(X, Y: Integer; Bitmap: TBitmap);
  134. const
  135.   ROP_DSPDxax = $00E20746;
  136. var
  137.   Bit: TBitmap;
  138. begin
  139.   Bit := TBitmap.Create;
  140.   Bit.Assign(Bitmap);
  141.   Brush.Color := clBtnFace;
  142.   with Bit do begin
  143.     HandleType := bmDDB;
  144.     Canvas.Brush.Color := clBlack;
  145.     if Monochrome then
  146.     begin
  147.       Canvas.Font.Color := clWhite;
  148.       Monochrome := False;
  149.       Canvas.Brush.Color := clWhite;
  150.     end;
  151.     Monochrome := True;
  152.   end;
  153.   Brush.Color := clBtnFace;
  154.   FillRect(Rect(0,0,Bitmap.Width,Bitmap.Height));
  155.   Brush.Color := clBtnHighlight;
  156.   SetTextColor(Handle, clBlack);
  157.   SetBkColor(Handle, clWhite);
  158.   StretchBlt(Handle, 0, 0, Bitmap.Width, Bitmap.Height,
  159.     Bit.Canvas.Handle, 0, 0, Bit.Width, Bit.Height, ROP_DSPDxax);
  160.   Brush.Color := clBtnShadow;
  161.   SetTextColor(Handle, clBlack);
  162.   SetBkColor(Handle, clWhite);
  163.   StretchBlt(Handle, 0, 0, Bitmap.Width, Bitmap.Height,
  164.     Bit.Canvas.Handle, 0, 0, Bit.Width, Bit.Height, ROP_DSPDxax);
  165.   Bit.Free;
  166. end;
  167. procedure TfcCanvas.FrameRectPen(ARect: TRect);
  168. begin
  169. //  InflateRect(ARect, -(Pen.Width - 1), -(Pen.Width - 1));
  170.   OffSetRect(ARect, Pen.Width - 1, Pen.Width - 1);
  171.   Polyline([Point(ARect.Left, ARect.Top), Point(ARect.Right, ARect.Top),
  172.     Point(ARect.Right, ARect.Bottom), Point(ARect.Left, ARect.Bottom),
  173.     Point(ARect.Left, ARect.Top)]);
  174. end;
  175. procedure TfcCanvas.ClearRect(ARect: Trect; AGraphic: TGraphic; Stretch: Boolean; FillColor: TColor);
  176. var ABitmap: TBitmap;
  177.     AColor: TColor;
  178. begin
  179.   if AGraphic = nil then
  180.   begin
  181.     AColor := Brush.Color;
  182.     Brush.Color := FillColor;
  183.     FillRect(ARect);
  184.     Brush.Color := AColor;
  185.   end else begin
  186.     ABitmap := TBitmap.Create;
  187.     ABitmap.Width := fcRectWidth(ClipRect);
  188.     ABitmap.Height := fcRectHeight(ClipRect);
  189.     if Stretch then ABitmap.Canvas.StretchDraw(ClipRect, AGraphic)
  190.     else ABitmap.Canvas.Draw(0, 0, AGraphic);
  191.     ABitmap.Canvas.CopyRect(ARect, self, ARect);
  192.     ABitmap.Free;
  193.   end;
  194. end;
  195. procedure TfcCanvas.DrawFrameControl(r: TRect; uType, uState: Integer);
  196. var bit, bit2: TBitmap;
  197. begin
  198.   bit := TBitmap.Create;
  199.   bit2 := TBitmap.Create;
  200.   try
  201.     bit.Width := fcRectWidth(r);
  202.     bit.Height := fcRectHeight(r);
  203.     bit.Transparent := False;
  204.     bit2.Assign(bit);
  205.     Windows.DrawFrameControl(bit.Canvas.Handle, bit.Canvas.ClipRect, uType, uState);
  206.     bit2.Canvas.Brush.Color := clRed;
  207.     bit2.Canvas.FillRect(bit2.Canvas.ClipRect);
  208.     BitBlt(bit2.Canvas.Handle,
  209.            0, 0, bit2.Width, bit2.Height,
  210.            Bit.Canvas.Handle,
  211.            0, 0,
  212.            SRCPAINT);
  213.     bit2.Transparent := True;
  214.     Draw(r.Left, r.Top, bit2);
  215.   finally
  216.     bit.free;
  217.     bit2.Free;
  218.   end;
  219. end;
  220. procedure TfcCanvas.ParseDraw(DestRect: TRect; ABitmap: TBitmap; NumImages, ImageIndex: Integer);
  221. var AImageWidth: Integer;
  222.     ALeft: Integer;
  223. begin
  224.   AImageWidth := ABitmap.Width div NumImages;
  225.   ALeft := AImageWidth * ImageIndex;
  226.   Brush.Style := bsClear;
  227.   BrushCopy(Rect(DestRect.Left, DestRect.Top, DestRect.Left + AImageWidth, DestRect.Top + ABitmap.Height),
  228.     ABitmap,
  229.     Rect(ALeft, 0, ALeft + AImageWidth, ABitmap.Height),
  230.     ABitmap.TransparentColor);
  231. end;
  232. procedure TfcCanvas.ParseCenterDraw(DestRect: TRect; ABitmap: TBitmap; NumImages, ImageIndex: Integer);
  233. var AImageWidth: Integer;
  234.     ALeft: Integer;
  235.     ATop: Integer;
  236. begin
  237.   AImageWidth := ABitmap.Width div NumImages;
  238.   ALeft := DestRect.Left + (((DestRect.Right - DestRect.Left) - AImageWidth) div 2);
  239.   ATop := DestRect.Top + (((DestRect.Bottom - DestRect.Top) - ABitmap.Height) div 2);
  240.   ParseDraw(Rect(ALeft, ATop, ALeft + AImageWidth, ATop + ABitmap.Height),
  241.     ABitmap, NumImages, ImageIndex);
  242. end;
  243. end.