hqchart 1.1.14416 → 1.1.14432

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -321,6 +321,12 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
321
321
  if (IFrameSplitOperator.IsNumber(item.WheelYMove)) chart.EnableYDrag.WheelYMove=item.WheelYMove;
322
322
  }
323
323
 
324
+ if (option.EnableXDrag)
325
+ {
326
+ var item=option.EnableXDrag;
327
+ if (IFrameSplitOperator.IsBool(item.Bottom)) chart.EnableXDrag.Bottom=item.Bottom;
328
+ }
329
+
324
330
  if (option.KLineTooltip)
325
331
  {
326
332
  var item=option.KLineTooltip;
@@ -1885,6 +1891,13 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
1885
1891
  return [];
1886
1892
  }
1887
1893
 
1894
+ //手动更新指标 aryIndex=[ {ID:主图指标ID, OverlayID:叠加指标ID }] ,option={ Draw:true/false }
1895
+ this.UpdateWindowIndexV2=function(aryIndex, option)
1896
+ {
1897
+ if (this.JSChartContainer && typeof(this.JSChartContainer.UpdateWindowIndexV2)=='function')
1898
+ return this.JSChartContainer.UpdateWindowIndexV2(aryIndex, option);
1899
+ }
1900
+
1888
1901
  this.ChangeInstructionIndex=function(indexName, option)
1889
1902
  {
1890
1903
  if (this.JSChartContainer && typeof(this.JSChartContainer.ChangeInstructionIndex)=='function')
@@ -3056,7 +3069,9 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
3056
3069
  {
3057
3070
  Left:false, Right:false, //是否可以拖拽缩放Y轴最大最小值
3058
3071
  Wheel:false, WheelYMove:5 //是否可以滚轴缩放Y轴最大最小值
3059
- };
3072
+ };
3073
+
3074
+ this.EnableXDrag={ Bottom:true }; //X轴拖动缩放
3060
3075
 
3061
3076
  this.EnableZoomIndexWindow=false; //是否支持双击缩放附图窗口
3062
3077
  this.EnableVerifyRecvData=false; //是否检测接收到的数据
@@ -3892,14 +3907,17 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
3892
3907
 
3893
3908
  var drag=
3894
3909
  {
3895
- "Click":{},
3896
- "LastMove":{}, //最后移动的位置
3910
+ Click:{},
3911
+ LastMove:{}, //最后移动的位置
3897
3912
  CurrentMove:{}, //当前的移动
3913
+ IsInFrameBottom:false,
3898
3914
  };
3899
3915
 
3916
+
3917
+
3900
3918
  drag.Click.X=e.clientX;
3901
3919
  drag.Click.Y=e.clientY;
3902
- drag.Click.IsInFrameBottom=this.Frame.PtInFrameBottom(x,y); //是否点击在X轴上
3920
+ if (this.EnableXDrag.Bottom) drag.Click.IsInFrameBottom=this.Frame.PtInFrameBottom(x,y); //是否点击在X轴上
3903
3921
  drag.LastMove.X=e.clientX;
3904
3922
  drag.LastMove.Y=e.clientY;
3905
3923
 
@@ -5927,6 +5945,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
5927
5945
  for(var i=0;i<this.ExtendChartPaint.length;++i)
5928
5946
  {
5929
5947
  var item=this.ExtendChartPaint[i];
5948
+
5930
5949
  if (item.IsCallbackDraw)
5931
5950
  {
5932
5951
  if (["KLineYAxisBGPaint","DepthMapPaint","BackgroundPaint","MinuteBackgroundPaint", "SessionBreaksPaint"].includes(item.ClassName))
@@ -6601,7 +6620,8 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
6601
6620
  }
6602
6621
  }
6603
6622
 
6604
- if (this.ClassName=="KLineChartContainer" && this.Frame.PtInFrameBottom(x,y))
6623
+ //X轴拖动缩放
6624
+ if (this.ClassName=="KLineChartContainer" && this.EnableXDrag.Bottom && this.Frame.PtInFrameBottom(x,y))
6605
6625
  {
6606
6626
  mouseStatus={ Cursor:"ew-resize", Name:"FrameButtom"};
6607
6627
  JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] frame bottom ");
@@ -10573,69 +10593,82 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
10573
10593
  }
10574
10594
  }
10575
10595
 
10576
- this.UpdateWindowIndexV2=function(aryIndex)
10596
+ //手动更新指标 [ {ID:主图指标ID, OverlayID:叠加指标ID }]
10597
+ this.UpdateWindowIndexV2=function(aryIndex, option)
10577
10598
  {
10599
+ if (!this.Frame || !this.Frame.SubFrame) return false;
10600
+
10601
+ var kData=this.GetKData();
10602
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
10603
+
10578
10604
  if (!IFrameSplitOperator.IsNonEmptyArray(aryIndex)) return false;
10579
10605
 
10580
- var aryID=[];
10581
- for(var i=0;i<this.WindowIndex.length;++i)
10606
+ var setMainIndex=new Set(); //主图指标
10607
+ var setOverlayIndex=new Set(); //附图指标
10608
+
10609
+ for(var i=0;aryIndex.length;++i)
10582
10610
  {
10583
- var item=this.WindowIndex[i];
10611
+ var item=aryIndex[i];
10584
10612
  if (!item) continue;
10585
- if (!item.ID) continue;
10586
10613
 
10587
- if (aryIndex.find((element)=>{ return element.ID==item.ID;} ))
10588
- {
10589
- aryID.push(i);
10590
- }
10614
+ if (item.ID) setMainIndex.set(item.ID);
10615
+ if (item.OverlayID) setOverlayIndex.set(item.OverlayID);
10591
10616
  }
10592
10617
 
10593
- if (!IFrameSplitOperator.IsNonEmptyArray(aryID)) return false;
10618
+ if (setMainIndex.size<=0 && setOverlayIndex.size<0) return false;
10594
10619
 
10620
+ //K线数据
10621
+ var bindData=new ChartData();
10622
+ if (kData) bindData.Data=kData.Data;
10595
10623
  if (this.IsKLineContainer()) //K线
10596
10624
  {
10597
- var bindData=new ChartData();
10598
- bindData.Data=this.SourceData.Data;
10599
10625
  bindData.Period=this.Period;
10600
10626
  bindData.Right=this.Right;
10627
+ }
10601
10628
 
10602
- if (this.IsApiPeriod)
10629
+ //主图指标
10630
+ if (setMainIndex.size>0)
10631
+ {
10632
+ for(var i=0;i<this.WindowIndex.length;++i)
10603
10633
  {
10634
+ var item=this.WindowIndex[i];
10635
+ if (!item) continue;
10604
10636
 
10637
+ if (setMainIndex.has(item.ID))
10638
+ {
10639
+ this.BindIndexData(i,bindData);
10640
+ }
10605
10641
  }
10606
- else
10642
+ }
10643
+
10644
+ //叠加指标
10645
+ if (setOverlayIndex.size>0)
10646
+ {
10647
+ for(var i=0;i<this.Frame.SubFrame.length;++i)
10607
10648
  {
10608
- if (bindData.Right>0) //复权
10649
+ var item=this.Frame.SubFrame[i];
10650
+ for(var j=0; j<item.OverlayIndex.length; ++j)
10609
10651
  {
10610
- var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });
10611
- bindData.Data=rightData;
10612
- }
10652
+ var overlayItem=item.OverlayIndex[j];
10613
10653
 
10614
- if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false)) //周期数据
10615
- {
10616
- var periodData=bindData.GetPeriodData(bindData.Period);
10617
- bindData.Data=periodData;
10654
+ if (setOverlayIndex.has(overlayItem.Identify))
10655
+ {
10656
+ this.BindOverlayIndexData(overlayItem,i,hisData)
10657
+ }
10618
10658
  }
10619
10659
  }
10620
10660
  }
10621
- else if (this.IsMinuteContainer()) //分时图
10622
- {
10623
- var bindData=this.SourceData;
10624
- }
10625
- else
10626
- {
10627
- return;
10628
- }
10629
10661
 
10630
-
10631
- for(var i=0;i<aryID.length;++i)
10662
+ var bDraw=true;
10663
+ if (option && option.Draw===false) bDraw=false;
10664
+ if (bDraw)
10632
10665
  {
10633
- this.BindIndexData(aryID[i],bindData)
10666
+ this.UpdataDataoffset(); //更新数据偏移
10667
+ this.UpdateFrameMaxMin(); //调整坐标最大 最小值
10668
+ this.Draw();
10634
10669
  }
10635
10670
 
10636
- this.UpdataDataoffset(); //更新数据偏移
10637
- this.UpdateFrameMaxMin(); //调整坐标最大 最小值
10638
- this.Draw();
10671
+ return true;
10639
10672
  }
10640
10673
 
10641
10674
  this.GetKData=function()
@@ -44414,6 +44447,25 @@ function IExtendChartPainting()
44414
44447
  {
44415
44448
  return GetFontHeight(this.Canvas, font, "擎");
44416
44449
  }
44450
+
44451
+ this.SetFillStyle=function(color, x0, y0, x1, y1)
44452
+ {
44453
+ if (Array.isArray(color))
44454
+ {
44455
+ let gradient = this.Canvas.createLinearGradient(x0, y0, x1, y1);
44456
+ var offset=1/(color.length-1);
44457
+ for(var i=0; i<color.length; ++i)
44458
+ {
44459
+ var value=i*offset;
44460
+ gradient.addColorStop(value, color[i]);
44461
+ }
44462
+ this.Canvas.fillStyle=gradient;
44463
+ }
44464
+ else
44465
+ {
44466
+ this.Canvas.fillStyle=color;
44467
+ }
44468
+ }
44417
44469
  }
44418
44470
 
44419
44471
  //K线Tooltip, 显示在左边或右边
@@ -48583,7 +48635,7 @@ function KLineYAxisBGPaint()
48583
48635
  }
48584
48636
 
48585
48637
 
48586
- //背景图 支持横屏
48638
+ //背景图 支持横屏 新版本
48587
48639
  function BackgroundPaint()
48588
48640
  {
48589
48641
  this.newMethod=IExtendChartPainting; //派生
@@ -48595,327 +48647,210 @@ function BackgroundPaint()
48595
48647
  this.IsDynamic=false;
48596
48648
  this.IsCallbackDraw=true; //在回调函数里绘制, 不在Draw()中绘制
48597
48649
 
48650
+ this.IsDrawAllFrame=false; //全部的指标框都画
48651
+ this.SetDrawFrameID=new Set([0]); //指定几个指标框画
48652
+
48598
48653
  this.FrameID=0;
48599
- this.Data; //背景数据 { Start:, End:, Color:[] }
48654
+ this.Data; //背景数据[ { Start:{ Date:, Time: }, End:{ Date:, Time }, Color:['rgb(44,55,255)','rgb(200,55,255)'] }]
48655
+ this.IsShow=true;
48656
+ this.SubFrame=null;
48657
+
48600
48658
  this.ID=Guid(); //唯一的ID
48601
-
48602
- /*
48603
- this.Data=
48604
- [
48605
- { Start:{ Date:20181201 }, End:{ Date:20181230 }, Color:'rgb(44,55,44)' } ,
48606
- { Start:{ Date:20190308 }, End:{ Date:20190404 }, Color:['rgb(44,55,255)','rgb(200,55,255)'] }
48607
- ]
48608
- */
48609
-
48610
- this.ChartSubFrame;
48611
- this.ChartBorder;
48612
- this.KData;
48613
- this.Period;
48614
- this.XPointCount=0;
48659
+ this.HQChart;
48615
48660
 
48616
48661
  this.SetOption=function(option) //设置
48617
48662
  {
48618
- if (option.FrameID>0) this.FrameID=option.FrameID;
48663
+ if (!option) return;
48664
+
48665
+ if (IFrameSplitOperator.IsNumber(option.FrameID)) this.FrameID=option.FrameID;
48619
48666
  if (IFrameSplitOperator.IsObjectExist(option.ID)) this.ID=option.ID;
48667
+ if (IFrameSplitOperator.IsBool(option.IsDrawAllFrame)) this.IsDrawAllFrame=option.IsDrawAllFrame;
48668
+ if (IFrameSplitOperator.IsNonEmptyArray(option.AryFrameID)) this.SetDrawFrameID=new Set(option.AryFrameID);
48620
48669
  }
48621
48670
 
48622
48671
  this.Draw=function()
48623
48672
  {
48624
- if (!this.Data || !this.HQChart) return;
48625
- if (!this.ChartFrame || !this.ChartFrame.SubFrame || this.ChartFrame.SubFrame.length<=this.FrameID) return;
48626
- var klineChart=this.HQChart.ChartPaint[0];
48627
- if (!klineChart || !klineChart.Data) return;
48628
-
48629
- this.ChartSubFrame=this.ChartFrame.SubFrame[this.FrameID].Frame;
48630
- this.ChartBorder=this.ChartSubFrame.ChartBorder;
48631
- this.KData=klineChart.Data;
48632
- this.Period=this.HQChart.Period;
48633
- if (!this.KData || this.KData.Data.length<=0) return;
48634
-
48635
- var isHScreen=(this.ChartSubFrame.IsHScreen===true);
48636
- this.XPointCount=this.ChartSubFrame.XPointCount;
48637
- var xPointCount=this.ChartSubFrame.XPointCount;
48638
-
48639
- var firstKItem=this.KData.Data[this.KData.DataOffset];
48640
- var endIndex=this.KData.DataOffset+xPointCount-1;
48641
- if (endIndex>=this.KData.Data.length) endIndex=this.KData.Data.length-1;
48642
- var endKItem=this.KData.Data[endIndex];
48643
- var showData=this.GetShowData(firstKItem,endKItem);
48644
- if (!showData || showData.length<=0) return;
48645
-
48646
- var kLineMap=this.BuildKLineMap();
48647
- var bottom=this.ChartBorder.GetBottomEx();
48648
- var top=this.ChartBorder.GetTopEx();
48649
- var height=this.ChartBorder.GetHeightEx();
48650
- if (isHScreen)
48673
+ this.SubFrame=null;
48674
+
48675
+ if (this.FrameID<0) return;
48676
+ if (!this.HQChart) return;
48677
+ if (!this.ChartFrame || !IFrameSplitOperator.IsNonEmptyArray(this.ChartFrame.SubFrame)) return;
48678
+ if (!this.IsShow) return;
48679
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Data)) return;
48680
+ if (!this.ChartFrame.SubFrame[this.FrameID]) return;
48681
+ this.SubFrame=this.ChartFrame.SubFrame[this.FrameID].Frame;
48682
+ if (!this.SubFrame) return;
48683
+
48684
+ var kData=this.HQChart.GetKData();
48685
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return;
48686
+
48687
+ var bHScreen=(this.SubFrame.IsHScreen===true);
48688
+ this.IsHScreen=bHScreen;
48689
+ var isMinute=this.SubFrame.IsMinuteFrame();
48690
+ var dataWidth=this.SubFrame.DataWidth;
48691
+ var distanceWidth=this.SubFrame.DistanceWidth;
48692
+ var xPointCount=this.SubFrame.XPointCount;
48693
+
48694
+ var border=this.SubFrame.GetBorder();
48695
+ if (bHScreen)
48651
48696
  {
48652
- top=this.ChartBorder.GetRightEx();
48653
- bottom=this.ChartBorder.GetLeftEx();
48654
- height=this.ChartBorder.GetWidthEx();
48697
+ var chartright=border.BottomEx;
48698
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
48699
+ }
48700
+ else
48701
+ {
48702
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
48703
+ var chartright=border.RightEx;
48655
48704
  }
48656
48705
 
48657
- for(var i in showData)
48706
+ var mapBG=new Map(); //key= index, Value={ Start:{Left, Center, Right, Item:}, End:{ Left, Center, Right, Item:} }
48707
+ var startIndex=kData.DataOffset;
48708
+ for(var i=startIndex,j=0;i<kData.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
48658
48709
  {
48659
- var item=showData[i];
48660
- var rt=this.GetBGCoordinate(item,kLineMap);
48661
- if (!rt) continue;
48710
+ var kItem=kData.Data[i];
48711
+ var aryFind=this.FindMatchData(kItem);
48712
+ if (!aryFind) continue;
48662
48713
 
48663
- if (Array.isArray(item.Color))
48714
+ if (isMinute)
48664
48715
  {
48665
- var gradient;
48666
- if (isHScreen) gradient = this.Canvas.createLinearGradient(bottom,rt.Left, top, rt.Left);
48667
- else gradient = this.Canvas.createLinearGradient(rt.Left,top, rt.Left,bottom);
48668
- var offset=1/item.Color.length;
48669
- for(var i in item.Color)
48670
- {
48671
- gradient.addColorStop(i*offset, item.Color[i]);
48672
- }
48673
- this.Canvas.fillStyle=gradient;
48716
+ var x=this.ChartFrame.GetXFromIndex(j);
48717
+ var left=x;
48718
+ var right=x;
48674
48719
  }
48675
48720
  else
48676
48721
  {
48677
- this.Canvas.fillStyle=item.Color;
48722
+ var left=xOffset;
48723
+ var right=xOffset+dataWidth;
48724
+ var x=left+(right-left)/2;
48678
48725
  }
48679
48726
 
48680
- if (isHScreen) this.Canvas.fillRect(ToFixedRect(bottom),ToFixedRect(rt.Left),ToFixedRect(height),ToFixedRect(rt.Width));
48681
- else this.Canvas.fillRect(ToFixedRect(rt.Left),ToFixedRect(top),ToFixedRect(rt.Width),ToFixedRect(height));
48727
+ for(var k=0;k<aryFind.length;++k)
48728
+ {
48729
+ var findItem=aryFind[k];
48730
+ if (mapBG.has(findItem.Index))
48731
+ {
48732
+ var bgItem=mapBG.get(findItem.Index);
48733
+ bgItem.End.Left=left;
48734
+ bgItem.End.Right=right;
48735
+ bgItem.End.Item=findItem.Item;
48736
+ }
48737
+ else
48738
+ {
48739
+ mapBG.set(findItem.Index, { Item:findItem.Item, Start:{ Left:left, Right:right, Item:findItem.Item }, End:{ Left:left, Right:right, Item:findItem.Item }})
48740
+ }
48741
+ }
48742
+ }
48743
+
48744
+ if (mapBG.size>0)
48745
+ {
48746
+ this.Canvas.save();
48747
+ //this.ClipClient(bHScreen);
48748
+
48749
+ this.DrawBG(mapBG);
48750
+
48751
+ this.Canvas.restore();
48682
48752
  }
48683
48753
  }
48684
48754
 
48685
- this.GetShowData=function(first, end)
48755
+ this.FindMatchData=function(kItem)
48686
48756
  {
48687
- if (!IFrameSplitOperator.IsNonEmptyArray(this.Data)) return null;
48688
-
48689
- var aryData=[];
48757
+ var aryFind=[];
48690
48758
  for(var i=0;i<this.Data.length;++i)
48691
48759
  {
48692
48760
  var item=this.Data[i];
48693
- var showItem={ };
48694
- if (item.Start.Date>=first.Date && item.Start.Date<=end.Date) showItem.Start=item.Start;
48695
- if (item.End.Date>=first.Date && item.End.Date<=end.Date) showItem.End=item.End;
48696
-
48697
- if (item.Start.Date<first.Date && item.End.Date>end.Date)
48761
+ var start=item.Start;
48762
+ var end=item.End;
48763
+ var bMatch=false;
48764
+ if (IFrameSplitOperator.IsNumber(kItem.Date) && IFrameSplitOperator.IsNumber(kItem.Time))
48698
48765
  {
48699
- showItem.Start=first;
48700
- showItem.End=end;
48766
+ if (kItem.Date>start.Date && kItem.Date<end.Date)
48767
+ {
48768
+ bMatch=true;
48769
+ }
48770
+ else if (kItem.Date==start.Date && kItem.Date==end.Date)
48771
+ {
48772
+ if (kItem.Time>=start.Time && kItem.Time<=end.Time)bMatch=true;
48773
+ }
48774
+ else if (kItem.Date==start.Date)
48775
+ {
48776
+ if (kItem.Time>=start.Time) bMatch=true;
48777
+ }
48778
+ else if (kItem.Date==end.Date)
48779
+ {
48780
+ if ((kItem.Time<=end.Time)) bMatch=true;
48781
+ }
48701
48782
  }
48702
-
48703
-
48704
- if (showItem.Start || showItem.End)
48783
+ else if (IFrameSplitOperator.IsNumber(kItem.Date) && !IFrameSplitOperator.IsNumber(kItem.Time))
48705
48784
  {
48706
- showItem.Color=item.Color;
48707
- aryData.push(showItem);
48785
+ if (kItem.Date>=start.Date && kItem.Date<=end.Date) bMatch=true;
48708
48786
  }
48787
+
48788
+ if (bMatch) aryFind.push({ Index:i, Item:item });
48709
48789
  }
48710
48790
 
48711
- //JSConsole.Chart.Log('[BackgroundPaint::GetShowData] aryData ', aryData);
48712
- return aryData;
48791
+ if (aryFind.Length<=0) return null;
48792
+
48793
+ return aryFind;
48713
48794
  }
48714
48795
 
48715
- this.BuildKLineMap=function()
48796
+ this.DrawBG=function(mapBG)
48716
48797
  {
48717
- var isHScreen=(this.ChartSubFrame.IsHScreen===true);
48718
- var dataWidth=this.ChartSubFrame.DataWidth;
48719
- var distanceWidth=this.ChartSubFrame.DistanceWidth;
48720
- var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
48721
- if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
48722
- var chartright=this.ChartBorder.GetRight();
48723
- if (isHScreen) chartright=this.ChartBorder.GetBottom();
48724
-
48725
- var mapKLine={ Data:new Map() ,Start:null, End:null } ; //Key: date / date time, Value:索引
48726
- for(var i=this.KData.DataOffset,j=0; i<this.KData.Data.length && j<this.XPointCount; ++i,++j,xOffset+=(dataWidth+distanceWidth))
48798
+ for(var mapItem of mapBG)
48727
48799
  {
48728
- var kItem=this.KData.Data[i];
48729
- var left=xOffset;
48730
- var right=xOffset+dataWidth;
48731
- if (right>chartright) break;
48732
- var x=left+(right-left)/2;
48733
-
48734
- if (j==0) mapKLine.XLeft=left;
48735
- mapKLine.XRight=right;
48736
-
48737
- var value={ Index:i, ShowIndex:j , X:x, Right:right, Left:left, Date:kItem.Date };
48738
- if (ChartData.IsMinutePeriod(this.Period,true))
48739
- {
48740
- var key=`Date:${kItem.Date} Time:${kItem.Time}`;
48741
- value.Time=kItem.Time;
48742
- }
48743
- else
48800
+ var bgItem=mapItem[1];
48801
+ //this.DrawBGItem(this.SubFrame, bgItem);
48802
+
48803
+ for(var i=0;i<this.ChartFrame.SubFrame.length;++i)
48744
48804
  {
48745
- var key=`Date:${kItem.Date}`;
48805
+ var subFrame=this.ChartFrame.SubFrame[i].Frame;
48806
+ if (this.IsDrawAllFrame || this.SetDrawFrameID.has(i))
48807
+ {
48808
+ this.DrawBGItem(subFrame, bgItem);
48809
+ }
48746
48810
  }
48747
-
48748
- mapKLine.Data.set(key,value);
48749
-
48750
- //保存下起始和结束位置
48751
- if (j==0) mapKLine.Start=value;
48752
- mapKLine.End=value;
48753
48811
  }
48754
-
48755
- return mapKLine;
48756
48812
  }
48757
48813
 
48758
- this.GetBGCoordinate=function(item,kLineMap)
48814
+ this.DrawBGItem=function(frame, bgItem)
48759
48815
  {
48760
- var xLeft=null, xRight=null;
48761
- var isMinutePeriod=ChartData.IsMinutePeriod(this.Period,true);
48762
- var bSingleDate=false;
48763
- //JSConsole.Chart.Log('[BackgroundPaint::GetBGCoordinate] item ', item);
48764
- if (isMinutePeriod)
48765
- {
48766
- if (item.Start && item.End && item.Start.Date==item.End.Date && item.Start.Time==item.End.Time) bSingleDate=true;
48767
- }
48768
- else
48769
- {
48770
- if (item.Start && item.End && item.Start.Date==item.End.Date) bSingleDate=true;
48771
- }
48772
-
48773
- if (bSingleDate)
48774
- {
48775
- if (isMinutePeriod)
48776
- var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;
48777
- else
48778
- var key=`Date:${item.Start.Date}`;
48779
-
48780
- if (!kLineMap.Data.has(key)) return null;
48781
- var findItem=kLineMap.Data.get(key);
48782
- xLeft=findItem.Left;
48783
- xRight=findItem.Right;
48784
- return { Left:xLeft, Right:xRight, Width:xRight-xLeft };
48785
- }
48786
-
48787
- if (item.Start)
48816
+ var border=frame.GetBorder();
48817
+ if (this.IsHScreen)
48788
48818
  {
48789
- if (isMinutePeriod)
48790
- var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;
48791
- else
48792
- var key=`Date:${item.Start.Date}`;
48793
-
48794
- if (kLineMap.Data.has(key))
48795
- {
48796
- var findItem=kLineMap.Data.get(key);
48797
- xLeft=findItem.Left;
48798
- }
48799
- else
48800
- {
48801
- if (isMinutePeriod)
48802
- {
48803
- if (item.Start.Date<kLineMap.Start.Date || (item.Start.Date==kLineMap.Start.Date && item.Start.Time<=kLineMap.Start.Time) )
48804
- {
48805
- xLeft=kLineMap.Start.Left;
48806
- }
48807
- else
48808
- {
48809
- for(var kItem of kLineMap.Data)
48810
- {
48811
- var value=kItem[1];
48812
- if (value.Date>item.Start.Date || (value.Date==item.Start.Date && value.Time>item.Start.Time))
48813
- {
48814
- xLeft=value.Left;
48815
- break;
48816
- }
48817
- }
48818
- }
48819
- }
48820
- else
48821
- {
48822
- if (item.Start.Date<=kLineMap.Start.Date)
48823
- {
48824
- xLeft=kLineMap.Start.Left;
48825
- }
48826
- else
48827
- {
48828
- for(var kItem of kLineMap.Data)
48829
- {
48830
- var value=kItem[1];
48831
- if (value.Date>item.Start.Date)
48832
- {
48833
- xLeft=value.Left;
48834
- break;
48835
- }
48836
- }
48837
- }
48838
- }
48839
- }
48819
+ var top=border.RightEx;
48820
+ var bottom=border.LeftEx;
48821
+ var left=border.Top;
48840
48822
  }
48841
48823
  else
48842
48824
  {
48843
- xLeft=kLineMap.XLeft;
48825
+ var top=border.TopEx;
48826
+ var bottom=border.BottomEx;
48827
+ var left=border.Left;
48844
48828
  }
48845
48829
 
48846
- if (item.End)
48830
+ if (this.IsHScreen)
48847
48831
  {
48848
- if (isMinutePeriod)
48849
- var key=`Date:${item.End.Date} Time:${item.End.Time}`;
48850
- else
48851
- var key=`Date:${item.End.Date}`;
48852
-
48853
- if (kLineMap.Data.has(key))
48854
- {
48855
- var findItem=kLineMap.Data.get(key);
48856
- xRight=findItem.Right;
48857
- }
48858
- else
48859
- {
48860
- if (isMinutePeriod)
48861
- {
48862
- if (item.End.Date<kLineMap.Start.Date || (item.End.Date==kLineMap.Start.Date && item.End.Time<kLineMap.Start.Time)) return null;
48863
-
48864
- if (item.End.Date<kLineMap.End.Date || (item.End.Date==kLineMap.End.Date && item.End.Time>=kLineMap.End.Time) )
48865
- {
48866
- xRight=kLineMap.End.Right;
48867
- }
48868
- else
48869
- {
48870
- var previousX=null;
48871
- for(var kItem of kLineMap.Data)
48872
- {
48873
- var value=kItem[1];
48874
- if (value.Date>item.End.Date || (value.Date==item.End.Date && value.Time>item.End.Time) )
48875
- {
48876
- xRight=previousX;
48877
- break;
48878
- }
48879
- previousX=value.Right;
48880
- }
48881
- }
48882
- }
48883
- else
48884
- {
48885
- if (item.End.Date<kLineMap.Start.Date) return null;
48886
-
48887
- if (item.End.Date<=kLineMap.End.Date)
48888
- {
48889
- xRight=kLineMap.End.Right;
48890
- }
48891
- else
48892
- {
48893
- var previousX=null;
48894
- for(var kItem of kLineMap.Data)
48895
- {
48896
- var value=kItem[1];
48897
- if (value.Date>item.End.Date)
48898
- {
48899
- xRight=previousX;
48900
- break;
48901
- }
48902
- previousX=value.Right;
48903
- }
48904
- }
48905
- }
48906
- }
48832
+ this.SetFillStyle(bgItem.Item.Color,top,left,bottom,left);
48833
+ var start=bgItem.Start;
48834
+ var end=bgItem.End;
48835
+ var rtBG={ Left:bottom, Right:top, Top:start.Left, Bottom:end.Right };
48836
+ rtBG.Width=rtBG.Right-rtBG.Left;
48837
+ rtBG.Height=rtBG.Bottom-rtBG.Top;
48838
+ this.Canvas.fillRect(ToFixedRect(rtBG.Left),ToFixedRect(rtBG.Top),ToFixedRect(rtBG.Width),ToFixedRect(rtBG.Height));
48907
48839
  }
48908
48840
  else
48909
48841
  {
48910
- xRight=kLineMap.XRight;
48842
+ this.SetFillStyle(bgItem.Item.Color, left,top, left,bottom);
48843
+ var start=bgItem.Start;
48844
+ var end=bgItem.End;
48845
+ var rtBG={ Left:start.Left, Right:end.Right, Top:top, Bottom:bottom };
48846
+ rtBG.Width=rtBG.Right-rtBG.Left;
48847
+ rtBG.Height=rtBG.Bottom-rtBG.Top;
48848
+ this.Canvas.fillRect(ToFixedRect(rtBG.Left),ToFixedRect(rtBG.Top),ToFixedRect(rtBG.Width),ToFixedRect(rtBG.Height));
48911
48849
  }
48912
-
48913
- if (xLeft==null || xRight==null) return null;
48914
-
48915
- return { Left:xLeft, Right:xRight, Width:xRight-xLeft };
48916
48850
  }
48917
48851
  }
48918
48852
 
48853
+
48919
48854
  function MinuteBackgroundPaint()
48920
48855
  {
48921
48856
  this.newMethod=IExtendChartPainting; //派生
@@ -58515,7 +58450,7 @@ function DynamicChartTitlePainting()
58515
58450
  var left=positionInfo.Left;
58516
58451
  var right=positionInfo.Right;
58517
58452
  var bottom=positionInfo.Bottom;
58518
-
58453
+ var pixelRatio=GetDevicePixelRatio();
58519
58454
  for(var i=0; i<this.Data.length; ++i)
58520
58455
  {
58521
58456
  var item=this.Data[i];
@@ -58534,7 +58469,9 @@ function DynamicChartTitlePainting()
58534
58469
  if (titleItem.Name) text=titleItem.Name+":"+titleItem.Text;
58535
58470
  else text=titleItem.Text;
58536
58471
 
58537
- var space=this.ParamSpace*GetDevicePixelRatio();
58472
+ if (IFrameSplitOperator.IsNumber(titleItem.LeftSpace)) left+=titleItem.LeftSpace*pixelRatio;
58473
+
58474
+ var space=this.ParamSpace*pixelRatio;
58538
58475
  var indexTextWidth=this.Canvas.measureText(text).width; //标题+数值长度
58539
58476
  var textWidth=indexTextWidth;
58540
58477
 
@@ -58610,7 +58547,7 @@ function DynamicChartTitlePainting()
58610
58547
  if (dyTitle) text=dyTitle+":"+valueText;
58611
58548
  else text=item.Name+":"+valueText;
58612
58549
  }
58613
- var space=this.ParamSpace*GetDevicePixelRatio();
58550
+ var space=this.ParamSpace*pixelRatio;
58614
58551
  var textWidth=this.Canvas.measureText(text).width+space;
58615
58552
  if ((left+textWidth)>right) break;
58616
58553
 
@@ -76186,12 +76123,14 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76186
76123
  var item=option.PopMinuteChart;
76187
76124
  this.PopMinuteChart=new JSPopMinuteChart();
76188
76125
  this.PopMinuteChart.Inital(this, item);
76126
+ this.PopMinuteChart.Create();
76189
76127
  return true;
76190
76128
  }
76191
76129
  else if (option.KLine && option.KLine.KLineDoubleClick===true) //旧的格式 不要使用了
76192
76130
  {
76193
76131
  this.PopMinuteChart=new JSPopMinuteChart();
76194
76132
  this.PopMinuteChart.Inital(this);
76133
+ this.PopMinuteChart.Create();
76195
76134
  return true;
76196
76135
  }
76197
76136
 
@@ -88373,6 +88312,15 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88373
88312
  chart.SetOption(option);
88374
88313
  this.ExtendChartPaint.push(chart);
88375
88314
  return chart;
88315
+ case "背景图":
88316
+ chart=new BackgroundPaint();
88317
+ chart.Canvas=this.Canvas;
88318
+ chart.ChartBorder=this.Frame.ChartBorder;
88319
+ chart.ChartFrame=this.Frame;
88320
+ chart.HQChart=this;
88321
+ chart.SetOption(option);
88322
+ this.ExtendChartPaint.push(chart);
88323
+ return chart;
88376
88324
  default:
88377
88325
  chart=g_ExtendChartPaintFactory.Create(name);
88378
88326
  if (!chart) return null;