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.
@@ -4246,6 +4246,12 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4246
4246
  if (IFrameSplitOperator.IsNumber(item.WheelYMove)) chart.EnableYDrag.WheelYMove=item.WheelYMove;
4247
4247
  }
4248
4248
 
4249
+ if (option.EnableXDrag)
4250
+ {
4251
+ var item=option.EnableXDrag;
4252
+ if (IFrameSplitOperator.IsBool(item.Bottom)) chart.EnableXDrag.Bottom=item.Bottom;
4253
+ }
4254
+
4249
4255
  if (option.KLineTooltip)
4250
4256
  {
4251
4257
  var item=option.KLineTooltip;
@@ -5810,6 +5816,13 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5810
5816
  return [];
5811
5817
  }
5812
5818
 
5819
+ //手动更新指标 aryIndex=[ {ID:主图指标ID, OverlayID:叠加指标ID }] ,option={ Draw:true/false }
5820
+ this.UpdateWindowIndexV2=function(aryIndex, option)
5821
+ {
5822
+ if (this.JSChartContainer && typeof(this.JSChartContainer.UpdateWindowIndexV2)=='function')
5823
+ return this.JSChartContainer.UpdateWindowIndexV2(aryIndex, option);
5824
+ }
5825
+
5813
5826
  this.ChangeInstructionIndex=function(indexName, option)
5814
5827
  {
5815
5828
  if (this.JSChartContainer && typeof(this.JSChartContainer.ChangeInstructionIndex)=='function')
@@ -6981,7 +6994,9 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
6981
6994
  {
6982
6995
  Left:false, Right:false, //是否可以拖拽缩放Y轴最大最小值
6983
6996
  Wheel:false, WheelYMove:5 //是否可以滚轴缩放Y轴最大最小值
6984
- };
6997
+ };
6998
+
6999
+ this.EnableXDrag={ Bottom:true }; //X轴拖动缩放
6985
7000
 
6986
7001
  this.EnableZoomIndexWindow=false; //是否支持双击缩放附图窗口
6987
7002
  this.EnableVerifyRecvData=false; //是否检测接收到的数据
@@ -7817,14 +7832,17 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
7817
7832
 
7818
7833
  var drag=
7819
7834
  {
7820
- "Click":{},
7821
- "LastMove":{}, //最后移动的位置
7835
+ Click:{},
7836
+ LastMove:{}, //最后移动的位置
7822
7837
  CurrentMove:{}, //当前的移动
7838
+ IsInFrameBottom:false,
7823
7839
  };
7824
7840
 
7841
+
7842
+
7825
7843
  drag.Click.X=e.clientX;
7826
7844
  drag.Click.Y=e.clientY;
7827
- drag.Click.IsInFrameBottom=this.Frame.PtInFrameBottom(x,y); //是否点击在X轴上
7845
+ if (this.EnableXDrag.Bottom) drag.Click.IsInFrameBottom=this.Frame.PtInFrameBottom(x,y); //是否点击在X轴上
7828
7846
  drag.LastMove.X=e.clientX;
7829
7847
  drag.LastMove.Y=e.clientY;
7830
7848
 
@@ -9852,6 +9870,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9852
9870
  for(var i=0;i<this.ExtendChartPaint.length;++i)
9853
9871
  {
9854
9872
  var item=this.ExtendChartPaint[i];
9873
+
9855
9874
  if (item.IsCallbackDraw)
9856
9875
  {
9857
9876
  if (["KLineYAxisBGPaint","DepthMapPaint","BackgroundPaint","MinuteBackgroundPaint", "SessionBreaksPaint"].includes(item.ClassName))
@@ -10526,7 +10545,8 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
10526
10545
  }
10527
10546
  }
10528
10547
 
10529
- if (this.ClassName=="KLineChartContainer" && this.Frame.PtInFrameBottom(x,y))
10548
+ //X轴拖动缩放
10549
+ if (this.ClassName=="KLineChartContainer" && this.EnableXDrag.Bottom && this.Frame.PtInFrameBottom(x,y))
10530
10550
  {
10531
10551
  mouseStatus={ Cursor:"ew-resize", Name:"FrameButtom"};
10532
10552
  JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] frame bottom ");
@@ -14498,69 +14518,82 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
14498
14518
  }
14499
14519
  }
14500
14520
 
14501
- this.UpdateWindowIndexV2=function(aryIndex)
14521
+ //手动更新指标 [ {ID:主图指标ID, OverlayID:叠加指标ID }]
14522
+ this.UpdateWindowIndexV2=function(aryIndex, option)
14502
14523
  {
14524
+ if (!this.Frame || !this.Frame.SubFrame) return false;
14525
+
14526
+ var kData=this.GetKData();
14527
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
14528
+
14503
14529
  if (!IFrameSplitOperator.IsNonEmptyArray(aryIndex)) return false;
14504
14530
 
14505
- var aryID=[];
14506
- for(var i=0;i<this.WindowIndex.length;++i)
14531
+ var setMainIndex=new Set(); //主图指标
14532
+ var setOverlayIndex=new Set(); //附图指标
14533
+
14534
+ for(var i=0;aryIndex.length;++i)
14507
14535
  {
14508
- var item=this.WindowIndex[i];
14536
+ var item=aryIndex[i];
14509
14537
  if (!item) continue;
14510
- if (!item.ID) continue;
14511
14538
 
14512
- if (aryIndex.find((element)=>{ return element.ID==item.ID;} ))
14513
- {
14514
- aryID.push(i);
14515
- }
14539
+ if (item.ID) setMainIndex.set(item.ID);
14540
+ if (item.OverlayID) setOverlayIndex.set(item.OverlayID);
14516
14541
  }
14517
14542
 
14518
- if (!IFrameSplitOperator.IsNonEmptyArray(aryID)) return false;
14543
+ if (setMainIndex.size<=0 && setOverlayIndex.size<0) return false;
14519
14544
 
14545
+ //K线数据
14546
+ var bindData=new ChartData();
14547
+ if (kData) bindData.Data=kData.Data;
14520
14548
  if (this.IsKLineContainer()) //K线
14521
14549
  {
14522
- var bindData=new ChartData();
14523
- bindData.Data=this.SourceData.Data;
14524
14550
  bindData.Period=this.Period;
14525
14551
  bindData.Right=this.Right;
14552
+ }
14526
14553
 
14527
- if (this.IsApiPeriod)
14554
+ //主图指标
14555
+ if (setMainIndex.size>0)
14556
+ {
14557
+ for(var i=0;i<this.WindowIndex.length;++i)
14528
14558
  {
14559
+ var item=this.WindowIndex[i];
14560
+ if (!item) continue;
14529
14561
 
14562
+ if (setMainIndex.has(item.ID))
14563
+ {
14564
+ this.BindIndexData(i,bindData);
14565
+ }
14530
14566
  }
14531
- else
14567
+ }
14568
+
14569
+ //叠加指标
14570
+ if (setOverlayIndex.size>0)
14571
+ {
14572
+ for(var i=0;i<this.Frame.SubFrame.length;++i)
14532
14573
  {
14533
- if (bindData.Right>0) //复权
14574
+ var item=this.Frame.SubFrame[i];
14575
+ for(var j=0; j<item.OverlayIndex.length; ++j)
14534
14576
  {
14535
- var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });
14536
- bindData.Data=rightData;
14537
- }
14577
+ var overlayItem=item.OverlayIndex[j];
14538
14578
 
14539
- if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false)) //周期数据
14540
- {
14541
- var periodData=bindData.GetPeriodData(bindData.Period);
14542
- bindData.Data=periodData;
14579
+ if (setOverlayIndex.has(overlayItem.Identify))
14580
+ {
14581
+ this.BindOverlayIndexData(overlayItem,i,hisData)
14582
+ }
14543
14583
  }
14544
14584
  }
14545
14585
  }
14546
- else if (this.IsMinuteContainer()) //分时图
14547
- {
14548
- var bindData=this.SourceData;
14549
- }
14550
- else
14551
- {
14552
- return;
14553
- }
14554
14586
 
14555
-
14556
- for(var i=0;i<aryID.length;++i)
14587
+ var bDraw=true;
14588
+ if (option && option.Draw===false) bDraw=false;
14589
+ if (bDraw)
14557
14590
  {
14558
- this.BindIndexData(aryID[i],bindData)
14591
+ this.UpdataDataoffset(); //更新数据偏移
14592
+ this.UpdateFrameMaxMin(); //调整坐标最大 最小值
14593
+ this.Draw();
14559
14594
  }
14560
14595
 
14561
- this.UpdataDataoffset(); //更新数据偏移
14562
- this.UpdateFrameMaxMin(); //调整坐标最大 最小值
14563
- this.Draw();
14596
+ return true;
14564
14597
  }
14565
14598
 
14566
14599
  this.GetKData=function()
@@ -48339,6 +48372,25 @@ function IExtendChartPainting()
48339
48372
  {
48340
48373
  return GetFontHeight(this.Canvas, font, "擎");
48341
48374
  }
48375
+
48376
+ this.SetFillStyle=function(color, x0, y0, x1, y1)
48377
+ {
48378
+ if (Array.isArray(color))
48379
+ {
48380
+ let gradient = this.Canvas.createLinearGradient(x0, y0, x1, y1);
48381
+ var offset=1/(color.length-1);
48382
+ for(var i=0; i<color.length; ++i)
48383
+ {
48384
+ var value=i*offset;
48385
+ gradient.addColorStop(value, color[i]);
48386
+ }
48387
+ this.Canvas.fillStyle=gradient;
48388
+ }
48389
+ else
48390
+ {
48391
+ this.Canvas.fillStyle=color;
48392
+ }
48393
+ }
48342
48394
  }
48343
48395
 
48344
48396
  //K线Tooltip, 显示在左边或右边
@@ -52508,7 +52560,7 @@ function KLineYAxisBGPaint()
52508
52560
  }
52509
52561
 
52510
52562
 
52511
- //背景图 支持横屏
52563
+ //背景图 支持横屏 新版本
52512
52564
  function BackgroundPaint()
52513
52565
  {
52514
52566
  this.newMethod=IExtendChartPainting; //派生
@@ -52520,327 +52572,210 @@ function BackgroundPaint()
52520
52572
  this.IsDynamic=false;
52521
52573
  this.IsCallbackDraw=true; //在回调函数里绘制, 不在Draw()中绘制
52522
52574
 
52575
+ this.IsDrawAllFrame=false; //全部的指标框都画
52576
+ this.SetDrawFrameID=new Set([0]); //指定几个指标框画
52577
+
52523
52578
  this.FrameID=0;
52524
- this.Data; //背景数据 { Start:, End:, Color:[] }
52579
+ this.Data; //背景数据[ { Start:{ Date:, Time: }, End:{ Date:, Time }, Color:['rgb(44,55,255)','rgb(200,55,255)'] }]
52580
+ this.IsShow=true;
52581
+ this.SubFrame=null;
52582
+
52525
52583
  this.ID=Guid(); //唯一的ID
52526
-
52527
- /*
52528
- this.Data=
52529
- [
52530
- { Start:{ Date:20181201 }, End:{ Date:20181230 }, Color:'rgb(44,55,44)' } ,
52531
- { Start:{ Date:20190308 }, End:{ Date:20190404 }, Color:['rgb(44,55,255)','rgb(200,55,255)'] }
52532
- ]
52533
- */
52534
-
52535
- this.ChartSubFrame;
52536
- this.ChartBorder;
52537
- this.KData;
52538
- this.Period;
52539
- this.XPointCount=0;
52584
+ this.HQChart;
52540
52585
 
52541
52586
  this.SetOption=function(option) //设置
52542
52587
  {
52543
- if (option.FrameID>0) this.FrameID=option.FrameID;
52588
+ if (!option) return;
52589
+
52590
+ if (IFrameSplitOperator.IsNumber(option.FrameID)) this.FrameID=option.FrameID;
52544
52591
  if (IFrameSplitOperator.IsObjectExist(option.ID)) this.ID=option.ID;
52592
+ if (IFrameSplitOperator.IsBool(option.IsDrawAllFrame)) this.IsDrawAllFrame=option.IsDrawAllFrame;
52593
+ if (IFrameSplitOperator.IsNonEmptyArray(option.AryFrameID)) this.SetDrawFrameID=new Set(option.AryFrameID);
52545
52594
  }
52546
52595
 
52547
52596
  this.Draw=function()
52548
52597
  {
52549
- if (!this.Data || !this.HQChart) return;
52550
- if (!this.ChartFrame || !this.ChartFrame.SubFrame || this.ChartFrame.SubFrame.length<=this.FrameID) return;
52551
- var klineChart=this.HQChart.ChartPaint[0];
52552
- if (!klineChart || !klineChart.Data) return;
52553
-
52554
- this.ChartSubFrame=this.ChartFrame.SubFrame[this.FrameID].Frame;
52555
- this.ChartBorder=this.ChartSubFrame.ChartBorder;
52556
- this.KData=klineChart.Data;
52557
- this.Period=this.HQChart.Period;
52558
- if (!this.KData || this.KData.Data.length<=0) return;
52559
-
52560
- var isHScreen=(this.ChartSubFrame.IsHScreen===true);
52561
- this.XPointCount=this.ChartSubFrame.XPointCount;
52562
- var xPointCount=this.ChartSubFrame.XPointCount;
52563
-
52564
- var firstKItem=this.KData.Data[this.KData.DataOffset];
52565
- var endIndex=this.KData.DataOffset+xPointCount-1;
52566
- if (endIndex>=this.KData.Data.length) endIndex=this.KData.Data.length-1;
52567
- var endKItem=this.KData.Data[endIndex];
52568
- var showData=this.GetShowData(firstKItem,endKItem);
52569
- if (!showData || showData.length<=0) return;
52570
-
52571
- var kLineMap=this.BuildKLineMap();
52572
- var bottom=this.ChartBorder.GetBottomEx();
52573
- var top=this.ChartBorder.GetTopEx();
52574
- var height=this.ChartBorder.GetHeightEx();
52575
- if (isHScreen)
52598
+ this.SubFrame=null;
52599
+
52600
+ if (this.FrameID<0) return;
52601
+ if (!this.HQChart) return;
52602
+ if (!this.ChartFrame || !IFrameSplitOperator.IsNonEmptyArray(this.ChartFrame.SubFrame)) return;
52603
+ if (!this.IsShow) return;
52604
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Data)) return;
52605
+ if (!this.ChartFrame.SubFrame[this.FrameID]) return;
52606
+ this.SubFrame=this.ChartFrame.SubFrame[this.FrameID].Frame;
52607
+ if (!this.SubFrame) return;
52608
+
52609
+ var kData=this.HQChart.GetKData();
52610
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return;
52611
+
52612
+ var bHScreen=(this.SubFrame.IsHScreen===true);
52613
+ this.IsHScreen=bHScreen;
52614
+ var isMinute=this.SubFrame.IsMinuteFrame();
52615
+ var dataWidth=this.SubFrame.DataWidth;
52616
+ var distanceWidth=this.SubFrame.DistanceWidth;
52617
+ var xPointCount=this.SubFrame.XPointCount;
52618
+
52619
+ var border=this.SubFrame.GetBorder();
52620
+ if (bHScreen)
52576
52621
  {
52577
- top=this.ChartBorder.GetRightEx();
52578
- bottom=this.ChartBorder.GetLeftEx();
52579
- height=this.ChartBorder.GetWidthEx();
52622
+ var chartright=border.BottomEx;
52623
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52624
+ }
52625
+ else
52626
+ {
52627
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52628
+ var chartright=border.RightEx;
52580
52629
  }
52581
52630
 
52582
- for(var i in showData)
52631
+ var mapBG=new Map(); //key= index, Value={ Start:{Left, Center, Right, Item:}, End:{ Left, Center, Right, Item:} }
52632
+ var startIndex=kData.DataOffset;
52633
+ for(var i=startIndex,j=0;i<kData.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
52583
52634
  {
52584
- var item=showData[i];
52585
- var rt=this.GetBGCoordinate(item,kLineMap);
52586
- if (!rt) continue;
52635
+ var kItem=kData.Data[i];
52636
+ var aryFind=this.FindMatchData(kItem);
52637
+ if (!aryFind) continue;
52587
52638
 
52588
- if (Array.isArray(item.Color))
52639
+ if (isMinute)
52589
52640
  {
52590
- var gradient;
52591
- if (isHScreen) gradient = this.Canvas.createLinearGradient(bottom,rt.Left, top, rt.Left);
52592
- else gradient = this.Canvas.createLinearGradient(rt.Left,top, rt.Left,bottom);
52593
- var offset=1/item.Color.length;
52594
- for(var i in item.Color)
52595
- {
52596
- gradient.addColorStop(i*offset, item.Color[i]);
52597
- }
52598
- this.Canvas.fillStyle=gradient;
52641
+ var x=this.ChartFrame.GetXFromIndex(j);
52642
+ var left=x;
52643
+ var right=x;
52599
52644
  }
52600
52645
  else
52601
52646
  {
52602
- this.Canvas.fillStyle=item.Color;
52647
+ var left=xOffset;
52648
+ var right=xOffset+dataWidth;
52649
+ var x=left+(right-left)/2;
52650
+ }
52651
+
52652
+ for(var k=0;k<aryFind.length;++k)
52653
+ {
52654
+ var findItem=aryFind[k];
52655
+ if (mapBG.has(findItem.Index))
52656
+ {
52657
+ var bgItem=mapBG.get(findItem.Index);
52658
+ bgItem.End.Left=left;
52659
+ bgItem.End.Right=right;
52660
+ bgItem.End.Item=findItem.Item;
52661
+ }
52662
+ else
52663
+ {
52664
+ mapBG.set(findItem.Index, { Item:findItem.Item, Start:{ Left:left, Right:right, Item:findItem.Item }, End:{ Left:left, Right:right, Item:findItem.Item }})
52665
+ }
52603
52666
  }
52667
+ }
52604
52668
 
52605
- if (isHScreen) this.Canvas.fillRect(ToFixedRect(bottom),ToFixedRect(rt.Left),ToFixedRect(height),ToFixedRect(rt.Width));
52606
- else this.Canvas.fillRect(ToFixedRect(rt.Left),ToFixedRect(top),ToFixedRect(rt.Width),ToFixedRect(height));
52669
+ if (mapBG.size>0)
52670
+ {
52671
+ this.Canvas.save();
52672
+ //this.ClipClient(bHScreen);
52673
+
52674
+ this.DrawBG(mapBG);
52675
+
52676
+ this.Canvas.restore();
52607
52677
  }
52608
52678
  }
52609
52679
 
52610
- this.GetShowData=function(first, end)
52680
+ this.FindMatchData=function(kItem)
52611
52681
  {
52612
- if (!IFrameSplitOperator.IsNonEmptyArray(this.Data)) return null;
52613
-
52614
- var aryData=[];
52682
+ var aryFind=[];
52615
52683
  for(var i=0;i<this.Data.length;++i)
52616
52684
  {
52617
52685
  var item=this.Data[i];
52618
- var showItem={ };
52619
- if (item.Start.Date>=first.Date && item.Start.Date<=end.Date) showItem.Start=item.Start;
52620
- if (item.End.Date>=first.Date && item.End.Date<=end.Date) showItem.End=item.End;
52621
-
52622
- if (item.Start.Date<first.Date && item.End.Date>end.Date)
52686
+ var start=item.Start;
52687
+ var end=item.End;
52688
+ var bMatch=false;
52689
+ if (IFrameSplitOperator.IsNumber(kItem.Date) && IFrameSplitOperator.IsNumber(kItem.Time))
52623
52690
  {
52624
- showItem.Start=first;
52625
- showItem.End=end;
52691
+ if (kItem.Date>start.Date && kItem.Date<end.Date)
52692
+ {
52693
+ bMatch=true;
52694
+ }
52695
+ else if (kItem.Date==start.Date && kItem.Date==end.Date)
52696
+ {
52697
+ if (kItem.Time>=start.Time && kItem.Time<=end.Time)bMatch=true;
52698
+ }
52699
+ else if (kItem.Date==start.Date)
52700
+ {
52701
+ if (kItem.Time>=start.Time) bMatch=true;
52702
+ }
52703
+ else if (kItem.Date==end.Date)
52704
+ {
52705
+ if ((kItem.Time<=end.Time)) bMatch=true;
52706
+ }
52626
52707
  }
52627
-
52628
-
52629
- if (showItem.Start || showItem.End)
52708
+ else if (IFrameSplitOperator.IsNumber(kItem.Date) && !IFrameSplitOperator.IsNumber(kItem.Time))
52630
52709
  {
52631
- showItem.Color=item.Color;
52632
- aryData.push(showItem);
52710
+ if (kItem.Date>=start.Date && kItem.Date<=end.Date) bMatch=true;
52633
52711
  }
52712
+
52713
+ if (bMatch) aryFind.push({ Index:i, Item:item });
52634
52714
  }
52635
52715
 
52636
- //JSConsole.Chart.Log('[BackgroundPaint::GetShowData] aryData ', aryData);
52637
- return aryData;
52716
+ if (aryFind.Length<=0) return null;
52717
+
52718
+ return aryFind;
52638
52719
  }
52639
52720
 
52640
- this.BuildKLineMap=function()
52721
+ this.DrawBG=function(mapBG)
52641
52722
  {
52642
- var isHScreen=(this.ChartSubFrame.IsHScreen===true);
52643
- var dataWidth=this.ChartSubFrame.DataWidth;
52644
- var distanceWidth=this.ChartSubFrame.DistanceWidth;
52645
- var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52646
- if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52647
- var chartright=this.ChartBorder.GetRight();
52648
- if (isHScreen) chartright=this.ChartBorder.GetBottom();
52649
-
52650
- var mapKLine={ Data:new Map() ,Start:null, End:null } ; //Key: date / date time, Value:索引
52651
- for(var i=this.KData.DataOffset,j=0; i<this.KData.Data.length && j<this.XPointCount; ++i,++j,xOffset+=(dataWidth+distanceWidth))
52723
+ for(var mapItem of mapBG)
52652
52724
  {
52653
- var kItem=this.KData.Data[i];
52654
- var left=xOffset;
52655
- var right=xOffset+dataWidth;
52656
- if (right>chartright) break;
52657
- var x=left+(right-left)/2;
52658
-
52659
- if (j==0) mapKLine.XLeft=left;
52660
- mapKLine.XRight=right;
52661
-
52662
- var value={ Index:i, ShowIndex:j , X:x, Right:right, Left:left, Date:kItem.Date };
52663
- if (ChartData.IsMinutePeriod(this.Period,true))
52664
- {
52665
- var key=`Date:${kItem.Date} Time:${kItem.Time}`;
52666
- value.Time=kItem.Time;
52667
- }
52668
- else
52725
+ var bgItem=mapItem[1];
52726
+ //this.DrawBGItem(this.SubFrame, bgItem);
52727
+
52728
+ for(var i=0;i<this.ChartFrame.SubFrame.length;++i)
52669
52729
  {
52670
- var key=`Date:${kItem.Date}`;
52730
+ var subFrame=this.ChartFrame.SubFrame[i].Frame;
52731
+ if (this.IsDrawAllFrame || this.SetDrawFrameID.has(i))
52732
+ {
52733
+ this.DrawBGItem(subFrame, bgItem);
52734
+ }
52671
52735
  }
52672
-
52673
- mapKLine.Data.set(key,value);
52674
-
52675
- //保存下起始和结束位置
52676
- if (j==0) mapKLine.Start=value;
52677
- mapKLine.End=value;
52678
52736
  }
52679
-
52680
- return mapKLine;
52681
52737
  }
52682
52738
 
52683
- this.GetBGCoordinate=function(item,kLineMap)
52739
+ this.DrawBGItem=function(frame, bgItem)
52684
52740
  {
52685
- var xLeft=null, xRight=null;
52686
- var isMinutePeriod=ChartData.IsMinutePeriod(this.Period,true);
52687
- var bSingleDate=false;
52688
- //JSConsole.Chart.Log('[BackgroundPaint::GetBGCoordinate] item ', item);
52689
- if (isMinutePeriod)
52690
- {
52691
- if (item.Start && item.End && item.Start.Date==item.End.Date && item.Start.Time==item.End.Time) bSingleDate=true;
52692
- }
52693
- else
52694
- {
52695
- if (item.Start && item.End && item.Start.Date==item.End.Date) bSingleDate=true;
52696
- }
52697
-
52698
- if (bSingleDate)
52699
- {
52700
- if (isMinutePeriod)
52701
- var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;
52702
- else
52703
- var key=`Date:${item.Start.Date}`;
52704
-
52705
- if (!kLineMap.Data.has(key)) return null;
52706
- var findItem=kLineMap.Data.get(key);
52707
- xLeft=findItem.Left;
52708
- xRight=findItem.Right;
52709
- return { Left:xLeft, Right:xRight, Width:xRight-xLeft };
52710
- }
52711
-
52712
- if (item.Start)
52741
+ var border=frame.GetBorder();
52742
+ if (this.IsHScreen)
52713
52743
  {
52714
- if (isMinutePeriod)
52715
- var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;
52716
- else
52717
- var key=`Date:${item.Start.Date}`;
52718
-
52719
- if (kLineMap.Data.has(key))
52720
- {
52721
- var findItem=kLineMap.Data.get(key);
52722
- xLeft=findItem.Left;
52723
- }
52724
- else
52725
- {
52726
- if (isMinutePeriod)
52727
- {
52728
- if (item.Start.Date<kLineMap.Start.Date || (item.Start.Date==kLineMap.Start.Date && item.Start.Time<=kLineMap.Start.Time) )
52729
- {
52730
- xLeft=kLineMap.Start.Left;
52731
- }
52732
- else
52733
- {
52734
- for(var kItem of kLineMap.Data)
52735
- {
52736
- var value=kItem[1];
52737
- if (value.Date>item.Start.Date || (value.Date==item.Start.Date && value.Time>item.Start.Time))
52738
- {
52739
- xLeft=value.Left;
52740
- break;
52741
- }
52742
- }
52743
- }
52744
- }
52745
- else
52746
- {
52747
- if (item.Start.Date<=kLineMap.Start.Date)
52748
- {
52749
- xLeft=kLineMap.Start.Left;
52750
- }
52751
- else
52752
- {
52753
- for(var kItem of kLineMap.Data)
52754
- {
52755
- var value=kItem[1];
52756
- if (value.Date>item.Start.Date)
52757
- {
52758
- xLeft=value.Left;
52759
- break;
52760
- }
52761
- }
52762
- }
52763
- }
52764
- }
52744
+ var top=border.RightEx;
52745
+ var bottom=border.LeftEx;
52746
+ var left=border.Top;
52765
52747
  }
52766
52748
  else
52767
52749
  {
52768
- xLeft=kLineMap.XLeft;
52750
+ var top=border.TopEx;
52751
+ var bottom=border.BottomEx;
52752
+ var left=border.Left;
52769
52753
  }
52770
52754
 
52771
- if (item.End)
52755
+ if (this.IsHScreen)
52772
52756
  {
52773
- if (isMinutePeriod)
52774
- var key=`Date:${item.End.Date} Time:${item.End.Time}`;
52775
- else
52776
- var key=`Date:${item.End.Date}`;
52777
-
52778
- if (kLineMap.Data.has(key))
52779
- {
52780
- var findItem=kLineMap.Data.get(key);
52781
- xRight=findItem.Right;
52782
- }
52783
- else
52784
- {
52785
- if (isMinutePeriod)
52786
- {
52787
- if (item.End.Date<kLineMap.Start.Date || (item.End.Date==kLineMap.Start.Date && item.End.Time<kLineMap.Start.Time)) return null;
52788
-
52789
- if (item.End.Date<kLineMap.End.Date || (item.End.Date==kLineMap.End.Date && item.End.Time>=kLineMap.End.Time) )
52790
- {
52791
- xRight=kLineMap.End.Right;
52792
- }
52793
- else
52794
- {
52795
- var previousX=null;
52796
- for(var kItem of kLineMap.Data)
52797
- {
52798
- var value=kItem[1];
52799
- if (value.Date>item.End.Date || (value.Date==item.End.Date && value.Time>item.End.Time) )
52800
- {
52801
- xRight=previousX;
52802
- break;
52803
- }
52804
- previousX=value.Right;
52805
- }
52806
- }
52807
- }
52808
- else
52809
- {
52810
- if (item.End.Date<kLineMap.Start.Date) return null;
52811
-
52812
- if (item.End.Date<=kLineMap.End.Date)
52813
- {
52814
- xRight=kLineMap.End.Right;
52815
- }
52816
- else
52817
- {
52818
- var previousX=null;
52819
- for(var kItem of kLineMap.Data)
52820
- {
52821
- var value=kItem[1];
52822
- if (value.Date>item.End.Date)
52823
- {
52824
- xRight=previousX;
52825
- break;
52826
- }
52827
- previousX=value.Right;
52828
- }
52829
- }
52830
- }
52831
- }
52757
+ this.SetFillStyle(bgItem.Item.Color,top,left,bottom,left);
52758
+ var start=bgItem.Start;
52759
+ var end=bgItem.End;
52760
+ var rtBG={ Left:bottom, Right:top, Top:start.Left, Bottom:end.Right };
52761
+ rtBG.Width=rtBG.Right-rtBG.Left;
52762
+ rtBG.Height=rtBG.Bottom-rtBG.Top;
52763
+ this.Canvas.fillRect(ToFixedRect(rtBG.Left),ToFixedRect(rtBG.Top),ToFixedRect(rtBG.Width),ToFixedRect(rtBG.Height));
52832
52764
  }
52833
52765
  else
52834
52766
  {
52835
- xRight=kLineMap.XRight;
52767
+ this.SetFillStyle(bgItem.Item.Color, left,top, left,bottom);
52768
+ var start=bgItem.Start;
52769
+ var end=bgItem.End;
52770
+ var rtBG={ Left:start.Left, Right:end.Right, Top:top, Bottom:bottom };
52771
+ rtBG.Width=rtBG.Right-rtBG.Left;
52772
+ rtBG.Height=rtBG.Bottom-rtBG.Top;
52773
+ this.Canvas.fillRect(ToFixedRect(rtBG.Left),ToFixedRect(rtBG.Top),ToFixedRect(rtBG.Width),ToFixedRect(rtBG.Height));
52836
52774
  }
52837
-
52838
- if (xLeft==null || xRight==null) return null;
52839
-
52840
- return { Left:xLeft, Right:xRight, Width:xRight-xLeft };
52841
52775
  }
52842
52776
  }
52843
52777
 
52778
+
52844
52779
  function MinuteBackgroundPaint()
52845
52780
  {
52846
52781
  this.newMethod=IExtendChartPainting; //派生
@@ -62440,7 +62375,7 @@ function DynamicChartTitlePainting()
62440
62375
  var left=positionInfo.Left;
62441
62376
  var right=positionInfo.Right;
62442
62377
  var bottom=positionInfo.Bottom;
62443
-
62378
+ var pixelRatio=GetDevicePixelRatio();
62444
62379
  for(var i=0; i<this.Data.length; ++i)
62445
62380
  {
62446
62381
  var item=this.Data[i];
@@ -62459,7 +62394,9 @@ function DynamicChartTitlePainting()
62459
62394
  if (titleItem.Name) text=titleItem.Name+":"+titleItem.Text;
62460
62395
  else text=titleItem.Text;
62461
62396
 
62462
- var space=this.ParamSpace*GetDevicePixelRatio();
62397
+ if (IFrameSplitOperator.IsNumber(titleItem.LeftSpace)) left+=titleItem.LeftSpace*pixelRatio;
62398
+
62399
+ var space=this.ParamSpace*pixelRatio;
62463
62400
  var indexTextWidth=this.Canvas.measureText(text).width; //标题+数值长度
62464
62401
  var textWidth=indexTextWidth;
62465
62402
 
@@ -62535,7 +62472,7 @@ function DynamicChartTitlePainting()
62535
62472
  if (dyTitle) text=dyTitle+":"+valueText;
62536
62473
  else text=item.Name+":"+valueText;
62537
62474
  }
62538
- var space=this.ParamSpace*GetDevicePixelRatio();
62475
+ var space=this.ParamSpace*pixelRatio;
62539
62476
  var textWidth=this.Canvas.measureText(text).width+space;
62540
62477
  if ((left+textWidth)>right) break;
62541
62478
 
@@ -80111,12 +80048,14 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80111
80048
  var item=option.PopMinuteChart;
80112
80049
  this.PopMinuteChart=new JSPopMinuteChart();
80113
80050
  this.PopMinuteChart.Inital(this, item);
80051
+ this.PopMinuteChart.Create();
80114
80052
  return true;
80115
80053
  }
80116
80054
  else if (option.KLine && option.KLine.KLineDoubleClick===true) //旧的格式 不要使用了
80117
80055
  {
80118
80056
  this.PopMinuteChart=new JSPopMinuteChart();
80119
80057
  this.PopMinuteChart.Inital(this);
80058
+ this.PopMinuteChart.Create();
80120
80059
  return true;
80121
80060
  }
80122
80061
 
@@ -92298,6 +92237,15 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
92298
92237
  chart.SetOption(option);
92299
92238
  this.ExtendChartPaint.push(chart);
92300
92239
  return chart;
92240
+ case "背景图":
92241
+ chart=new BackgroundPaint();
92242
+ chart.Canvas=this.Canvas;
92243
+ chart.ChartBorder=this.Frame.ChartBorder;
92244
+ chart.ChartFrame=this.Frame;
92245
+ chart.HQChart=this;
92246
+ chart.SetOption(option);
92247
+ this.ExtendChartPaint.push(chart);
92248
+ return chart;
92301
92249
  default:
92302
92250
  chart=g_ExtendChartPaintFactory.Create(name);
92303
92251
  if (!chart) return null;
@@ -143405,7 +143353,7 @@ function ScrollBarBGChart()
143405
143353
 
143406
143354
 
143407
143355
 
143408
- var HQCHART_VERSION="1.1.14415";
143356
+ var HQCHART_VERSION="1.1.14431";
143409
143357
 
143410
143358
  function PrintHQChartVersion()
143411
143359
  {