hqchart 1.1.14425 → 1.1.14439

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.
@@ -3994,7 +3994,6 @@ if (!JSConsole)
3994
3994
  function JSChart(divElement, bOffscreen, bCacheCanvas)
3995
3995
  {
3996
3996
  this.DivElement=divElement;
3997
- this.DivToolElement=null; //工具条
3998
3997
  this.JSChartContainer; //画图控件
3999
3998
  this.ResizeListener;
4000
3999
 
@@ -4090,6 +4089,7 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4090
4089
  //画布大小通过div获取 如果有style里的大小 使用style里的
4091
4090
  var height=this.DivElement.offsetHeight;
4092
4091
  var width=this.DivElement.offsetWidth;
4092
+ var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率s
4093
4093
  if (this.DivElement.style.height && this.DivElement.style.width)
4094
4094
  {
4095
4095
  if (this.DivElement.style.height.includes("px"))
@@ -4097,21 +4097,12 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4097
4097
  if (this.DivElement.style.width.includes("px"))
4098
4098
  width=parseInt(this.DivElement.style.width.replace("px",""));
4099
4099
  }
4100
-
4101
- if (this.ToolElement)
4102
- {
4103
- //TODO调整工具条大小
4104
- height-=this.ToolElement.style.height.replace("px",""); //减去工具条的高度
4105
- }
4106
4100
 
4107
- this.CanvasElement.height=height;
4108
- this.CanvasElement.width=width;
4109
- this.CanvasElement.style.width=this.CanvasElement.width+'px';
4110
- this.CanvasElement.style.height=this.CanvasElement.height+'px';
4101
+ this.CanvasElement.style.width=`${width}px`;
4102
+ this.CanvasElement.style.height=`${height}px`;
4111
4103
 
4112
- var pixelTatio = GetDevicePixelRatio(); //获取设备的分辨率
4113
- this.CanvasElement.height*=pixelTatio;
4114
- this.CanvasElement.width*=pixelTatio;
4104
+ this.CanvasElement.height=parseInt(pixelTatio*height); //根据分辨率缩放
4105
+ this.CanvasElement.width=parseInt(pixelTatio*width);
4115
4106
 
4116
4107
  if (this.OffscreenCanvasElement)
4117
4108
  {
@@ -9914,6 +9905,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9914
9905
  for(var i=0;i<this.ExtendChartPaint.length;++i)
9915
9906
  {
9916
9907
  var item=this.ExtendChartPaint[i];
9908
+
9917
9909
  if (item.IsCallbackDraw)
9918
9910
  {
9919
9911
  if (["KLineYAxisBGPaint","DepthMapPaint","BackgroundPaint","MinuteBackgroundPaint", "SessionBreaksPaint"].includes(item.ClassName))
@@ -48415,6 +48407,25 @@ function IExtendChartPainting()
48415
48407
  {
48416
48408
  return GetFontHeight(this.Canvas, font, "擎");
48417
48409
  }
48410
+
48411
+ this.SetFillStyle=function(color, x0, y0, x1, y1)
48412
+ {
48413
+ if (Array.isArray(color))
48414
+ {
48415
+ let gradient = this.Canvas.createLinearGradient(x0, y0, x1, y1);
48416
+ var offset=1/(color.length-1);
48417
+ for(var i=0; i<color.length; ++i)
48418
+ {
48419
+ var value=i*offset;
48420
+ gradient.addColorStop(value, color[i]);
48421
+ }
48422
+ this.Canvas.fillStyle=gradient;
48423
+ }
48424
+ else
48425
+ {
48426
+ this.Canvas.fillStyle=color;
48427
+ }
48428
+ }
48418
48429
  }
48419
48430
 
48420
48431
  //K线Tooltip, 显示在左边或右边
@@ -52584,7 +52595,7 @@ function KLineYAxisBGPaint()
52584
52595
  }
52585
52596
 
52586
52597
 
52587
- //背景图 支持横屏
52598
+ //背景图 支持横屏 新版本
52588
52599
  function BackgroundPaint()
52589
52600
  {
52590
52601
  this.newMethod=IExtendChartPainting; //派生
@@ -52596,327 +52607,210 @@ function BackgroundPaint()
52596
52607
  this.IsDynamic=false;
52597
52608
  this.IsCallbackDraw=true; //在回调函数里绘制, 不在Draw()中绘制
52598
52609
 
52610
+ this.IsDrawAllFrame=false; //全部的指标框都画
52611
+ this.SetDrawFrameID=new Set([0]); //指定几个指标框画
52612
+
52599
52613
  this.FrameID=0;
52600
- this.Data; //背景数据 { Start:, End:, Color:[] }
52614
+ this.Data; //背景数据[ { Start:{ Date:, Time: }, End:{ Date:, Time }, Color:['rgb(44,55,255)','rgb(200,55,255)'] }]
52615
+ this.IsShow=true;
52616
+ this.SubFrame=null;
52617
+
52601
52618
  this.ID=Guid(); //唯一的ID
52602
-
52603
- /*
52604
- this.Data=
52605
- [
52606
- { Start:{ Date:20181201 }, End:{ Date:20181230 }, Color:'rgb(44,55,44)' } ,
52607
- { Start:{ Date:20190308 }, End:{ Date:20190404 }, Color:['rgb(44,55,255)','rgb(200,55,255)'] }
52608
- ]
52609
- */
52610
-
52611
- this.ChartSubFrame;
52612
- this.ChartBorder;
52613
- this.KData;
52614
- this.Period;
52615
- this.XPointCount=0;
52619
+ this.HQChart;
52616
52620
 
52617
52621
  this.SetOption=function(option) //设置
52618
52622
  {
52619
- if (option.FrameID>0) this.FrameID=option.FrameID;
52623
+ if (!option) return;
52624
+
52625
+ if (IFrameSplitOperator.IsNumber(option.FrameID)) this.FrameID=option.FrameID;
52620
52626
  if (IFrameSplitOperator.IsObjectExist(option.ID)) this.ID=option.ID;
52627
+ if (IFrameSplitOperator.IsBool(option.IsDrawAllFrame)) this.IsDrawAllFrame=option.IsDrawAllFrame;
52628
+ if (IFrameSplitOperator.IsNonEmptyArray(option.AryFrameID)) this.SetDrawFrameID=new Set(option.AryFrameID);
52621
52629
  }
52622
52630
 
52623
52631
  this.Draw=function()
52624
52632
  {
52625
- if (!this.Data || !this.HQChart) return;
52626
- if (!this.ChartFrame || !this.ChartFrame.SubFrame || this.ChartFrame.SubFrame.length<=this.FrameID) return;
52627
- var klineChart=this.HQChart.ChartPaint[0];
52628
- if (!klineChart || !klineChart.Data) return;
52629
-
52630
- this.ChartSubFrame=this.ChartFrame.SubFrame[this.FrameID].Frame;
52631
- this.ChartBorder=this.ChartSubFrame.ChartBorder;
52632
- this.KData=klineChart.Data;
52633
- this.Period=this.HQChart.Period;
52634
- if (!this.KData || this.KData.Data.length<=0) return;
52635
-
52636
- var isHScreen=(this.ChartSubFrame.IsHScreen===true);
52637
- this.XPointCount=this.ChartSubFrame.XPointCount;
52638
- var xPointCount=this.ChartSubFrame.XPointCount;
52639
-
52640
- var firstKItem=this.KData.Data[this.KData.DataOffset];
52641
- var endIndex=this.KData.DataOffset+xPointCount-1;
52642
- if (endIndex>=this.KData.Data.length) endIndex=this.KData.Data.length-1;
52643
- var endKItem=this.KData.Data[endIndex];
52644
- var showData=this.GetShowData(firstKItem,endKItem);
52645
- if (!showData || showData.length<=0) return;
52646
-
52647
- var kLineMap=this.BuildKLineMap();
52648
- var bottom=this.ChartBorder.GetBottomEx();
52649
- var top=this.ChartBorder.GetTopEx();
52650
- var height=this.ChartBorder.GetHeightEx();
52651
- if (isHScreen)
52633
+ this.SubFrame=null;
52634
+
52635
+ if (this.FrameID<0) return;
52636
+ if (!this.HQChart) return;
52637
+ if (!this.ChartFrame || !IFrameSplitOperator.IsNonEmptyArray(this.ChartFrame.SubFrame)) return;
52638
+ if (!this.IsShow) return;
52639
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Data)) return;
52640
+ if (!this.ChartFrame.SubFrame[this.FrameID]) return;
52641
+ this.SubFrame=this.ChartFrame.SubFrame[this.FrameID].Frame;
52642
+ if (!this.SubFrame) return;
52643
+
52644
+ var kData=this.HQChart.GetKData();
52645
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return;
52646
+
52647
+ var bHScreen=(this.SubFrame.IsHScreen===true);
52648
+ this.IsHScreen=bHScreen;
52649
+ var isMinute=this.SubFrame.IsMinuteFrame();
52650
+ var dataWidth=this.SubFrame.DataWidth;
52651
+ var distanceWidth=this.SubFrame.DistanceWidth;
52652
+ var xPointCount=this.SubFrame.XPointCount;
52653
+
52654
+ var border=this.SubFrame.GetBorder();
52655
+ if (bHScreen)
52652
52656
  {
52653
- top=this.ChartBorder.GetRightEx();
52654
- bottom=this.ChartBorder.GetLeftEx();
52655
- height=this.ChartBorder.GetWidthEx();
52657
+ var chartright=border.BottomEx;
52658
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52659
+ }
52660
+ else
52661
+ {
52662
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52663
+ var chartright=border.RightEx;
52656
52664
  }
52657
52665
 
52658
- for(var i in showData)
52666
+ var mapBG=new Map(); //key= index, Value={ Start:{Left, Center, Right, Item:}, End:{ Left, Center, Right, Item:} }
52667
+ var startIndex=kData.DataOffset;
52668
+ for(var i=startIndex,j=0;i<kData.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
52659
52669
  {
52660
- var item=showData[i];
52661
- var rt=this.GetBGCoordinate(item,kLineMap);
52662
- if (!rt) continue;
52670
+ var kItem=kData.Data[i];
52671
+ var aryFind=this.FindMatchData(kItem);
52672
+ if (!aryFind) continue;
52663
52673
 
52664
- if (Array.isArray(item.Color))
52674
+ if (isMinute)
52665
52675
  {
52666
- var gradient;
52667
- if (isHScreen) gradient = this.Canvas.createLinearGradient(bottom,rt.Left, top, rt.Left);
52668
- else gradient = this.Canvas.createLinearGradient(rt.Left,top, rt.Left,bottom);
52669
- var offset=1/item.Color.length;
52670
- for(var i in item.Color)
52671
- {
52672
- gradient.addColorStop(i*offset, item.Color[i]);
52673
- }
52674
- this.Canvas.fillStyle=gradient;
52676
+ var x=this.ChartFrame.GetXFromIndex(j);
52677
+ var left=x;
52678
+ var right=x;
52675
52679
  }
52676
52680
  else
52677
52681
  {
52678
- this.Canvas.fillStyle=item.Color;
52682
+ var left=xOffset;
52683
+ var right=xOffset+dataWidth;
52684
+ var x=left+(right-left)/2;
52679
52685
  }
52680
52686
 
52681
- if (isHScreen) this.Canvas.fillRect(ToFixedRect(bottom),ToFixedRect(rt.Left),ToFixedRect(height),ToFixedRect(rt.Width));
52682
- else this.Canvas.fillRect(ToFixedRect(rt.Left),ToFixedRect(top),ToFixedRect(rt.Width),ToFixedRect(height));
52687
+ for(var k=0;k<aryFind.length;++k)
52688
+ {
52689
+ var findItem=aryFind[k];
52690
+ if (mapBG.has(findItem.Index))
52691
+ {
52692
+ var bgItem=mapBG.get(findItem.Index);
52693
+ bgItem.End.Left=left;
52694
+ bgItem.End.Right=right;
52695
+ bgItem.End.Item=findItem.Item;
52696
+ }
52697
+ else
52698
+ {
52699
+ mapBG.set(findItem.Index, { Item:findItem.Item, Start:{ Left:left, Right:right, Item:findItem.Item }, End:{ Left:left, Right:right, Item:findItem.Item }})
52700
+ }
52701
+ }
52702
+ }
52703
+
52704
+ if (mapBG.size>0)
52705
+ {
52706
+ this.Canvas.save();
52707
+ //this.ClipClient(bHScreen);
52708
+
52709
+ this.DrawBG(mapBG);
52710
+
52711
+ this.Canvas.restore();
52683
52712
  }
52684
52713
  }
52685
52714
 
52686
- this.GetShowData=function(first, end)
52715
+ this.FindMatchData=function(kItem)
52687
52716
  {
52688
- if (!IFrameSplitOperator.IsNonEmptyArray(this.Data)) return null;
52689
-
52690
- var aryData=[];
52717
+ var aryFind=[];
52691
52718
  for(var i=0;i<this.Data.length;++i)
52692
52719
  {
52693
52720
  var item=this.Data[i];
52694
- var showItem={ };
52695
- if (item.Start.Date>=first.Date && item.Start.Date<=end.Date) showItem.Start=item.Start;
52696
- if (item.End.Date>=first.Date && item.End.Date<=end.Date) showItem.End=item.End;
52697
-
52698
- if (item.Start.Date<first.Date && item.End.Date>end.Date)
52721
+ var start=item.Start;
52722
+ var end=item.End;
52723
+ var bMatch=false;
52724
+ if (IFrameSplitOperator.IsNumber(kItem.Date) && IFrameSplitOperator.IsNumber(kItem.Time))
52699
52725
  {
52700
- showItem.Start=first;
52701
- showItem.End=end;
52726
+ if (kItem.Date>start.Date && kItem.Date<end.Date)
52727
+ {
52728
+ bMatch=true;
52729
+ }
52730
+ else if (kItem.Date==start.Date && kItem.Date==end.Date)
52731
+ {
52732
+ if (kItem.Time>=start.Time && kItem.Time<=end.Time)bMatch=true;
52733
+ }
52734
+ else if (kItem.Date==start.Date)
52735
+ {
52736
+ if (kItem.Time>=start.Time) bMatch=true;
52737
+ }
52738
+ else if (kItem.Date==end.Date)
52739
+ {
52740
+ if ((kItem.Time<=end.Time)) bMatch=true;
52741
+ }
52702
52742
  }
52703
-
52704
-
52705
- if (showItem.Start || showItem.End)
52743
+ else if (IFrameSplitOperator.IsNumber(kItem.Date) && !IFrameSplitOperator.IsNumber(kItem.Time))
52706
52744
  {
52707
- showItem.Color=item.Color;
52708
- aryData.push(showItem);
52745
+ if (kItem.Date>=start.Date && kItem.Date<=end.Date) bMatch=true;
52709
52746
  }
52747
+
52748
+ if (bMatch) aryFind.push({ Index:i, Item:item });
52710
52749
  }
52711
52750
 
52712
- //JSConsole.Chart.Log('[BackgroundPaint::GetShowData] aryData ', aryData);
52713
- return aryData;
52751
+ if (aryFind.Length<=0) return null;
52752
+
52753
+ return aryFind;
52714
52754
  }
52715
52755
 
52716
- this.BuildKLineMap=function()
52756
+ this.DrawBG=function(mapBG)
52717
52757
  {
52718
- var isHScreen=(this.ChartSubFrame.IsHScreen===true);
52719
- var dataWidth=this.ChartSubFrame.DataWidth;
52720
- var distanceWidth=this.ChartSubFrame.DistanceWidth;
52721
- var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52722
- if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52723
- var chartright=this.ChartBorder.GetRight();
52724
- if (isHScreen) chartright=this.ChartBorder.GetBottom();
52725
-
52726
- var mapKLine={ Data:new Map() ,Start:null, End:null } ; //Key: date / date time, Value:索引
52727
- for(var i=this.KData.DataOffset,j=0; i<this.KData.Data.length && j<this.XPointCount; ++i,++j,xOffset+=(dataWidth+distanceWidth))
52758
+ for(var mapItem of mapBG)
52728
52759
  {
52729
- var kItem=this.KData.Data[i];
52730
- var left=xOffset;
52731
- var right=xOffset+dataWidth;
52732
- if (right>chartright) break;
52733
- var x=left+(right-left)/2;
52734
-
52735
- if (j==0) mapKLine.XLeft=left;
52736
- mapKLine.XRight=right;
52737
-
52738
- var value={ Index:i, ShowIndex:j , X:x, Right:right, Left:left, Date:kItem.Date };
52739
- if (ChartData.IsMinutePeriod(this.Period,true))
52740
- {
52741
- var key=`Date:${kItem.Date} Time:${kItem.Time}`;
52742
- value.Time=kItem.Time;
52743
- }
52744
- else
52760
+ var bgItem=mapItem[1];
52761
+ //this.DrawBGItem(this.SubFrame, bgItem);
52762
+
52763
+ for(var i=0;i<this.ChartFrame.SubFrame.length;++i)
52745
52764
  {
52746
- var key=`Date:${kItem.Date}`;
52765
+ var subFrame=this.ChartFrame.SubFrame[i].Frame;
52766
+ if (this.IsDrawAllFrame || this.SetDrawFrameID.has(i))
52767
+ {
52768
+ this.DrawBGItem(subFrame, bgItem);
52769
+ }
52747
52770
  }
52748
-
52749
- mapKLine.Data.set(key,value);
52750
-
52751
- //保存下起始和结束位置
52752
- if (j==0) mapKLine.Start=value;
52753
- mapKLine.End=value;
52754
52771
  }
52755
-
52756
- return mapKLine;
52757
52772
  }
52758
52773
 
52759
- this.GetBGCoordinate=function(item,kLineMap)
52774
+ this.DrawBGItem=function(frame, bgItem)
52760
52775
  {
52761
- var xLeft=null, xRight=null;
52762
- var isMinutePeriod=ChartData.IsMinutePeriod(this.Period,true);
52763
- var bSingleDate=false;
52764
- //JSConsole.Chart.Log('[BackgroundPaint::GetBGCoordinate] item ', item);
52765
- if (isMinutePeriod)
52766
- {
52767
- if (item.Start && item.End && item.Start.Date==item.End.Date && item.Start.Time==item.End.Time) bSingleDate=true;
52768
- }
52769
- else
52770
- {
52771
- if (item.Start && item.End && item.Start.Date==item.End.Date) bSingleDate=true;
52772
- }
52773
-
52774
- if (bSingleDate)
52775
- {
52776
- if (isMinutePeriod)
52777
- var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;
52778
- else
52779
- var key=`Date:${item.Start.Date}`;
52780
-
52781
- if (!kLineMap.Data.has(key)) return null;
52782
- var findItem=kLineMap.Data.get(key);
52783
- xLeft=findItem.Left;
52784
- xRight=findItem.Right;
52785
- return { Left:xLeft, Right:xRight, Width:xRight-xLeft };
52786
- }
52787
-
52788
- if (item.Start)
52776
+ var border=frame.GetBorder();
52777
+ if (this.IsHScreen)
52789
52778
  {
52790
- if (isMinutePeriod)
52791
- var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;
52792
- else
52793
- var key=`Date:${item.Start.Date}`;
52794
-
52795
- if (kLineMap.Data.has(key))
52796
- {
52797
- var findItem=kLineMap.Data.get(key);
52798
- xLeft=findItem.Left;
52799
- }
52800
- else
52801
- {
52802
- if (isMinutePeriod)
52803
- {
52804
- if (item.Start.Date<kLineMap.Start.Date || (item.Start.Date==kLineMap.Start.Date && item.Start.Time<=kLineMap.Start.Time) )
52805
- {
52806
- xLeft=kLineMap.Start.Left;
52807
- }
52808
- else
52809
- {
52810
- for(var kItem of kLineMap.Data)
52811
- {
52812
- var value=kItem[1];
52813
- if (value.Date>item.Start.Date || (value.Date==item.Start.Date && value.Time>item.Start.Time))
52814
- {
52815
- xLeft=value.Left;
52816
- break;
52817
- }
52818
- }
52819
- }
52820
- }
52821
- else
52822
- {
52823
- if (item.Start.Date<=kLineMap.Start.Date)
52824
- {
52825
- xLeft=kLineMap.Start.Left;
52826
- }
52827
- else
52828
- {
52829
- for(var kItem of kLineMap.Data)
52830
- {
52831
- var value=kItem[1];
52832
- if (value.Date>item.Start.Date)
52833
- {
52834
- xLeft=value.Left;
52835
- break;
52836
- }
52837
- }
52838
- }
52839
- }
52840
- }
52779
+ var top=border.RightEx;
52780
+ var bottom=border.LeftEx;
52781
+ var left=border.Top;
52841
52782
  }
52842
52783
  else
52843
52784
  {
52844
- xLeft=kLineMap.XLeft;
52785
+ var top=border.TopEx;
52786
+ var bottom=border.BottomEx;
52787
+ var left=border.Left;
52845
52788
  }
52846
52789
 
52847
- if (item.End)
52790
+ if (this.IsHScreen)
52848
52791
  {
52849
- if (isMinutePeriod)
52850
- var key=`Date:${item.End.Date} Time:${item.End.Time}`;
52851
- else
52852
- var key=`Date:${item.End.Date}`;
52853
-
52854
- if (kLineMap.Data.has(key))
52855
- {
52856
- var findItem=kLineMap.Data.get(key);
52857
- xRight=findItem.Right;
52858
- }
52859
- else
52860
- {
52861
- if (isMinutePeriod)
52862
- {
52863
- if (item.End.Date<kLineMap.Start.Date || (item.End.Date==kLineMap.Start.Date && item.End.Time<kLineMap.Start.Time)) return null;
52864
-
52865
- if (item.End.Date<kLineMap.End.Date || (item.End.Date==kLineMap.End.Date && item.End.Time>=kLineMap.End.Time) )
52866
- {
52867
- xRight=kLineMap.End.Right;
52868
- }
52869
- else
52870
- {
52871
- var previousX=null;
52872
- for(var kItem of kLineMap.Data)
52873
- {
52874
- var value=kItem[1];
52875
- if (value.Date>item.End.Date || (value.Date==item.End.Date && value.Time>item.End.Time) )
52876
- {
52877
- xRight=previousX;
52878
- break;
52879
- }
52880
- previousX=value.Right;
52881
- }
52882
- }
52883
- }
52884
- else
52885
- {
52886
- if (item.End.Date<kLineMap.Start.Date) return null;
52887
-
52888
- if (item.End.Date<=kLineMap.End.Date)
52889
- {
52890
- xRight=kLineMap.End.Right;
52891
- }
52892
- else
52893
- {
52894
- var previousX=null;
52895
- for(var kItem of kLineMap.Data)
52896
- {
52897
- var value=kItem[1];
52898
- if (value.Date>item.End.Date)
52899
- {
52900
- xRight=previousX;
52901
- break;
52902
- }
52903
- previousX=value.Right;
52904
- }
52905
- }
52906
- }
52907
- }
52792
+ this.SetFillStyle(bgItem.Item.Color,top,left,bottom,left);
52793
+ var start=bgItem.Start;
52794
+ var end=bgItem.End;
52795
+ var rtBG={ Left:bottom, Right:top, Top:start.Left, Bottom:end.Right };
52796
+ rtBG.Width=rtBG.Right-rtBG.Left;
52797
+ rtBG.Height=rtBG.Bottom-rtBG.Top;
52798
+ this.Canvas.fillRect(ToFixedRect(rtBG.Left),ToFixedRect(rtBG.Top),ToFixedRect(rtBG.Width),ToFixedRect(rtBG.Height));
52908
52799
  }
52909
52800
  else
52910
52801
  {
52911
- xRight=kLineMap.XRight;
52802
+ this.SetFillStyle(bgItem.Item.Color, left,top, left,bottom);
52803
+ var start=bgItem.Start;
52804
+ var end=bgItem.End;
52805
+ var rtBG={ Left:start.Left, Right:end.Right, Top:top, Bottom:bottom };
52806
+ rtBG.Width=rtBG.Right-rtBG.Left;
52807
+ rtBG.Height=rtBG.Bottom-rtBG.Top;
52808
+ this.Canvas.fillRect(ToFixedRect(rtBG.Left),ToFixedRect(rtBG.Top),ToFixedRect(rtBG.Width),ToFixedRect(rtBG.Height));
52912
52809
  }
52913
-
52914
- if (xLeft==null || xRight==null) return null;
52915
-
52916
- return { Left:xLeft, Right:xRight, Width:xRight-xLeft };
52917
52810
  }
52918
52811
  }
52919
52812
 
52813
+
52920
52814
  function MinuteBackgroundPaint()
52921
52815
  {
52922
52816
  this.newMethod=IExtendChartPainting; //派生
@@ -62516,7 +62410,7 @@ function DynamicChartTitlePainting()
62516
62410
  var left=positionInfo.Left;
62517
62411
  var right=positionInfo.Right;
62518
62412
  var bottom=positionInfo.Bottom;
62519
-
62413
+ var pixelRatio=GetDevicePixelRatio();
62520
62414
  for(var i=0; i<this.Data.length; ++i)
62521
62415
  {
62522
62416
  var item=this.Data[i];
@@ -62535,7 +62429,9 @@ function DynamicChartTitlePainting()
62535
62429
  if (titleItem.Name) text=titleItem.Name+":"+titleItem.Text;
62536
62430
  else text=titleItem.Text;
62537
62431
 
62538
- var space=this.ParamSpace*GetDevicePixelRatio();
62432
+ if (IFrameSplitOperator.IsNumber(titleItem.LeftSpace)) left+=titleItem.LeftSpace*pixelRatio;
62433
+
62434
+ var space=this.ParamSpace*pixelRatio;
62539
62435
  var indexTextWidth=this.Canvas.measureText(text).width; //标题+数值长度
62540
62436
  var textWidth=indexTextWidth;
62541
62437
 
@@ -62611,7 +62507,7 @@ function DynamicChartTitlePainting()
62611
62507
  if (dyTitle) text=dyTitle+":"+valueText;
62612
62508
  else text=item.Name+":"+valueText;
62613
62509
  }
62614
- var space=this.ParamSpace*GetDevicePixelRatio();
62510
+ var space=this.ParamSpace*pixelRatio;
62615
62511
  var textWidth=this.Canvas.measureText(text).width+space;
62616
62512
  if ((left+textWidth)>right) break;
62617
62513
 
@@ -80187,12 +80083,14 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80187
80083
  var item=option.PopMinuteChart;
80188
80084
  this.PopMinuteChart=new JSPopMinuteChart();
80189
80085
  this.PopMinuteChart.Inital(this, item);
80086
+ this.PopMinuteChart.Create();
80190
80087
  return true;
80191
80088
  }
80192
80089
  else if (option.KLine && option.KLine.KLineDoubleClick===true) //旧的格式 不要使用了
80193
80090
  {
80194
80091
  this.PopMinuteChart=new JSPopMinuteChart();
80195
80092
  this.PopMinuteChart.Inital(this);
80093
+ this.PopMinuteChart.Create();
80196
80094
  return true;
80197
80095
  }
80198
80096
 
@@ -83774,6 +83672,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
83774
83672
  chart.SetOption(option);
83775
83673
  this.ExtendChartPaint.push(chart);
83776
83674
  return chart;
83675
+ case "BackgroundPaint":
83777
83676
  case '背景图':
83778
83677
  chart=new BackgroundPaint();
83779
83678
  chart.Canvas=this.Canvas;
@@ -92374,6 +92273,16 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
92374
92273
  chart.SetOption(option);
92375
92274
  this.ExtendChartPaint.push(chart);
92376
92275
  return chart;
92276
+ case "BackgroundPaint":
92277
+ case "背景图":
92278
+ chart=new BackgroundPaint();
92279
+ chart.Canvas=this.Canvas;
92280
+ chart.ChartBorder=this.Frame.ChartBorder;
92281
+ chart.ChartFrame=this.Frame;
92282
+ chart.HQChart=this;
92283
+ chart.SetOption(option);
92284
+ this.ExtendChartPaint.push(chart);
92285
+ return chart;
92377
92286
  default:
92378
92287
  chart=g_ExtendChartPaintFactory.Create(name);
92379
92288
  if (!chart) return null;
@@ -132624,19 +132533,21 @@ function JSReportChartContainer(uielement)
132624
132533
  }
132625
132534
  break;
132626
132535
  case 38: //up
132627
- var result=this.MoveSelectedRow(-1);
132536
+ var result=this.MoveSelectedRow(-1, {EnablePageCycle: this.PageUpDownCycle});
132628
132537
  if (result)
132629
132538
  {
132630
132539
  if (result.Redraw) this.Draw();
132631
132540
  if (result.Update) this.DelayUpdateStockData();
132541
+ this.MoveSelectedRowEvent(result.OldIndex, result.NewIndex);
132632
132542
  }
132633
132543
  break;
132634
132544
  case 40: //down
132635
- var result=this.MoveSelectedRow(1)
132545
+ var result=this.MoveSelectedRow(1, {EnablePageCycle: this.PageUpDownCycle})
132636
132546
  if (result)
132637
132547
  {
132638
132548
  if (result.Redraw) this.Draw();
132639
132549
  if (result.Update) this.DelayUpdateStockData();
132550
+ this.MoveSelectedRowEvent(result.OldIndex, result.NewIndex);
132640
132551
  }
132641
132552
  break;
132642
132553
  case 37: //left
@@ -133797,13 +133708,19 @@ function JSReportChartContainer(uielement)
133797
133708
  return false;
133798
133709
  }
133799
133710
 
133800
- this.MoveSelectedRow=function(step)
133711
+ // option={ EnablePageCycle: true/false(是否循环翻页) }
133712
+ this.MoveSelectedRow=function(step, option)
133801
133713
  {
133802
133714
  var chart=this.ChartPaint[0];
133803
133715
  if (!chart) return null;
133804
133716
  if (!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return null;
133717
+ var bPageCycle=false;
133718
+ if (option)
133719
+ {
133720
+ if (IFrameSplitOperator.IsBool(option.EnablePageCycle)) bPageCycle=option.EnablePageCycle;
133721
+ }
133805
133722
 
133806
- var result={ Redraw:false, Update:false }; //Redraw=重绘, Update=更新数据
133723
+ var result={ Redraw:false, Update:false, OldIndex:-1, NewIndex:-1 }; //Redraw=重绘, Update=更新数据
133807
133724
 
133808
133725
  if (chart.MultiSelectModel==1)
133809
133726
  {
@@ -133905,6 +133822,7 @@ function JSReportChartContainer(uielement)
133905
133822
  var pageStatus=chart.GetCurrentPageStatus();
133906
133823
  var pageSize=pageStatus.End-pageStatus.Start+1;
133907
133824
  var selected=pageStatus.SelectedRow;
133825
+ result.OldIndex=this.Data.YOffset+selected;
133908
133826
  if (step>0)
133909
133827
  {
133910
133828
  selected+=step;
@@ -133912,6 +133830,7 @@ function JSReportChartContainer(uielement)
133912
133830
  chart.SelectedRow=selected;
133913
133831
  chart.SelectedFixedRow=-1;
133914
133832
  result.Redraw=true;
133833
+ result.NewIndex=this.Data.YOffset+selected;
133915
133834
  return result;
133916
133835
  }
133917
133836
  else if (step<0)
@@ -133925,6 +133844,7 @@ function JSReportChartContainer(uielement)
133925
133844
 
133926
133845
  chart.SelectedRow=selected;
133927
133846
  chart.SelectedFixedRow=-1;
133847
+ result.NewIndex=this.Data.YOffset+selected;
133928
133848
  result.Redraw=true;
133929
133849
  return result;
133930
133850
  }
@@ -133934,18 +133854,23 @@ function JSReportChartContainer(uielement)
133934
133854
  var pageStatus=chart.GetCurrentPageStatus();
133935
133855
  var pageSize=pageStatus.PageSize;
133936
133856
  var selected=pageStatus.SelectedRow;
133857
+ result.OldIndex=pageStatus.SelectedRow;
133937
133858
  if (step>0)
133938
133859
  {
133939
133860
  if (selected<0 || selected<pageStatus.Start || selected>pageStatus.End)
133940
133861
  {
133941
133862
  chart.SelectedRow=pageStatus.Start;
133942
133863
  result.Redraw=true;
133864
+ result.NewIndex=pageStatus.Start;
133943
133865
  return result;
133944
133866
  }
133945
133867
 
133946
133868
  var offset=this.Data.YOffset;
133947
133869
  for(var i=0;i<step;++i)
133948
133870
  {
133871
+ if (selected+1>=this.Data.Data.length && !bPageCycle)
133872
+ break;
133873
+
133949
133874
  ++selected;
133950
133875
  if (selected>pageStatus.End) ++offset;
133951
133876
 
@@ -133961,7 +133886,7 @@ function JSReportChartContainer(uielement)
133961
133886
 
133962
133887
  chart.SelectedRow=selected;
133963
133888
  this.Data.YOffset=offset;
133964
-
133889
+ result.NewIndex=selected;
133965
133890
  return result;
133966
133891
  }
133967
133892
  else if (step<0)
@@ -133970,6 +133895,7 @@ function JSReportChartContainer(uielement)
133970
133895
  {
133971
133896
  chart.SelectedRow=pageStatus.End;
133972
133897
  result.Redraw=true;
133898
+ result.NewIndex=pageStatus.End;
133973
133899
  return result;
133974
133900
  }
133975
133901
 
@@ -133977,6 +133903,9 @@ function JSReportChartContainer(uielement)
133977
133903
  var offset=this.Data.YOffset;
133978
133904
  for(var i=0;i<step;++i)
133979
133905
  {
133906
+ if (selected<=0 && !bPageCycle) //不能循环翻页
133907
+ break;
133908
+
133980
133909
  --selected;
133981
133910
  if (selected<pageStatus.Start) --offset;
133982
133911
 
@@ -133993,6 +133922,7 @@ function JSReportChartContainer(uielement)
133993
133922
 
133994
133923
  chart.SelectedRow=selected;
133995
133924
  this.Data.YOffset=offset;
133925
+ result.NewIndex=selected;
133996
133926
 
133997
133927
  return result;
133998
133928
  }
@@ -134001,6 +133931,36 @@ function JSReportChartContainer(uielement)
134001
133931
  return null;
134002
133932
  }
134003
133933
 
133934
+ this.MoveSelectedRowEvent=function(oldIndex, newIndex)
133935
+ {
133936
+ var chart=this.ChartPaint[0];
133937
+ if (!chart) return null;
133938
+
133939
+ if (oldIndex==newIndex) return;
133940
+
133941
+ var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_MOVE_SELECTED_REPORT_ROW);
133942
+ if (!event || !event.Callback) return;
133943
+
133944
+ if (!IFrameSplitOperator.IsNonEmptyArray(chart.Data.Data)) return;
133945
+ var arySymbol=chart.Data.Data;
133946
+
133947
+ var oldData=null, newData=null;
133948
+ if (oldIndex>=0 && oldIndex<arySymbol.length)
133949
+ {
133950
+ var symbol=arySymbol[oldIndex];
133951
+ oldData={ Symbol:symbol, Index:oldIndex };
133952
+ }
133953
+
133954
+ if (newIndex>=0 && newIndex<arySymbol.length)
133955
+ {
133956
+ var symbol=arySymbol[newIndex];
133957
+ newData={ Symbol:symbol, Index:newIndex };
133958
+ }
133959
+
133960
+ var endData={ Old:oldData, Now:newData };
133961
+ event.Callback(event, endData, this);
133962
+ }
133963
+
134004
133964
  //左右移动
134005
133965
  this.MoveXOffset=function(step)
134006
133966
  {
@@ -148230,6 +148190,13 @@ function JSPopMinuteChart()
148230
148190
  this.Minute.JSChart.ChangeSymbol(data.Symbol);
148231
148191
  }
148232
148192
 
148193
+ if (!this.Minute.Option.EnableResize)
148194
+ {
148195
+ if (this.Minute.JSChart) this.Minute.JSChart.OnSize();
148196
+ }
148197
+
148198
+
148199
+
148233
148200
  //超出窗口调整位置
148234
148201
  var height=this.DivDialog.offsetHeight;
148235
148202
  var width=this.DivDialog.offsetWidth;
@@ -148331,7 +148298,7 @@ JSPopMinuteChart.GetMinuteOption=function()
148331
148298
 
148332
148299
  EnableSelectRect:true,
148333
148300
  EnableZoomIndexWindow:true,
148334
- EnableResize:true,
148301
+ EnableResize:false,
148335
148302
 
148336
148303
  //BeforeOpen:{IsShow:true, Width:120, IsShowMultiDay:true, MulitiDayWidth:100, },
148337
148304
  //AfterClose:{IsShow:true, Width:100, IsShowMultiDay:true, MulitiDayWidth:50, ShareVol:2 }, //ShareVol:0=盘后成交量独立坐标, 1==盘后成交量主图共用 2==盘后成交量盘前共用
@@ -148679,8 +148646,13 @@ function JSPopKeyboard()
148679
148646
  JSChart:null,
148680
148647
  }
148681
148648
 
148682
- this.Inital=function()
148649
+ this.Inital=function(option)
148683
148650
  {
148651
+ if (option)
148652
+ {
148653
+ if (IFrameSplitOperator.IsBool(option.EnableResize)) this.Keyboard.Option.EnableResize=option.EnableResize;
148654
+ }
148655
+
148684
148656
  window.addEventListener('mousedown', (e)=>{ this.OnWindowMouseDown(e)});
148685
148657
  }
148686
148658
 
@@ -148880,6 +148852,11 @@ function JSPopKeyboard()
148880
148852
  {
148881
148853
  if (!this.DivDialog) return;
148882
148854
 
148855
+ if (!this.Keyboard.Option.EnableResize) //自动调整大小
148856
+ {
148857
+ if (this.Keyboard.JSChart) this.Keyboard.JSChart.OnSize();
148858
+ }
148859
+
148883
148860
  //显示在右下方
148884
148861
  var height=this.DivDialog.offsetHeight;
148885
148862
  var width=this.DivDialog.offsetWidth;
@@ -149011,7 +148988,7 @@ JSPopKeyboard.GetOption=function()
149011
148988
  },
149012
148989
 
149013
148990
  BorderLine:1|2|4|8,
149014
- EnableResize:true,
148991
+ EnableResize:false,
149015
148992
 
149016
148993
  //{ Type:列id, Title:标题, TextAlign:文字对齐方式, MaxText:文字最大宽度 , TextColor:文字颜色, Sort:0=不支持排序 1=本地排序 0=远程排序 }
149017
148994
  Column:
@@ -153232,7 +153209,7 @@ function HQChartScriptWorker()
153232
153209
 
153233
153210
 
153234
153211
 
153235
- var HQCHART_VERSION="1.1.14424";
153212
+ var HQCHART_VERSION="1.1.14438";
153236
153213
 
153237
153214
  function PrintHQChartVersion()
153238
153215
  {