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.
@@ -4290,6 +4290,12 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4290
4290
  if (IFrameSplitOperator.IsNumber(item.WheelYMove)) chart.EnableYDrag.WheelYMove=item.WheelYMove;
4291
4291
  }
4292
4292
 
4293
+ if (option.EnableXDrag)
4294
+ {
4295
+ var item=option.EnableXDrag;
4296
+ if (IFrameSplitOperator.IsBool(item.Bottom)) chart.EnableXDrag.Bottom=item.Bottom;
4297
+ }
4298
+
4293
4299
  if (option.KLineTooltip)
4294
4300
  {
4295
4301
  var item=option.KLineTooltip;
@@ -5854,6 +5860,13 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5854
5860
  return [];
5855
5861
  }
5856
5862
 
5863
+ //手动更新指标 aryIndex=[ {ID:主图指标ID, OverlayID:叠加指标ID }] ,option={ Draw:true/false }
5864
+ this.UpdateWindowIndexV2=function(aryIndex, option)
5865
+ {
5866
+ if (this.JSChartContainer && typeof(this.JSChartContainer.UpdateWindowIndexV2)=='function')
5867
+ return this.JSChartContainer.UpdateWindowIndexV2(aryIndex, option);
5868
+ }
5869
+
5857
5870
  this.ChangeInstructionIndex=function(indexName, option)
5858
5871
  {
5859
5872
  if (this.JSChartContainer && typeof(this.JSChartContainer.ChangeInstructionIndex)=='function')
@@ -7025,7 +7038,9 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
7025
7038
  {
7026
7039
  Left:false, Right:false, //是否可以拖拽缩放Y轴最大最小值
7027
7040
  Wheel:false, WheelYMove:5 //是否可以滚轴缩放Y轴最大最小值
7028
- };
7041
+ };
7042
+
7043
+ this.EnableXDrag={ Bottom:true }; //X轴拖动缩放
7029
7044
 
7030
7045
  this.EnableZoomIndexWindow=false; //是否支持双击缩放附图窗口
7031
7046
  this.EnableVerifyRecvData=false; //是否检测接收到的数据
@@ -7861,14 +7876,17 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
7861
7876
 
7862
7877
  var drag=
7863
7878
  {
7864
- "Click":{},
7865
- "LastMove":{}, //最后移动的位置
7879
+ Click:{},
7880
+ LastMove:{}, //最后移动的位置
7866
7881
  CurrentMove:{}, //当前的移动
7882
+ IsInFrameBottom:false,
7867
7883
  };
7868
7884
 
7885
+
7886
+
7869
7887
  drag.Click.X=e.clientX;
7870
7888
  drag.Click.Y=e.clientY;
7871
- drag.Click.IsInFrameBottom=this.Frame.PtInFrameBottom(x,y); //是否点击在X轴上
7889
+ if (this.EnableXDrag.Bottom) drag.Click.IsInFrameBottom=this.Frame.PtInFrameBottom(x,y); //是否点击在X轴上
7872
7890
  drag.LastMove.X=e.clientX;
7873
7891
  drag.LastMove.Y=e.clientY;
7874
7892
 
@@ -9896,6 +9914,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9896
9914
  for(var i=0;i<this.ExtendChartPaint.length;++i)
9897
9915
  {
9898
9916
  var item=this.ExtendChartPaint[i];
9917
+
9899
9918
  if (item.IsCallbackDraw)
9900
9919
  {
9901
9920
  if (["KLineYAxisBGPaint","DepthMapPaint","BackgroundPaint","MinuteBackgroundPaint", "SessionBreaksPaint"].includes(item.ClassName))
@@ -10570,7 +10589,8 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
10570
10589
  }
10571
10590
  }
10572
10591
 
10573
- if (this.ClassName=="KLineChartContainer" && this.Frame.PtInFrameBottom(x,y))
10592
+ //X轴拖动缩放
10593
+ if (this.ClassName=="KLineChartContainer" && this.EnableXDrag.Bottom && this.Frame.PtInFrameBottom(x,y))
10574
10594
  {
10575
10595
  mouseStatus={ Cursor:"ew-resize", Name:"FrameButtom"};
10576
10596
  JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] frame bottom ");
@@ -14542,69 +14562,82 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
14542
14562
  }
14543
14563
  }
14544
14564
 
14545
- this.UpdateWindowIndexV2=function(aryIndex)
14565
+ //手动更新指标 [ {ID:主图指标ID, OverlayID:叠加指标ID }]
14566
+ this.UpdateWindowIndexV2=function(aryIndex, option)
14546
14567
  {
14568
+ if (!this.Frame || !this.Frame.SubFrame) return false;
14569
+
14570
+ var kData=this.GetKData();
14571
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
14572
+
14547
14573
  if (!IFrameSplitOperator.IsNonEmptyArray(aryIndex)) return false;
14548
14574
 
14549
- var aryID=[];
14550
- for(var i=0;i<this.WindowIndex.length;++i)
14575
+ var setMainIndex=new Set(); //主图指标
14576
+ var setOverlayIndex=new Set(); //附图指标
14577
+
14578
+ for(var i=0;aryIndex.length;++i)
14551
14579
  {
14552
- var item=this.WindowIndex[i];
14580
+ var item=aryIndex[i];
14553
14581
  if (!item) continue;
14554
- if (!item.ID) continue;
14555
14582
 
14556
- if (aryIndex.find((element)=>{ return element.ID==item.ID;} ))
14557
- {
14558
- aryID.push(i);
14559
- }
14583
+ if (item.ID) setMainIndex.set(item.ID);
14584
+ if (item.OverlayID) setOverlayIndex.set(item.OverlayID);
14560
14585
  }
14561
14586
 
14562
- if (!IFrameSplitOperator.IsNonEmptyArray(aryID)) return false;
14587
+ if (setMainIndex.size<=0 && setOverlayIndex.size<0) return false;
14563
14588
 
14589
+ //K线数据
14590
+ var bindData=new ChartData();
14591
+ if (kData) bindData.Data=kData.Data;
14564
14592
  if (this.IsKLineContainer()) //K线
14565
14593
  {
14566
- var bindData=new ChartData();
14567
- bindData.Data=this.SourceData.Data;
14568
14594
  bindData.Period=this.Period;
14569
14595
  bindData.Right=this.Right;
14596
+ }
14570
14597
 
14571
- if (this.IsApiPeriod)
14598
+ //主图指标
14599
+ if (setMainIndex.size>0)
14600
+ {
14601
+ for(var i=0;i<this.WindowIndex.length;++i)
14572
14602
  {
14603
+ var item=this.WindowIndex[i];
14604
+ if (!item) continue;
14573
14605
 
14606
+ if (setMainIndex.has(item.ID))
14607
+ {
14608
+ this.BindIndexData(i,bindData);
14609
+ }
14574
14610
  }
14575
- else
14611
+ }
14612
+
14613
+ //叠加指标
14614
+ if (setOverlayIndex.size>0)
14615
+ {
14616
+ for(var i=0;i<this.Frame.SubFrame.length;++i)
14576
14617
  {
14577
- if (bindData.Right>0) //复权
14618
+ var item=this.Frame.SubFrame[i];
14619
+ for(var j=0; j<item.OverlayIndex.length; ++j)
14578
14620
  {
14579
- var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });
14580
- bindData.Data=rightData;
14581
- }
14621
+ var overlayItem=item.OverlayIndex[j];
14582
14622
 
14583
- if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false)) //周期数据
14584
- {
14585
- var periodData=bindData.GetPeriodData(bindData.Period);
14586
- bindData.Data=periodData;
14623
+ if (setOverlayIndex.has(overlayItem.Identify))
14624
+ {
14625
+ this.BindOverlayIndexData(overlayItem,i,hisData)
14626
+ }
14587
14627
  }
14588
14628
  }
14589
14629
  }
14590
- else if (this.IsMinuteContainer()) //分时图
14591
- {
14592
- var bindData=this.SourceData;
14593
- }
14594
- else
14595
- {
14596
- return;
14597
- }
14598
14630
 
14599
-
14600
- for(var i=0;i<aryID.length;++i)
14631
+ var bDraw=true;
14632
+ if (option && option.Draw===false) bDraw=false;
14633
+ if (bDraw)
14601
14634
  {
14602
- this.BindIndexData(aryID[i],bindData)
14635
+ this.UpdataDataoffset(); //更新数据偏移
14636
+ this.UpdateFrameMaxMin(); //调整坐标最大 最小值
14637
+ this.Draw();
14603
14638
  }
14604
14639
 
14605
- this.UpdataDataoffset(); //更新数据偏移
14606
- this.UpdateFrameMaxMin(); //调整坐标最大 最小值
14607
- this.Draw();
14640
+ return true;
14608
14641
  }
14609
14642
 
14610
14643
  this.GetKData=function()
@@ -48383,6 +48416,25 @@ function IExtendChartPainting()
48383
48416
  {
48384
48417
  return GetFontHeight(this.Canvas, font, "擎");
48385
48418
  }
48419
+
48420
+ this.SetFillStyle=function(color, x0, y0, x1, y1)
48421
+ {
48422
+ if (Array.isArray(color))
48423
+ {
48424
+ let gradient = this.Canvas.createLinearGradient(x0, y0, x1, y1);
48425
+ var offset=1/(color.length-1);
48426
+ for(var i=0; i<color.length; ++i)
48427
+ {
48428
+ var value=i*offset;
48429
+ gradient.addColorStop(value, color[i]);
48430
+ }
48431
+ this.Canvas.fillStyle=gradient;
48432
+ }
48433
+ else
48434
+ {
48435
+ this.Canvas.fillStyle=color;
48436
+ }
48437
+ }
48386
48438
  }
48387
48439
 
48388
48440
  //K线Tooltip, 显示在左边或右边
@@ -52552,7 +52604,7 @@ function KLineYAxisBGPaint()
52552
52604
  }
52553
52605
 
52554
52606
 
52555
- //背景图 支持横屏
52607
+ //背景图 支持横屏 新版本
52556
52608
  function BackgroundPaint()
52557
52609
  {
52558
52610
  this.newMethod=IExtendChartPainting; //派生
@@ -52564,327 +52616,210 @@ function BackgroundPaint()
52564
52616
  this.IsDynamic=false;
52565
52617
  this.IsCallbackDraw=true; //在回调函数里绘制, 不在Draw()中绘制
52566
52618
 
52619
+ this.IsDrawAllFrame=false; //全部的指标框都画
52620
+ this.SetDrawFrameID=new Set([0]); //指定几个指标框画
52621
+
52567
52622
  this.FrameID=0;
52568
- this.Data; //背景数据 { Start:, End:, Color:[] }
52623
+ this.Data; //背景数据[ { Start:{ Date:, Time: }, End:{ Date:, Time }, Color:['rgb(44,55,255)','rgb(200,55,255)'] }]
52624
+ this.IsShow=true;
52625
+ this.SubFrame=null;
52626
+
52569
52627
  this.ID=Guid(); //唯一的ID
52570
-
52571
- /*
52572
- this.Data=
52573
- [
52574
- { Start:{ Date:20181201 }, End:{ Date:20181230 }, Color:'rgb(44,55,44)' } ,
52575
- { Start:{ Date:20190308 }, End:{ Date:20190404 }, Color:['rgb(44,55,255)','rgb(200,55,255)'] }
52576
- ]
52577
- */
52578
-
52579
- this.ChartSubFrame;
52580
- this.ChartBorder;
52581
- this.KData;
52582
- this.Period;
52583
- this.XPointCount=0;
52628
+ this.HQChart;
52584
52629
 
52585
52630
  this.SetOption=function(option) //设置
52586
52631
  {
52587
- if (option.FrameID>0) this.FrameID=option.FrameID;
52632
+ if (!option) return;
52633
+
52634
+ if (IFrameSplitOperator.IsNumber(option.FrameID)) this.FrameID=option.FrameID;
52588
52635
  if (IFrameSplitOperator.IsObjectExist(option.ID)) this.ID=option.ID;
52636
+ if (IFrameSplitOperator.IsBool(option.IsDrawAllFrame)) this.IsDrawAllFrame=option.IsDrawAllFrame;
52637
+ if (IFrameSplitOperator.IsNonEmptyArray(option.AryFrameID)) this.SetDrawFrameID=new Set(option.AryFrameID);
52589
52638
  }
52590
52639
 
52591
52640
  this.Draw=function()
52592
52641
  {
52593
- if (!this.Data || !this.HQChart) return;
52594
- if (!this.ChartFrame || !this.ChartFrame.SubFrame || this.ChartFrame.SubFrame.length<=this.FrameID) return;
52595
- var klineChart=this.HQChart.ChartPaint[0];
52596
- if (!klineChart || !klineChart.Data) return;
52597
-
52598
- this.ChartSubFrame=this.ChartFrame.SubFrame[this.FrameID].Frame;
52599
- this.ChartBorder=this.ChartSubFrame.ChartBorder;
52600
- this.KData=klineChart.Data;
52601
- this.Period=this.HQChart.Period;
52602
- if (!this.KData || this.KData.Data.length<=0) return;
52603
-
52604
- var isHScreen=(this.ChartSubFrame.IsHScreen===true);
52605
- this.XPointCount=this.ChartSubFrame.XPointCount;
52606
- var xPointCount=this.ChartSubFrame.XPointCount;
52607
-
52608
- var firstKItem=this.KData.Data[this.KData.DataOffset];
52609
- var endIndex=this.KData.DataOffset+xPointCount-1;
52610
- if (endIndex>=this.KData.Data.length) endIndex=this.KData.Data.length-1;
52611
- var endKItem=this.KData.Data[endIndex];
52612
- var showData=this.GetShowData(firstKItem,endKItem);
52613
- if (!showData || showData.length<=0) return;
52614
-
52615
- var kLineMap=this.BuildKLineMap();
52616
- var bottom=this.ChartBorder.GetBottomEx();
52617
- var top=this.ChartBorder.GetTopEx();
52618
- var height=this.ChartBorder.GetHeightEx();
52619
- if (isHScreen)
52642
+ this.SubFrame=null;
52643
+
52644
+ if (this.FrameID<0) return;
52645
+ if (!this.HQChart) return;
52646
+ if (!this.ChartFrame || !IFrameSplitOperator.IsNonEmptyArray(this.ChartFrame.SubFrame)) return;
52647
+ if (!this.IsShow) return;
52648
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Data)) return;
52649
+ if (!this.ChartFrame.SubFrame[this.FrameID]) return;
52650
+ this.SubFrame=this.ChartFrame.SubFrame[this.FrameID].Frame;
52651
+ if (!this.SubFrame) return;
52652
+
52653
+ var kData=this.HQChart.GetKData();
52654
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return;
52655
+
52656
+ var bHScreen=(this.SubFrame.IsHScreen===true);
52657
+ this.IsHScreen=bHScreen;
52658
+ var isMinute=this.SubFrame.IsMinuteFrame();
52659
+ var dataWidth=this.SubFrame.DataWidth;
52660
+ var distanceWidth=this.SubFrame.DistanceWidth;
52661
+ var xPointCount=this.SubFrame.XPointCount;
52662
+
52663
+ var border=this.SubFrame.GetBorder();
52664
+ if (bHScreen)
52620
52665
  {
52621
- top=this.ChartBorder.GetRightEx();
52622
- bottom=this.ChartBorder.GetLeftEx();
52623
- height=this.ChartBorder.GetWidthEx();
52666
+ var chartright=border.BottomEx;
52667
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52668
+ }
52669
+ else
52670
+ {
52671
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52672
+ var chartright=border.RightEx;
52624
52673
  }
52625
52674
 
52626
- for(var i in showData)
52675
+ var mapBG=new Map(); //key= index, Value={ Start:{Left, Center, Right, Item:}, End:{ Left, Center, Right, Item:} }
52676
+ var startIndex=kData.DataOffset;
52677
+ for(var i=startIndex,j=0;i<kData.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
52627
52678
  {
52628
- var item=showData[i];
52629
- var rt=this.GetBGCoordinate(item,kLineMap);
52630
- if (!rt) continue;
52679
+ var kItem=kData.Data[i];
52680
+ var aryFind=this.FindMatchData(kItem);
52681
+ if (!aryFind) continue;
52631
52682
 
52632
- if (Array.isArray(item.Color))
52683
+ if (isMinute)
52633
52684
  {
52634
- var gradient;
52635
- if (isHScreen) gradient = this.Canvas.createLinearGradient(bottom,rt.Left, top, rt.Left);
52636
- else gradient = this.Canvas.createLinearGradient(rt.Left,top, rt.Left,bottom);
52637
- var offset=1/item.Color.length;
52638
- for(var i in item.Color)
52639
- {
52640
- gradient.addColorStop(i*offset, item.Color[i]);
52641
- }
52642
- this.Canvas.fillStyle=gradient;
52685
+ var x=this.ChartFrame.GetXFromIndex(j);
52686
+ var left=x;
52687
+ var right=x;
52643
52688
  }
52644
52689
  else
52645
52690
  {
52646
- this.Canvas.fillStyle=item.Color;
52691
+ var left=xOffset;
52692
+ var right=xOffset+dataWidth;
52693
+ var x=left+(right-left)/2;
52647
52694
  }
52648
52695
 
52649
- if (isHScreen) this.Canvas.fillRect(ToFixedRect(bottom),ToFixedRect(rt.Left),ToFixedRect(height),ToFixedRect(rt.Width));
52650
- else this.Canvas.fillRect(ToFixedRect(rt.Left),ToFixedRect(top),ToFixedRect(rt.Width),ToFixedRect(height));
52696
+ for(var k=0;k<aryFind.length;++k)
52697
+ {
52698
+ var findItem=aryFind[k];
52699
+ if (mapBG.has(findItem.Index))
52700
+ {
52701
+ var bgItem=mapBG.get(findItem.Index);
52702
+ bgItem.End.Left=left;
52703
+ bgItem.End.Right=right;
52704
+ bgItem.End.Item=findItem.Item;
52705
+ }
52706
+ else
52707
+ {
52708
+ mapBG.set(findItem.Index, { Item:findItem.Item, Start:{ Left:left, Right:right, Item:findItem.Item }, End:{ Left:left, Right:right, Item:findItem.Item }})
52709
+ }
52710
+ }
52711
+ }
52712
+
52713
+ if (mapBG.size>0)
52714
+ {
52715
+ this.Canvas.save();
52716
+ //this.ClipClient(bHScreen);
52717
+
52718
+ this.DrawBG(mapBG);
52719
+
52720
+ this.Canvas.restore();
52651
52721
  }
52652
52722
  }
52653
52723
 
52654
- this.GetShowData=function(first, end)
52724
+ this.FindMatchData=function(kItem)
52655
52725
  {
52656
- if (!IFrameSplitOperator.IsNonEmptyArray(this.Data)) return null;
52657
-
52658
- var aryData=[];
52726
+ var aryFind=[];
52659
52727
  for(var i=0;i<this.Data.length;++i)
52660
52728
  {
52661
52729
  var item=this.Data[i];
52662
- var showItem={ };
52663
- if (item.Start.Date>=first.Date && item.Start.Date<=end.Date) showItem.Start=item.Start;
52664
- if (item.End.Date>=first.Date && item.End.Date<=end.Date) showItem.End=item.End;
52665
-
52666
- if (item.Start.Date<first.Date && item.End.Date>end.Date)
52730
+ var start=item.Start;
52731
+ var end=item.End;
52732
+ var bMatch=false;
52733
+ if (IFrameSplitOperator.IsNumber(kItem.Date) && IFrameSplitOperator.IsNumber(kItem.Time))
52667
52734
  {
52668
- showItem.Start=first;
52669
- showItem.End=end;
52735
+ if (kItem.Date>start.Date && kItem.Date<end.Date)
52736
+ {
52737
+ bMatch=true;
52738
+ }
52739
+ else if (kItem.Date==start.Date && kItem.Date==end.Date)
52740
+ {
52741
+ if (kItem.Time>=start.Time && kItem.Time<=end.Time)bMatch=true;
52742
+ }
52743
+ else if (kItem.Date==start.Date)
52744
+ {
52745
+ if (kItem.Time>=start.Time) bMatch=true;
52746
+ }
52747
+ else if (kItem.Date==end.Date)
52748
+ {
52749
+ if ((kItem.Time<=end.Time)) bMatch=true;
52750
+ }
52670
52751
  }
52671
-
52672
-
52673
- if (showItem.Start || showItem.End)
52752
+ else if (IFrameSplitOperator.IsNumber(kItem.Date) && !IFrameSplitOperator.IsNumber(kItem.Time))
52674
52753
  {
52675
- showItem.Color=item.Color;
52676
- aryData.push(showItem);
52754
+ if (kItem.Date>=start.Date && kItem.Date<=end.Date) bMatch=true;
52677
52755
  }
52756
+
52757
+ if (bMatch) aryFind.push({ Index:i, Item:item });
52678
52758
  }
52679
52759
 
52680
- //JSConsole.Chart.Log('[BackgroundPaint::GetShowData] aryData ', aryData);
52681
- return aryData;
52760
+ if (aryFind.Length<=0) return null;
52761
+
52762
+ return aryFind;
52682
52763
  }
52683
52764
 
52684
- this.BuildKLineMap=function()
52765
+ this.DrawBG=function(mapBG)
52685
52766
  {
52686
- var isHScreen=(this.ChartSubFrame.IsHScreen===true);
52687
- var dataWidth=this.ChartSubFrame.DataWidth;
52688
- var distanceWidth=this.ChartSubFrame.DistanceWidth;
52689
- var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52690
- if (isHScreen) xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
52691
- var chartright=this.ChartBorder.GetRight();
52692
- if (isHScreen) chartright=this.ChartBorder.GetBottom();
52693
-
52694
- var mapKLine={ Data:new Map() ,Start:null, End:null } ; //Key: date / date time, Value:索引
52695
- for(var i=this.KData.DataOffset,j=0; i<this.KData.Data.length && j<this.XPointCount; ++i,++j,xOffset+=(dataWidth+distanceWidth))
52767
+ for(var mapItem of mapBG)
52696
52768
  {
52697
- var kItem=this.KData.Data[i];
52698
- var left=xOffset;
52699
- var right=xOffset+dataWidth;
52700
- if (right>chartright) break;
52701
- var x=left+(right-left)/2;
52702
-
52703
- if (j==0) mapKLine.XLeft=left;
52704
- mapKLine.XRight=right;
52705
-
52706
- var value={ Index:i, ShowIndex:j , X:x, Right:right, Left:left, Date:kItem.Date };
52707
- if (ChartData.IsMinutePeriod(this.Period,true))
52708
- {
52709
- var key=`Date:${kItem.Date} Time:${kItem.Time}`;
52710
- value.Time=kItem.Time;
52711
- }
52712
- else
52769
+ var bgItem=mapItem[1];
52770
+ //this.DrawBGItem(this.SubFrame, bgItem);
52771
+
52772
+ for(var i=0;i<this.ChartFrame.SubFrame.length;++i)
52713
52773
  {
52714
- var key=`Date:${kItem.Date}`;
52774
+ var subFrame=this.ChartFrame.SubFrame[i].Frame;
52775
+ if (this.IsDrawAllFrame || this.SetDrawFrameID.has(i))
52776
+ {
52777
+ this.DrawBGItem(subFrame, bgItem);
52778
+ }
52715
52779
  }
52716
-
52717
- mapKLine.Data.set(key,value);
52718
-
52719
- //保存下起始和结束位置
52720
- if (j==0) mapKLine.Start=value;
52721
- mapKLine.End=value;
52722
52780
  }
52723
-
52724
- return mapKLine;
52725
52781
  }
52726
52782
 
52727
- this.GetBGCoordinate=function(item,kLineMap)
52783
+ this.DrawBGItem=function(frame, bgItem)
52728
52784
  {
52729
- var xLeft=null, xRight=null;
52730
- var isMinutePeriod=ChartData.IsMinutePeriod(this.Period,true);
52731
- var bSingleDate=false;
52732
- //JSConsole.Chart.Log('[BackgroundPaint::GetBGCoordinate] item ', item);
52733
- if (isMinutePeriod)
52734
- {
52735
- if (item.Start && item.End && item.Start.Date==item.End.Date && item.Start.Time==item.End.Time) bSingleDate=true;
52736
- }
52737
- else
52738
- {
52739
- if (item.Start && item.End && item.Start.Date==item.End.Date) bSingleDate=true;
52740
- }
52741
-
52742
- if (bSingleDate)
52743
- {
52744
- if (isMinutePeriod)
52745
- var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;
52746
- else
52747
- var key=`Date:${item.Start.Date}`;
52748
-
52749
- if (!kLineMap.Data.has(key)) return null;
52750
- var findItem=kLineMap.Data.get(key);
52751
- xLeft=findItem.Left;
52752
- xRight=findItem.Right;
52753
- return { Left:xLeft, Right:xRight, Width:xRight-xLeft };
52754
- }
52755
-
52756
- if (item.Start)
52785
+ var border=frame.GetBorder();
52786
+ if (this.IsHScreen)
52757
52787
  {
52758
- if (isMinutePeriod)
52759
- var key=`Date:${item.Start.Date} Time:${item.Start.Time}`;
52760
- else
52761
- var key=`Date:${item.Start.Date}`;
52762
-
52763
- if (kLineMap.Data.has(key))
52764
- {
52765
- var findItem=kLineMap.Data.get(key);
52766
- xLeft=findItem.Left;
52767
- }
52768
- else
52769
- {
52770
- if (isMinutePeriod)
52771
- {
52772
- if (item.Start.Date<kLineMap.Start.Date || (item.Start.Date==kLineMap.Start.Date && item.Start.Time<=kLineMap.Start.Time) )
52773
- {
52774
- xLeft=kLineMap.Start.Left;
52775
- }
52776
- else
52777
- {
52778
- for(var kItem of kLineMap.Data)
52779
- {
52780
- var value=kItem[1];
52781
- if (value.Date>item.Start.Date || (value.Date==item.Start.Date && value.Time>item.Start.Time))
52782
- {
52783
- xLeft=value.Left;
52784
- break;
52785
- }
52786
- }
52787
- }
52788
- }
52789
- else
52790
- {
52791
- if (item.Start.Date<=kLineMap.Start.Date)
52792
- {
52793
- xLeft=kLineMap.Start.Left;
52794
- }
52795
- else
52796
- {
52797
- for(var kItem of kLineMap.Data)
52798
- {
52799
- var value=kItem[1];
52800
- if (value.Date>item.Start.Date)
52801
- {
52802
- xLeft=value.Left;
52803
- break;
52804
- }
52805
- }
52806
- }
52807
- }
52808
- }
52788
+ var top=border.RightEx;
52789
+ var bottom=border.LeftEx;
52790
+ var left=border.Top;
52809
52791
  }
52810
52792
  else
52811
52793
  {
52812
- xLeft=kLineMap.XLeft;
52794
+ var top=border.TopEx;
52795
+ var bottom=border.BottomEx;
52796
+ var left=border.Left;
52813
52797
  }
52814
52798
 
52815
- if (item.End)
52799
+ if (this.IsHScreen)
52816
52800
  {
52817
- if (isMinutePeriod)
52818
- var key=`Date:${item.End.Date} Time:${item.End.Time}`;
52819
- else
52820
- var key=`Date:${item.End.Date}`;
52821
-
52822
- if (kLineMap.Data.has(key))
52823
- {
52824
- var findItem=kLineMap.Data.get(key);
52825
- xRight=findItem.Right;
52826
- }
52827
- else
52828
- {
52829
- if (isMinutePeriod)
52830
- {
52831
- if (item.End.Date<kLineMap.Start.Date || (item.End.Date==kLineMap.Start.Date && item.End.Time<kLineMap.Start.Time)) return null;
52832
-
52833
- if (item.End.Date<kLineMap.End.Date || (item.End.Date==kLineMap.End.Date && item.End.Time>=kLineMap.End.Time) )
52834
- {
52835
- xRight=kLineMap.End.Right;
52836
- }
52837
- else
52838
- {
52839
- var previousX=null;
52840
- for(var kItem of kLineMap.Data)
52841
- {
52842
- var value=kItem[1];
52843
- if (value.Date>item.End.Date || (value.Date==item.End.Date && value.Time>item.End.Time) )
52844
- {
52845
- xRight=previousX;
52846
- break;
52847
- }
52848
- previousX=value.Right;
52849
- }
52850
- }
52851
- }
52852
- else
52853
- {
52854
- if (item.End.Date<kLineMap.Start.Date) return null;
52855
-
52856
- if (item.End.Date<=kLineMap.End.Date)
52857
- {
52858
- xRight=kLineMap.End.Right;
52859
- }
52860
- else
52861
- {
52862
- var previousX=null;
52863
- for(var kItem of kLineMap.Data)
52864
- {
52865
- var value=kItem[1];
52866
- if (value.Date>item.End.Date)
52867
- {
52868
- xRight=previousX;
52869
- break;
52870
- }
52871
- previousX=value.Right;
52872
- }
52873
- }
52874
- }
52875
- }
52801
+ this.SetFillStyle(bgItem.Item.Color,top,left,bottom,left);
52802
+ var start=bgItem.Start;
52803
+ var end=bgItem.End;
52804
+ var rtBG={ Left:bottom, Right:top, Top:start.Left, Bottom:end.Right };
52805
+ rtBG.Width=rtBG.Right-rtBG.Left;
52806
+ rtBG.Height=rtBG.Bottom-rtBG.Top;
52807
+ this.Canvas.fillRect(ToFixedRect(rtBG.Left),ToFixedRect(rtBG.Top),ToFixedRect(rtBG.Width),ToFixedRect(rtBG.Height));
52876
52808
  }
52877
52809
  else
52878
52810
  {
52879
- xRight=kLineMap.XRight;
52811
+ this.SetFillStyle(bgItem.Item.Color, left,top, left,bottom);
52812
+ var start=bgItem.Start;
52813
+ var end=bgItem.End;
52814
+ var rtBG={ Left:start.Left, Right:end.Right, Top:top, Bottom:bottom };
52815
+ rtBG.Width=rtBG.Right-rtBG.Left;
52816
+ rtBG.Height=rtBG.Bottom-rtBG.Top;
52817
+ this.Canvas.fillRect(ToFixedRect(rtBG.Left),ToFixedRect(rtBG.Top),ToFixedRect(rtBG.Width),ToFixedRect(rtBG.Height));
52880
52818
  }
52881
-
52882
- if (xLeft==null || xRight==null) return null;
52883
-
52884
- return { Left:xLeft, Right:xRight, Width:xRight-xLeft };
52885
52819
  }
52886
52820
  }
52887
52821
 
52822
+
52888
52823
  function MinuteBackgroundPaint()
52889
52824
  {
52890
52825
  this.newMethod=IExtendChartPainting; //派生
@@ -62484,7 +62419,7 @@ function DynamicChartTitlePainting()
62484
62419
  var left=positionInfo.Left;
62485
62420
  var right=positionInfo.Right;
62486
62421
  var bottom=positionInfo.Bottom;
62487
-
62422
+ var pixelRatio=GetDevicePixelRatio();
62488
62423
  for(var i=0; i<this.Data.length; ++i)
62489
62424
  {
62490
62425
  var item=this.Data[i];
@@ -62503,7 +62438,9 @@ function DynamicChartTitlePainting()
62503
62438
  if (titleItem.Name) text=titleItem.Name+":"+titleItem.Text;
62504
62439
  else text=titleItem.Text;
62505
62440
 
62506
- var space=this.ParamSpace*GetDevicePixelRatio();
62441
+ if (IFrameSplitOperator.IsNumber(titleItem.LeftSpace)) left+=titleItem.LeftSpace*pixelRatio;
62442
+
62443
+ var space=this.ParamSpace*pixelRatio;
62507
62444
  var indexTextWidth=this.Canvas.measureText(text).width; //标题+数值长度
62508
62445
  var textWidth=indexTextWidth;
62509
62446
 
@@ -62579,7 +62516,7 @@ function DynamicChartTitlePainting()
62579
62516
  if (dyTitle) text=dyTitle+":"+valueText;
62580
62517
  else text=item.Name+":"+valueText;
62581
62518
  }
62582
- var space=this.ParamSpace*GetDevicePixelRatio();
62519
+ var space=this.ParamSpace*pixelRatio;
62583
62520
  var textWidth=this.Canvas.measureText(text).width+space;
62584
62521
  if ((left+textWidth)>right) break;
62585
62522
 
@@ -80155,12 +80092,14 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80155
80092
  var item=option.PopMinuteChart;
80156
80093
  this.PopMinuteChart=new JSPopMinuteChart();
80157
80094
  this.PopMinuteChart.Inital(this, item);
80095
+ this.PopMinuteChart.Create();
80158
80096
  return true;
80159
80097
  }
80160
80098
  else if (option.KLine && option.KLine.KLineDoubleClick===true) //旧的格式 不要使用了
80161
80099
  {
80162
80100
  this.PopMinuteChart=new JSPopMinuteChart();
80163
80101
  this.PopMinuteChart.Inital(this);
80102
+ this.PopMinuteChart.Create();
80164
80103
  return true;
80165
80104
  }
80166
80105
 
@@ -92342,6 +92281,15 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
92342
92281
  chart.SetOption(option);
92343
92282
  this.ExtendChartPaint.push(chart);
92344
92283
  return chart;
92284
+ case "背景图":
92285
+ chart=new BackgroundPaint();
92286
+ chart.Canvas=this.Canvas;
92287
+ chart.ChartBorder=this.Frame.ChartBorder;
92288
+ chart.ChartFrame=this.Frame;
92289
+ chart.HQChart=this;
92290
+ chart.SetOption(option);
92291
+ this.ExtendChartPaint.push(chart);
92292
+ return chart;
92345
92293
  default:
92346
92294
  chart=g_ExtendChartPaintFactory.Create(name);
92347
92295
  if (!chart) return null;
@@ -148198,6 +148146,13 @@ function JSPopMinuteChart()
148198
148146
  this.Minute.JSChart.ChangeSymbol(data.Symbol);
148199
148147
  }
148200
148148
 
148149
+ if (!this.Minute.Option.EnableResize)
148150
+ {
148151
+ if (this.Minute.JSChart) this.Minute.JSChart.OnSize();
148152
+ }
148153
+
148154
+
148155
+
148201
148156
  //超出窗口调整位置
148202
148157
  var height=this.DivDialog.offsetHeight;
148203
148158
  var width=this.DivDialog.offsetWidth;
@@ -148299,7 +148254,7 @@ JSPopMinuteChart.GetMinuteOption=function()
148299
148254
 
148300
148255
  EnableSelectRect:true,
148301
148256
  EnableZoomIndexWindow:true,
148302
- EnableResize:true,
148257
+ EnableResize:false,
148303
148258
 
148304
148259
  //BeforeOpen:{IsShow:true, Width:120, IsShowMultiDay:true, MulitiDayWidth:100, },
148305
148260
  //AfterClose:{IsShow:true, Width:100, IsShowMultiDay:true, MulitiDayWidth:50, ShareVol:2 }, //ShareVol:0=盘后成交量独立坐标, 1==盘后成交量主图共用 2==盘后成交量盘前共用
@@ -148647,8 +148602,13 @@ function JSPopKeyboard()
148647
148602
  JSChart:null,
148648
148603
  }
148649
148604
 
148650
- this.Inital=function()
148605
+ this.Inital=function(option)
148651
148606
  {
148607
+ if (option)
148608
+ {
148609
+ if (IFrameSplitOperator.IsBool(option.EnableResize)) this.Keyboard.Option.EnableResize=option.EnableResize;
148610
+ }
148611
+
148652
148612
  window.addEventListener('mousedown', (e)=>{ this.OnWindowMouseDown(e)});
148653
148613
  }
148654
148614
 
@@ -148848,6 +148808,11 @@ function JSPopKeyboard()
148848
148808
  {
148849
148809
  if (!this.DivDialog) return;
148850
148810
 
148811
+ if (!this.Keyboard.Option.EnableResize) //自动调整大小
148812
+ {
148813
+ if (this.Keyboard.JSChart) this.Keyboard.JSChart.OnSize();
148814
+ }
148815
+
148851
148816
  //显示在右下方
148852
148817
  var height=this.DivDialog.offsetHeight;
148853
148818
  var width=this.DivDialog.offsetWidth;
@@ -148979,7 +148944,7 @@ JSPopKeyboard.GetOption=function()
148979
148944
  },
148980
148945
 
148981
148946
  BorderLine:1|2|4|8,
148982
- EnableResize:true,
148947
+ EnableResize:false,
148983
148948
 
148984
148949
  //{ Type:列id, Title:标题, TextAlign:文字对齐方式, MaxText:文字最大宽度 , TextColor:文字颜色, Sort:0=不支持排序 1=本地排序 0=远程排序 }
148985
148950
  Column:
@@ -153200,7 +153165,7 @@ function HQChartScriptWorker()
153200
153165
 
153201
153166
 
153202
153167
 
153203
- var HQCHART_VERSION="1.1.14415";
153168
+ var HQCHART_VERSION="1.1.14431";
153204
153169
 
153205
153170
  function PrintHQChartVersion()
153206
153171
  {