delphiex8canvas应用

来源:互联网 发布:小米平板刷windows包 编辑:程序博客网 时间:2024/06/04 00:31
procedure TFrmMain.DrawLine(Sender: Tobject);
var
    kpjg, spjg, zgjg, zdjg: Integer;
var
    x1, x2, y1, y2, x3, y3, x4, y4: Single;
var
    Kheight: Single;
    I: Integer;
var
    TempString, OutStr: string;
var
    TempLen, StrLen: Integer;


var
    ARect: TRectF;
begin
    PaintBoxMain.Canvas.BeginScene;
    if DayCount > 0 then
    begin
        PaintWidth := PaintBoxMain.Width;
        PaintHeight := PaintBoxMain.Height;
        Canvas.Fill.Color := TAlphaColorRec.Black;
        PaintBoxMain.Canvas.SetMatrix(PaintBoxMain.AbsoluteMatrix);
        ARect := TRectF.Create(PaintBoxMain.Position.X, PaintBoxMain.Position.Y, PaintBoxMain.Position.X + PaintWidth, PaintBoxMain.Position.X + PaintHeight);
        Canvas.FillRect(ARect, 1, 1, AllCorners, 1);


        //左边竖直线
        Canvas.Stroke.Color := TAlphaColorRec.Red;
        Canvas.DrawLine(TPointF.Create(LeftX - 1, 0), TPointF.Create(LeftX - 1, PaintHeight), 1);


        //上边水平线
        Canvas.DrawLine(TPointF.Create(0, TopY), TPointF.Create(PaintWidth, TopY), 1);




        //右边竖直线
        Canvas.DrawLine(TPointF.Create(PaintWidth - RightX, TopY), TPointF.Create(PaintWidth - RightX, PaintHeight), 1);


        //下边水平线
        Canvas.DrawLine(TPointF.Create(0, PaintHeight - BottomY), TPointF.Create(PaintWidth - RightX, PaintHeight - BottomY), 1);
            //  Sleep(1000);


        PageTopY := PaintHeight - BottomY;


        Canvas.Stroke.Kind := TBrushKind.Solid;
        Canvas.Stroke.Dash := TStrokeDash.Dash;
        Canvas.Stroke.Color := TAlphaColorRec.Maroon;


        Canvas.DrawLine(TPointF.Create(LeftX - 1,Round(PageTopY / 3)), TPointF.Create(PaintWidth - RightX,Round(PageTopY/3)), 1);
        Canvas.DrawLine(TPointF.Create(LeftX - 1,Round(2 * PageTopY / 3)), TPointF.Create(PaintWidth - RightX,Round(2 * PageTopY / 3)), 1);




        Canvas.Stroke.Kind := TBrushKind.Solid;




       //求价格的最大、最小值
        Maxjg := DayData[2][LeftDate];
        MinJg := DayData[3][LeftDate];
        I := LeftDate;
        while (I < RightDate) or (I = RightDate) do
        begin
            if DayData[2][I] > MaxJg then
                MaxJg := DayData[2][I];
            if DayData[3][I] < MinJg then
                MinJg := DayData[3][I];
            I := I + 1;
        end;


       //画右侧成交价格坐标数值
        OutStr := '.';
        PaintBoxMain.Canvas.Fill.Color := TAlphaColorRec.Red;
        Canvas.Font.Size := 11;
        Canvas.Font.Family := '宋体';
        TempString := IntToStr(Round(MinJg + (MaxJg - MinJg) * 2 / 3));
        TempLen := Length(TempString);
        Insert(OutStr, TempString, TempLen - 2);
        StrLen := Length(TempString);
        if TempString[StrLen] = '0' then
            TempString[StrLen] := ' ';
        ARect := TRectF.Create(PaintWidth - RightX + 2, Round(PageTopY / 3) - 9, PaintWidth - RightX + 100, Round(PageTopY / 3) +100);
        PaintBoxMain.Canvas.FillText(ARect, TempString, True, 1, [], TTextAlign.taLeading, TTextAlign.Leading);


        TempString := IntToStr(Round(MinJg + (MaxJg - MinJg) / 3));
        TempLen := Length(TempString);
        Insert(OutStr, TempString, TempLen - 2);
        StrLen := Length(TempString);
        if TempString[StrLen] = '0' then
            TempString[StrLen] := ' ';
        ARect := TRectF.Create(PaintWidth - RightX + 2, Round(PageTopY * 2 / 3) - 9, PaintWidth - RightX + 100, Round(PageTopY * 2/ 3) +100);
        PaintBoxMain.Canvas.FillText(ARect, TempString, True, 1, [], TTextAlign.taLeading, TTextAlign.taLeading);




       //画K线图
        Kheight := PageTopY - TopY - 10;
        HeightXiShu := (MaxJg - MinJg) / Kheight;
        x1 := LeftX - DefaultWidth;
        I := LeftDate;
        while (I < RightDate) or (I = RightDate) do
        begin
            kpjg := DayData[1][I];
            spjg := DayData[4][I];
            zgjg := DayData[2][I];
            zdjg := DayData[3][I];
            x1 := x1 + DefaultWidth;
            x2 := x1 + DefaultWidth - 1;
            x3 := Round((x1 + x2) / 2);
            x4 := x3;
            if spjg < kpjg then
            begin
                Canvas.Stroke.Color := TAlphaColorRec.Aqua;
                Canvas.Stroke.Kind := TBrushKind.Solid;
                Canvas.Stroke.Dash := TStrokeDash.Solid;
                Canvas.Fill.Color := TAlphaColorRec.Aqua;
                Canvas.Fill.Kind := TBrushKind.Solid;
                y3 := PageTopY - Round((zgjg - MinJg) / HeightXiShu) - 2;
                y1 := PageTopY - Round((kpjg - MinJg) / HeightXiShu) - 2;
                y2 := PageTopY - Round((spjg - MinJg) / HeightXiShu) - 2;
                y4 := PageTopY - Round((zdjg - MinJg) / HeightXiShu) - 2;
                if (y1 = y2) then
                    y2 := y2 + 1;
                if (zgjg = kpjg) then
                    y3 := y1;
                if (zdjg = spjg) then
                    y4 := y2;
                if (zgjg <> kpjg) and (y1 = y3) then
                    y3 := y3 - 1;
                if (zdjg <> spjg) and (y2 = y4) then
                    y4 := y4 + 1;


                Canvas.DrawLine(TPointF.Create(x3, y3), TPointF.Create(x3, y1), 1);


                Canvas.FillRect(TRectF.Create(x1, y1, x2, y2),0,0, AllCorners, 1);
                Canvas.DrawLine(TPointF.Create(x4, y2), TPointF.Create(x4, y4), 1);


                    //  Sleep(1000);
                Canvas.FillRect(TRectF.Create(x1, y1, x2, y2), 0, 0, AllCorners, 1);
                Canvas.DrawLine(TPointF.Create(x4, y2), TPointF.Create(x4, y4), 1);
            end//收盘价小于开盘价,阴线
            else
            begin
                Canvas.Stroke.Color := TAlphaColorRec.red;
                Canvas.Stroke.Kind := TBrushKind.Solid;
                Canvas.Stroke.Dash := TStrokeDash.Solid;
                x2 := x2 - 1;
                y3 := PageTopY - Round((zgjg - MinJg) / HeightXiShu) - 2;
                y1 := PageTopY - Round((spjg - MinJg) / HeightXiShu) - 2;
                y2 := PageTopY - Round((kpjg - MinJg) / HeightXiShu) - 2;
                y4 := PageTopY - Round((zdjg - MinJg) / HeightXiShu) - 2;
                if (y1 = y2) and (spjg <> kpjg) then
                    y2 := y2 + 1;
                if (zdjg = kpjg) then
                    y4 := y2;
                if (zgjg = spjg) then
                    y3 := y1;
                if (zdjg <> kpjg) and (y2 = y4) then
                    y4 := y4 + 1;
                if (zgjg <> spjg) and (y1 = y3) then
                    y3 := y3 - 1;


                Canvas.DrawLine(TPointF.Create(x3, y3), TPointF.Create(x3, y1), 1);
                Canvas.DrawLine(TPointF.Create(x1, y1), TPointF.Create(x2, y1), 1);
                Canvas.DrawLine(TPointF.Create(x2, y1), TPointF.Create(x2, y2), 1);
                Canvas.DrawLine(TPointF.Create(x2, y2), TPointF.Create(x1, y2), 1);
                Canvas.DrawLine(TPointF.Create(x1, y2), TPointF.Create(x2, y2), 1);
                Canvas.DrawLine(TPointF.Create(x2, y2), TPointF.Create(x1, y2), 1);
                Canvas.DrawLine(TPointF.Create(x1, y2), TPointF.Create(x1, y1), 1);
                Canvas.DrawLine(TPointF.Create(x4, y2), TPointF.Create(x4, y4), 1);
            end; //收盘价大于开盘价,阳线
            I := I + 1;
        end; //画K线图




        Canvas.Fill.Color := TAlphaColorRec.Red;
        Canvas.Font.Size := 11;
        Canvas.Font.Family := '宋体';
        //输出证券名称
        TempString := ZqjcData[ZqRecordNo];
        Canvas.FillText(TRectF.Create(1,1,101,101), TempString, True, 1, [], TTextAlign.taCenter, TTextAlign.taLeading);
        //输出基本信息
        TempString := '代码 ';
        TempString := TempString + ZqdmData[ZqRecordNo] + ' ';
        TempString := TempString + '流通股本';
        TempString := TempString + IntToStr(ZqltgbData[ZqRecordNo]) + ' ';
        Canvas.FillText(TRectF.Create(LeftX + 1, 1,LeftX + 201, 201), TempString, True, 1, [], TTextAlign.taLeading, TTextAlign.taLeading);
    end; //数据集中数据个数大于0
    PaintBoxMain.Canvas.EndScene;
end;
原创粉丝点击