hqchart 1.1.14320 → 1.1.14336

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.
@@ -2846,6 +2846,9 @@ var JSCHART_MENU_ID=
2846
2846
  CMD_MODIFY_INDEX_PARAM:45, //指标删除修改 [windowIndex, ]
2847
2847
  CMD_MODIFY_OVERLAY_INDEX_PARAM:46, //叠加指标修改 [windowIndex, ID ]
2848
2848
 
2849
+ CMD_LOCK_CROSSCURSOR:47, //锁十字光标
2850
+ CMD_UNLOCK_CROSSCURSOR:48, //解锁十字光标
2851
+
2849
2852
 
2850
2853
  CMD_REPORT_CHANGE_BLOCK_ID:100, //报价列表 切换板块ID
2851
2854
  CMD_REPORT_COLUMN_SORT_ID:101, //报价列表 表头排序 Arg[列序号, 排序方向]
@@ -10187,6 +10190,12 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
10187
10190
  var sendData={ e:null, WindowIndex:param, Type:2, Identify:aryArgs[1] };
10188
10191
  this.ShowModifyIndexParamDialog(sendData);
10189
10192
  break;
10193
+ case JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR:
10194
+ if (srcParam) this.LockCorssCursor(srcParam);
10195
+ break;
10196
+ case JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR:
10197
+ if (this.IsLockCorssCursor()) this.UnlockCorssCursor({ Draw:true })
10198
+ break;
10190
10199
  }
10191
10200
  }
10192
10201
 
@@ -10273,13 +10282,13 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
10273
10282
  if (!this.JSPopMenu) return;
10274
10283
  var x=data.X, y=data.Y;
10275
10284
  var frameID=data.FrameID;
10276
- var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
10285
+ var menuData={ Menu:this.GetRightMenuData(frameID, data), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
10277
10286
  menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
10278
10287
 
10279
10288
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CREATE_RIGHT_MENU);
10280
10289
  if (event && event.Callback)
10281
10290
  {
10282
- var sendData={ MenuData:menuData, FrameID:frameID };
10291
+ var sendData={ MenuData:menuData, FrameID:frameID, Data:data };
10283
10292
  event.Callback(event, sendData, this);
10284
10293
  }
10285
10294
 
@@ -20696,9 +20705,9 @@ function HQTradeFrame()
20696
20705
  return null;
20697
20706
  }
20698
20707
 
20699
- this.GetXFromIndex=function(index)
20708
+ this.GetXFromIndex=function(index,isLimit)
20700
20709
  {
20701
- return this.SubFrame[0].Frame.GetXFromIndex(index);
20710
+ return this.SubFrame[0].Frame.GetXFromIndex(index,isLimit);
20702
20711
  }
20703
20712
 
20704
20713
  this.GetYFromData=function(value)
@@ -23698,15 +23707,15 @@ function ChartData()
23698
23707
  this.FindDataIndexByDateTime=function(aryDateTime) //aryDateTime=[ { Date:, Time:, Index:-1 }, ......]
23699
23708
  {
23700
23709
  var findCount=0;
23701
- for(var i in aryDateTime)
23710
+ for(var i=0;i<aryDateTime.length;++i)
23702
23711
  {
23703
23712
  aryDateTime[i].Index=-1;
23704
23713
  }
23705
23714
 
23706
- for(var i in this.Data)
23715
+ for(var i=0;i<this.Data.length;++i)
23707
23716
  {
23708
23717
  var item=this.Data[i];
23709
- for(var j in aryDateTime)
23718
+ for(var j=0;j<aryDateTime.length;++j)
23710
23719
  {
23711
23720
  var findItem=aryDateTime[j];
23712
23721
  if (findItem.Index>=0) continue;
@@ -23715,7 +23724,7 @@ function ChartData()
23715
23724
  {
23716
23725
  if (findItem.Date==item.Date && findItem.Time==item.Time)
23717
23726
  {
23718
- findItem.Index=parseInt(i);
23727
+ findItem.Index=i;
23719
23728
  ++findCount;
23720
23729
  break;
23721
23730
  }
@@ -23724,7 +23733,7 @@ function ChartData()
23724
23733
  {
23725
23734
  if (findItem.Date==item.Date)
23726
23735
  {
23727
- findItem.Index=parseInt(i);
23736
+ findItem.Index=i;
23728
23737
  ++findCount;
23729
23738
  break;
23730
23739
  }
@@ -24348,6 +24357,30 @@ ChartData.GetPeriodName=function(period)
24348
24357
  }
24349
24358
 
24350
24359
 
24360
+ ChartData.GetKValue=function(kItem, valueName)
24361
+ {
24362
+ if (!kItem) return null;
24363
+
24364
+ switch(valueName)
24365
+ {
24366
+ case "HIGH":
24367
+ case "H":
24368
+ return kItem.High;
24369
+ case "L":
24370
+ case "LOW":
24371
+ return kItem.Low;
24372
+ case "C":
24373
+ case "CLOSE":
24374
+ return kItem.Close;
24375
+ case "O":
24376
+ case "OPEN":
24377
+ return KItem.Open;
24378
+ default:
24379
+ return null;
24380
+ }
24381
+ }
24382
+
24383
+
24351
24384
 
24352
24385
  function TooltipData() //提示信息
24353
24386
  {
@@ -31938,199 +31971,292 @@ function ChartSimpleRadar()
31938
31971
  delete this.newMethod;
31939
31972
 
31940
31973
  this.ClassName='ChartSimpleRadar'; //类名
31941
- this.BorderPoint=[]; //边框点
31942
- this.DataPoint=[]; //数据点
31943
- this.CenterPoint={};
31944
- this.StartAngle=0;
31945
- this.Color='rgb(198,198,198)';
31946
- this.AreaColor='rgba(242,154,118,0.4)'; //面积图颜色
31974
+
31975
+ this.AreaColor='rgba(242,154,118,0.4)'; //
31947
31976
  this.AreaLineColor='rgb(242,154,118)';
31948
- this.TitleFont=24*GetDevicePixelRatio()+'px 微软雅黑';
31949
- this.TitleColor='rgb(102,102,102)';
31950
- this.BGColor = ['rgb(255,255,255)', 'rgb(224,224,224)']//背景色
31977
+
31978
+ this.TitleColor=g_JSChartResource.ChartSimpleRadar.TextColor;
31979
+ this.TextFontConfig=CloneData(g_JSChartResource.ChartSimpleRadar.TextFont);
31980
+ this.Offset=CloneData(g_JSChartResource.ChartSimpleRadar.Offset);
31981
+ this.BorderColor=g_JSChartResource.ChartSimpleRadar.BorderColor;
31982
+ this.AryBGColor=g_JSChartResource.ChartSimpleRadar.AryBGColor.slice();//背景色
31983
+ this.AryAreaConfig=g_JSChartResource.ChartSimpleRadar.AryArea.slice(); //面积图颜色
31984
+
31985
+ this.StartAngle=270;
31986
+ this.Radius=50;
31987
+ this.AryBorder=[1, 0.75, 0.5, 0.25];
31988
+ this.AryIndex; //指标{ Name:, Max:100, Min:0 },
31951
31989
 
31952
- this.DrawBorder=function() //画边框
31990
+ this.CenterPoint={};
31991
+ this.RectClient={ };
31992
+ this.AryIndexCache=[];
31993
+ this.MapDataCache=new Map(); //key=name value={ Data:[] }
31994
+ this.TextFont;
31995
+
31996
+
31997
+ this.ReloadResource=function(resource)
31953
31998
  {
31954
- if (this.BorderPoint.length<=0) return;
31999
+ this.TitleColor=g_JSChartResource.ChartSimpleRadar.TextColor;
32000
+ this.TextFontConfig=CloneData(g_JSChartResource.ChartSimpleRadar.TextFont);
32001
+ this.Offset=CloneData(g_JSChartResource.ChartSimpleRadar.Offset);
32002
+ this.BorderColor=g_JSChartResource.ChartSimpleRadar.BorderColor;
32003
+ this.AryBGColor=g_JSChartResource.ChartSimpleRadar.AryBGColor.slice();//背景色
32004
+ this.AryAreaConfig=g_JSChartResource.ChartSimpleRadar.AryArea.slice(); //面积图颜色
32005
+ }
31955
32006
 
31956
- this.Canvas.font=this.TitleFont;
31957
- this.Canvas.strokeStyle = this.Color;
31958
- const aryBorder=[1,0.8,0.6,0.4,0.2];
31959
- for (let j in aryBorder)
32007
+ this.DrawBorder=function() //画边框
32008
+ {
32009
+ this.Canvas.strokeStyle = this.BorderColor;
32010
+ this.Canvas.font=this.TextFont;
32011
+ for(var i=0;i<this.AryBorder.length;++i)
31960
32012
  {
31961
- var rate = aryBorder[j];
31962
- var isFirstDraw=true;
31963
- for(let i in this.BorderPoint)
32013
+ var rate = this.AryBorder[i];
32014
+ var radius=this.RectClient.Radius*rate;
32015
+ var bFirstDraw=true;
32016
+ for(var j=0;j<this.AryIndexCache.length;++j)
31964
32017
  {
31965
- var item=this.BorderPoint[i];
31966
- item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180) * rate;
31967
- item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180) * rate;
31968
- if (isFirstDraw)
32018
+ var item=this.AryIndexCache[j];
32019
+ var x = this.CenterPoint.X + radius * Math.cos(item.Angle * Math.PI / 180);
32020
+ var y = this.CenterPoint.Y + radius * Math.sin(item.Angle * Math.PI / 180);
32021
+ if (bFirstDraw)
31969
32022
  {
31970
32023
  this.Canvas.beginPath();
31971
- this.Canvas.moveTo(item.X,item.Y);
31972
- isFirstDraw=false;
32024
+ this.Canvas.moveTo(x,y);
32025
+ bFirstDraw=false;
31973
32026
  }
31974
32027
  else
31975
32028
  {
31976
- this.Canvas.lineTo(item.X,item.Y);
32029
+ this.Canvas.lineTo(x,y);
31977
32030
  }
31978
32031
  }
31979
32032
 
31980
32033
  this.Canvas.closePath();
31981
32034
  this.Canvas.stroke();
31982
- this.Canvas.fillStyle = this.BGColor[j%2==0?0:1];
31983
- this.Canvas.fill();
32035
+
32036
+ if (IFrameSplitOperator.IsNonEmptyArray(this.AryBGColor))
32037
+ {
32038
+ this.Canvas.fillStyle = this.AryBGColor[i%this.AryBGColor.length];
32039
+ this.Canvas.fill();
32040
+ }
31984
32041
  }
31985
32042
 
31986
32043
  this.Canvas.beginPath();
31987
- for(let i in this.BorderPoint)
32044
+ for(var i=0;i<this.AryIndexCache.length;++i)
31988
32045
  {
31989
- var item=this.BorderPoint[i];
31990
- item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180);
31991
- item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180);
32046
+ var item=this.AryIndexCache[i];
32047
+ var x = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180);
32048
+ var y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180);
31992
32049
  this.Canvas.moveTo(this.CenterPoint.X,this.CenterPoint.Y);
31993
- this.Canvas.lineTo(item.X,item.Y);
31994
- this.DrawText(item);
32050
+ this.Canvas.lineTo(x,y);
32051
+ this.DrawText(item, x, y);
31995
32052
  }
31996
32053
  this.Canvas.stroke();
32054
+
32055
+ }
32056
+
32057
+ this.GetRadarRate=function(indexItem, value)
32058
+ {
32059
+ var range={ Max:100, Min:0 };
32060
+ if (IFrameSplitOperator.IsNumber(indexItem.Max)) range.Max=indexItem.Max;
32061
+ if (IFrameSplitOperator.IsNumber(indexItem.Min)) range.Min=indexItem.Min;
32062
+
32063
+ if (value>range.Max) value=range.Max;
32064
+ else if (value<range.Min) value=range.Min;
32065
+
32066
+ return (value-range.Min)/(range.Max-range.Min);
31997
32067
  }
31998
32068
 
31999
32069
  this.DrawArea=function()
32000
32070
  {
32001
- if (!this.DataPoint || this.DataPoint.length<=0) return;
32071
+ if (this.MapDataCache.size<=0) return;
32002
32072
 
32003
- this.Canvas.fillStyle = this.AreaColor;
32004
- this.Canvas.strokeStyle = this.AreaLineColor;
32005
- this.Canvas.beginPath();
32006
- var isFirstDraw=true;
32007
- for(let i in this.DataPoint)
32073
+ var index=0;
32074
+ for(var mapItem of this.MapDataCache)
32008
32075
  {
32009
- var item=this.DataPoint[i];
32010
- if (isFirstDraw)
32076
+ var mapData=mapItem[1].MapData;
32077
+
32078
+ var bFirstDraw=true;
32079
+ var pointCount=0;
32080
+ for(var i=0;i<this.AryIndexCache.length;++i)
32011
32081
  {
32012
- this.Canvas.beginPath();
32013
- this.Canvas.moveTo(item.X,item.Y);
32014
- isFirstDraw=false;
32082
+ var indexItem=this.AryIndexCache[i];
32083
+ if (!indexItem.Data || !indexItem.Data.Name) continue;
32084
+ if (!mapData.has(indexItem.Data.Name)) continue;
32085
+ var item=mapData.get(indexItem.Data.Name);
32086
+ if (!item.Data && !IFrameSplitOperator.IsNumber(item.Data.Value)) conintue;
32087
+
32088
+ var widthRate=this.GetRadarRate(indexItem, item.Data.Value);
32089
+ var x = this.CenterPoint.X+indexItem.Radius*widthRate*Math.cos(indexItem.Angle * Math.PI / 180);
32090
+ var y = this.CenterPoint.Y+indexItem.Radius*widthRate*Math.sin(indexItem.Angle * Math.PI / 180);
32091
+
32092
+ if (bFirstDraw)
32093
+ {
32094
+ this.Canvas.beginPath();
32095
+ this.Canvas.moveTo(x,y);
32096
+ bFirstDraw=false;
32097
+ ++pointCount;
32098
+ }
32099
+ else
32100
+ {
32101
+ this.Canvas.lineTo(x,y);
32102
+ ++pointCount;
32103
+ }
32015
32104
  }
32016
- else
32105
+
32106
+ if (pointCount>0)
32017
32107
  {
32018
- this.Canvas.lineTo(item.X,item.Y);
32108
+ this.Canvas.closePath();
32109
+
32110
+ var config=this.AryAreaConfig[index%this.AryAreaConfig.length];
32111
+ if (config.Color)
32112
+ {
32113
+ this.Canvas.fillStyle = config.Color;
32114
+ this.Canvas.fill();
32115
+ }
32116
+
32117
+ if (config.LineColor)
32118
+ {
32119
+ this.Canvas.strokeStyle = config.LineColor;
32120
+ this.Canvas.stroke();
32121
+ }
32019
32122
  }
32020
- }
32021
32123
 
32022
- this.Canvas.closePath();
32023
- this.Canvas.fill();
32024
- this.Canvas.stroke();
32124
+ ++index;
32125
+ }
32025
32126
  }
32026
32127
 
32027
- this.DrawText=function(item)
32128
+ this.DrawText=function(item, x, y)
32028
32129
  {
32029
- if (!item.Text) return;
32130
+ if (!item.Data || !item.Data.Name) return;
32030
32131
 
32031
32132
  //JSConsole.Chart.Log(item.Text, item.Angle);
32032
32133
  this.Canvas.fillStyle = this.TitleColor;
32033
- var xText = item.X, yText = item.Y;
32134
+ var xText = x, yText =y;
32135
+
32136
+ var angle=item.Angle%360;
32034
32137
 
32035
32138
  //显示每个角度的位置
32036
- if (item.Angle > 0 && item.Angle < 45) {
32139
+ if (angle > 0 && angle < 45) {
32037
32140
  this.Canvas.textAlign = 'left';
32038
32141
  this.Canvas.textBaseline = 'middle';
32039
32142
  xText += 2;
32040
32143
  }
32041
- else if (item.Angle >= 0 && item.Angle < 90) {
32144
+ else if (angle >= 45 && angle < 90) {
32042
32145
  this.Canvas.textAlign = 'left';
32043
32146
  this.Canvas.textBaseline = 'top';
32044
32147
  xText += 2;
32045
32148
  }
32046
- else if (item.Angle >= 90 && item.Angle < 135) {
32149
+ else if (angle==90)
32150
+ {
32151
+ this.Canvas.textAlign = 'center';
32152
+ this.Canvas.textBaseline = 'top';
32153
+ yText+=2;
32154
+ }
32155
+ else if (angle >= 90 && angle < 135) {
32047
32156
  this.Canvas.textAlign = 'right';
32048
32157
  this.Canvas.textBaseline = 'top';
32049
32158
  xText -= 2;
32050
32159
  }
32051
- else if (item.Angle >= 135 && item.Angle < 180) {
32160
+ else if (angle >= 135 && angle < 180) {
32052
32161
  this.Canvas.textAlign = 'right';
32053
32162
  this.Canvas.textBaseline = 'top';
32054
32163
  xText -= 2;
32055
32164
  }
32056
- else if (item.Angle >= 180 && item.Angle < 225) {
32165
+ else if (angle >= 180 && angle < 225) {
32057
32166
  this.Canvas.textAlign = 'right';
32058
32167
  this.Canvas.textBaseline = 'middle';
32059
32168
  xText -= 2;
32060
32169
  }
32061
- else if (item.Angle >= 225 && item.Angle <= 270) {
32170
+ else if (angle >= 225 && angle <= 270) {
32062
32171
  this.Canvas.textAlign = 'center';
32063
32172
  this.Canvas.textBaseline = 'bottom';
32064
32173
  }
32065
- else if (item.Angle > 270 && item.Angle < 315) {
32174
+ else if (angle > 270 && angle < 315) {
32066
32175
  this.Canvas.textAlign = 'left';
32067
32176
  this.Canvas.textBaseline = 'bottom';
32068
32177
  xText += 2;
32069
32178
  }
32070
- else {
32179
+ else
32180
+ {
32071
32181
  this.Canvas.textAlign = 'left';
32072
32182
  this.Canvas.textBaseline = 'middle';
32073
32183
  xText += 2;
32074
32184
  }
32075
32185
 
32076
- this.Canvas.fillText(item.Text, xText, yText);
32186
+ this.Canvas.fillText(item.Data.Name, xText, yText);
32077
32187
  }
32078
32188
 
32079
32189
  this.Draw=function()
32080
32190
  {
32081
- this.BorderPoint=[];
32082
- this.DataPoint=[];
32083
- this.CenterPoint={};
32084
- if (!this.Data || !this.Data.Data || !(this.Data.Data.length>0))
32085
- this.CalculatePoints(null);
32086
- else
32087
- this.CalculatePoints(this.Data.Data);
32191
+ this.AryIndexCache=[];
32192
+ this.MapData=new Map();
32193
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.AryIndex)) return;
32194
+
32195
+ this.CalculateSize();
32088
32196
 
32089
32197
  this.DrawBorder();
32198
+
32090
32199
  this.DrawArea();
32091
32200
  }
32092
32201
 
32093
- this.CalculatePoints=function(data)
32202
+ this.BuildCacheData=function()
32094
32203
  {
32095
- let left=this.ChartBorder.GetLeft();
32096
- let right=this.ChartBorder.GetRight();
32097
- let top=this.ChartBorder.GetTop();
32098
- let bottom=this.ChartBorder.GetBottom();
32099
- let width=this.ChartBorder.GetWidth();
32100
- let height=this.ChartBorder.GetHeight();
32204
+ this.MapDataCache=new Map();
32101
32205
 
32102
- let ptCenter={X:left+width/2, Y:top+height/2}; //中心点
32103
- let radius=Math.min(width/2,height/2)-2 //半径
32104
- let count=Math.max(5,data?data.length:0);
32105
- let averageAngle=360/count;
32106
- for(let i=0;i<count;++i)
32206
+ for(var i=0;i<this.Data.Data.length;++i)
32107
32207
  {
32108
- let ptBorder = { Index: i, Radius: radius, Angle: i * averageAngle + this.StartAngle };
32109
- let angle = ptBorder.Angle;
32208
+ var item=this.Data.Data[i];
32209
+ if (!this.MapDataCache.has(item.Group))
32210
+ {
32211
+ this.MapDataCache.set(item.Group, { MapData:new Map() })
32212
+ }
32213
+
32214
+ var mpaItem=this.MapDataCache.get(item.Group);
32215
+ mpaItem.MapData.set(item.Name, { Data:item });
32216
+ }
32217
+ }
32218
+
32219
+ this.CalculateSize=function(data)
32220
+ {
32221
+ var border=this.ChartBorder.GetBorder();
32222
+ var pixelRatio=GetDevicePixelRatio();
32223
+ this.TextFont=`${this.TextFontConfig.Size*pixelRatio}px ${ this.TextFontConfig.Name}`;
32224
+ var fontHeight=this.GetFontHeight(this.TextFont,"擎")+1;
32110
32225
 
32111
- if (data && i<data.length)
32226
+ var maxTextWidth=0;
32227
+ if (IFrameSplitOperator.IsNonEmptyArray(this.AryIndex))
32228
+ {
32229
+ for(var i=0;i<this.AryIndex.length;++i)
32112
32230
  {
32113
- var item=data[i];
32114
- let ptData={Index:i,Text:item.Text};
32115
- ptBorder.Text=item.Name;
32116
- if (!item.Value)
32117
- {
32118
- ptData.X=ptCenter.X;
32119
- ptData.Y=ptCenter.Y;
32120
- }
32121
- else
32122
- {
32123
- var value=item.Value;
32124
- if (value>=1) value=1;
32125
- var dataRadius=radius*value;
32126
- ptData.X=ptCenter.X+dataRadius*Math.cos(angle*Math.PI/180);
32127
- ptData.Y=ptCenter.Y+dataRadius*Math.sin(angle*Math.PI/180);
32128
- }
32231
+ var item=this.AryIndex[i];
32232
+ if (!item.Name) continue;
32233
+ var textWidth=this.Canvas.measureText(item.Name).width;
32234
+ if (maxTextWidth<textWidth) maxTextWidth=textWidth;
32235
+ }
32236
+ }
32237
+
32238
+ var radius=this.Radius*2*pixelRatio; //半径
32239
+ this.RectClient={ Width:radius*2, Height:radius*2, Radius:radius };
32240
+ this.RectClient.Right=border.Right+this.Offset.X-maxTextWidth;
32241
+ this.RectClient.Top=border.TopEx+this.Offset.Y+fontHeight;
32242
+ this.RectClient.Left=this.RectClient.Right-this.RectClient.Width;
32243
+ this.RectClient.Bottom=this.RectClient.Top+this.RectClient.Height;
32244
+
32245
+ var ptCenter={X:this.RectClient.Left+this.RectClient.Width/2, Y:this.RectClient.Top+this.RectClient.Height/2}; //中心点
32246
+
32247
+ var count=Math.max(5,this.AryIndex.length);
32248
+ var averageAngle=360/count;
32249
+ for(var i=0;i<count;++i)
32250
+ {
32251
+ var angle=i*averageAngle+this.StartAngle;
32129
32252
 
32130
- this.DataPoint.push(ptData);
32253
+ var indexItem={ Data:null, Index:i, Angle:angle, Radius:radius };
32254
+ if (this.AryIndex && this.AryIndex[i])
32255
+ {
32256
+ indexItem.Data=this.AryIndex[i];
32131
32257
  }
32132
32258
 
32133
- this.BorderPoint.push(ptBorder);
32259
+ this.AryIndexCache.push(indexItem);
32134
32260
  }
32135
32261
 
32136
32262
  this.CenterPoint=ptCenter;
@@ -32139,7 +32265,7 @@ function ChartSimpleRadar()
32139
32265
  //空数据
32140
32266
  this.DrawEmptyData=function()
32141
32267
  {
32142
- JSConsole.Chart.Log('[ChartPie::DrawEmptyData]')
32268
+ JSConsole.Chart.Log('[ChartSimpleRadar::DrawEmptyData]')
32143
32269
  }
32144
32270
  }
32145
32271
 
@@ -40795,98 +40921,219 @@ function ChartMultiPoint()
40795
40921
  delete this.newMethod;
40796
40922
 
40797
40923
  this.ClassName="ChartMultiPoint";
40798
- this.PointGroup=[]; // [ {Point:[ {Index, Value }, ], Color: }, ]
40924
+ this.PointGroup=[]; // [ {Point:[ {Date, Time, Value }, ], Color: }, ]
40799
40925
 
40800
40926
 
40801
40927
  this.IsHScreen=false;
40802
40928
  this.LineWidth=1;
40803
40929
  this.PointRadius=5;
40804
40930
 
40931
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
40932
+ this.GetKValue=ChartData.GetKValue;
40933
+
40934
+ this.BuildKey=function(item)
40935
+ {
40936
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
40937
+ else return item.Date;
40938
+ }
40939
+
40940
+ this.GetItem=function(kItem)
40941
+ {
40942
+ if (!this.MapCache || this.MapCache.size<=0) return null;
40943
+
40944
+ var key=this.BuildKey(kItem);
40945
+ if (!this.MapCache.has(key)) return null;
40946
+
40947
+ return this.MapCache.get(key);
40948
+ }
40949
+
40950
+ this.BuildCacheData=function()
40951
+ {
40952
+ var mapData=new Map();
40953
+ this.MapCache=mapData;
40954
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
40955
+
40956
+ for(var i=0; i<this.PointGroup.length; ++i)
40957
+ {
40958
+ var groupItem=this.PointGroup[i];
40959
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
40960
+
40961
+ var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
40962
+ if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
40963
+
40964
+ for(var j=0; j<groupItem.Point.length; ++j)
40965
+ {
40966
+ var point=groupItem.Point[j];
40967
+ var key=this.BuildKey(point);
40968
+
40969
+ var item={ Data:point, ColorConfig:clrConfig }
40970
+ if (mapData.has(key))
40971
+ {
40972
+ var mapItem=mapData.get(key);
40973
+ mapItem.Data.push(item);
40974
+ }
40975
+ else
40976
+ {
40977
+ mapData.set(key,{ Data:[item] });
40978
+ }
40979
+ }
40980
+ }
40981
+ }
40982
+
40805
40983
  this.Draw=function()
40806
40984
  {
40807
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
40808
- if (!this.Data || this.Data.length<=0) return;
40985
+ if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
40986
+ if (this.IsShowIndexTitleOnly()) return;
40987
+ if (this.IsHideScriptIndex()) return;
40988
+
40989
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
40809
40990
  if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
40991
+ if (!this.MapCache || this.MapCache.size<=0) return;
40810
40992
 
40811
40993
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
40812
40994
  var xPointCount=this.ChartFrame.XPointCount;
40813
- var offset=this.Data.DataOffset;
40814
- var pixel=GetDevicePixelRatio();
40995
+ var dataWidth=this.ChartFrame.DataWidth;
40996
+ var distanceWidth=this.ChartFrame.DistanceWidth;
40997
+ var isMinute=this.IsMinuteFrame();
40998
+
40999
+ var border=this.GetBorder();
41000
+ if (this.IsHScreen)
41001
+ {
41002
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
41003
+ var chartright=border.BottomEx;
41004
+ var chartLeft=border.TopEx;
41005
+ }
41006
+ else
41007
+ {
41008
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
41009
+ var chartright=border.RightEx;
41010
+ var chartLeft=border.LeftEx;
41011
+ }
41012
+
41013
+ //计算所有的点位置
41014
+ var mapPoint=new Map();
41015
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
41016
+ {
41017
+ var kItem=this.Data.Data[i];
41018
+ var key=this.BuildKey(kItem);
41019
+ if (!this.MapCache.has(key)) continue;
41020
+ var mapItem=this.MapCache.get(key);
41021
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
41022
+
41023
+ if (isMinute)
41024
+ {
41025
+ var x=this.ChartFrame.GetXFromIndex(j);
41026
+ }
41027
+ else
41028
+ {
41029
+ var left=xOffset;
41030
+ var right=xOffset+dataWidth;
41031
+ if (right>chartright) break;
41032
+ var x=left+(right-left)/2;
41033
+ }
41034
+
41035
+ this.CalculateItem(mapItem, kItem, x, mapPoint);
41036
+ }
41037
+
41038
+ if (mapPoint.size<=0) return;
40815
41039
 
40816
41040
  this.Canvas.save();
40817
41041
  this.ClipClient(this.IsHScreen);
40818
-
40819
- for(var i=0; i<this.PointGroup.length; ++i)
41042
+
41043
+ this.DrawAllPoint(mapPoint);
41044
+
41045
+ this.Canvas.restore();
41046
+ }
41047
+
41048
+ this.CalculateItem=function(groupItem, kItem, x, mapPoint)
41049
+ {
41050
+ for(var i=0; i<groupItem.Data.length; ++i)
40820
41051
  {
40821
- var item=this.PointGroup[i];
40822
- var color=item.Color;
40823
- var bgColor=item.BGColor;
40824
- var lineWidth=this.LineWidth;
40825
- var radius=this.PointRadius;
40826
- if (IFrameSplitOperator.IsNumber(item.LineWidth)) lineWidth=item.LineWidth;
40827
- if (IFrameSplitOperator.IsNumber(item.PointRadius)) radius=item.PointRadius;
41052
+ var item=groupItem.Data[i];
41053
+ var value=item.Data.Value;
41054
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
41055
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
41056
+
41057
+ var y=this.ChartFrame.GetYFromData(value,false);
41058
+
41059
+ var strConfig=JSON.stringify(item.ColorConfig);
41060
+ if (!mapPoint.has(strConfig)) mapPoint.set(strConfig, { AryPoint:[]});
41061
+ var mapItem=mapPoint.get(strConfig);
41062
+
41063
+ mapItem.AryPoint.push({ X:x, Y:y, Data:item });
41064
+ }
41065
+ }
41066
+
41067
+ this.DrawAllPoint=function(mapPoint)
41068
+ {
41069
+ var pixelRatio=GetDevicePixelRatio();
41070
+
41071
+ for(var mapItem of mapPoint)
41072
+ {
41073
+ var aryPoint=mapItem[1].AryPoint;
41074
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryPoint)) continue;
41075
+ var config=null;
40828
41076
  var path=new Path2D();
40829
41077
  var count=0;
40830
-
40831
- for(var j=0; j<item.Point.length; ++j)
41078
+ for(var i=0;i<aryPoint.length;++i)
40832
41079
  {
40833
- var point=item.Point[j];
40834
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
40835
-
40836
- var index=point.Index-offset;
40837
- if (index>=0 && index<xPointCount)
40838
- {
40839
- var x=this.ChartFrame.GetXFromIndex(index);
40840
- var y=this.ChartFrame.GetYFromData(point.Value, false);
41080
+ var item=aryPoint[i];
41081
+ if (!config) config=item.Data.ColorConfig;
40841
41082
 
40842
- var pointPath = new Path2D();
40843
- if (this.IsHScreen)
40844
- pointPath.arc(y,x,radius*pixel,0,360,false);
40845
- else
40846
- pointPath.arc(x,y,radius*pixel,0,360,false);
41083
+ var pointPath = new Path2D();
41084
+ if (this.IsHScreen)
41085
+ pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
41086
+ else
41087
+ pointPath.arc(item.X,item.Y,config.Radius**pixelRatio,0,360,false);
40847
41088
 
40848
- path.addPath(pointPath);
40849
- ++count;
40850
- }
41089
+ path.addPath(pointPath);
41090
+ ++count;
40851
41091
  }
40852
41092
 
40853
- if (count>0 && (bgColor || color))
41093
+ if (count>0 && config)
40854
41094
  {
40855
- this.Canvas.lineWidth=lineWidth*pixel;
40856
- this.Canvas.fillStyle=bgColor; //背景填充颜色
40857
- this.Canvas.strokeStyle=color;
41095
+ if (config.BGColor)
41096
+ {
41097
+ this.Canvas.fillStyle=config.BGColor; //背景填充颜色
41098
+ this.Canvas.fill(path);
41099
+ }
40858
41100
 
40859
- if (bgColor) this.Canvas.fill(path);
40860
- if (color) this.Canvas.stroke(path);
41101
+ if (config.Color)
41102
+ {
41103
+ this.Canvas.lineWidth=config.LineWidth*pixelRatio;
41104
+ this.Canvas.strokeStyle=config.Color;
41105
+ this.Canvas.stroke(path);
41106
+ }
40861
41107
  }
40862
-
40863
41108
  }
40864
-
40865
- this.Canvas.restore();
40866
41109
  }
40867
41110
 
40868
41111
  this.GetMaxMin=function()
40869
41112
  {
40870
41113
  var range={ Min:null, Max:null };
41114
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
41115
+ if (!this.MapCache || this.MapCache.size<=0) return;
40871
41116
  var xPointCount=this.ChartFrame.XPointCount;
40872
- var start=this.Data.DataOffset;
40873
- var end=start+xPointCount;
40874
41117
 
40875
- for(var i=0; i<this.PointGroup.length; ++i)
41118
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
40876
41119
  {
40877
- var item=this.PointGroup[i];
40878
- if (!IFrameSplitOperator.IsNonEmptyArray(item.Point)) continue;
41120
+ var kItem=this.Data.Data[i];
41121
+ var key=this.BuildKey(kItem);
41122
+ if (!this.MapCache.has(key)) continue;
41123
+ var mapItem=this.MapCache.get(key);
41124
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
40879
41125
 
40880
- for(var j=0; j<item.Point.length; ++j)
41126
+ for(k=0;k<mapItem.Data.length;++k)
40881
41127
  {
40882
- var point=item.Point[j];
40883
- if (point.Index>=start && point.Index<end)
40884
- {
40885
- if (range.Max==null) range.Max=point.Value;
40886
- else if (range.Max<point.Value) range.Max=point.Value;
40887
- if (range.Min==null) range.Min=point.Value;
40888
- else if (range.Min>point.Value) range.Min=point.Value;
40889
- }
41128
+ var item=mapItem.Data[k];
41129
+ var value=item.Data.Value;
41130
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
41131
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
41132
+
41133
+ if (range.Max==null) range.Max=value;
41134
+ else if (range.Max<value) range.Max=value;
41135
+ if (range.Min==null) range.Min=value;
41136
+ else if (range.Min>value) range.Min=value;
40890
41137
  }
40891
41138
  }
40892
41139
 
@@ -41153,6 +41400,8 @@ function ChartMultiSVGIconV2()
41153
41400
  this.IconRect=[]; //0=序号,1=区域
41154
41401
 
41155
41402
  this.MapCache=null; //key=date/date-time value={ Data:[] }
41403
+ this.GetKValue=ChartData.GetKValue;
41404
+
41156
41405
 
41157
41406
  this.BuildKey=function(item)
41158
41407
  {
@@ -41267,28 +41516,7 @@ function ChartMultiSVGIconV2()
41267
41516
 
41268
41517
  this.Canvas.restore();
41269
41518
  }
41270
-
41271
- this.GetKValue=function(kItem, valueName)
41272
- {
41273
- switch(valueName)
41274
- {
41275
- case "HIGH":
41276
- case "H":
41277
- return kItem.High;
41278
- case "L":
41279
- case "LOW":
41280
- return kItem.Low;
41281
- case "C":
41282
- case "CLOSE":
41283
- return kItem.Close;
41284
- case "O":
41285
- case "OPEN":
41286
- return KItem.Open;
41287
- default:
41288
- return null;
41289
- }
41290
- }
41291
-
41519
+
41292
41520
  this.DrawItem=function(groupItem, kItem, x, drawInfo)
41293
41521
  {
41294
41522
  if (!IFrameSplitOperator.IsNonEmptyArray(groupItem.Data)) return;
@@ -57244,24 +57472,29 @@ function DynamicChartTitlePainting()
57244
57472
 
57245
57473
  this.ForamtMultiPointTitle=function(dataIndex, dataInfo)
57246
57474
  {
57247
- if (!IFrameSplitOperator.IsNonEmptyArray(dataInfo.PointGroup)) return null;
57475
+ if (!dataInfo.GetItemCallback) return null;
57476
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
57477
+ var kItem=dataInfo.Data.Data[dataIndex];
57478
+ if (!kItem) return null;
57479
+
57480
+ var group=dataInfo.GetItemCallback(kItem);
57481
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
57248
57482
 
57249
57483
  var aryText=[];
57250
- for(var i=0;i<dataInfo.PointGroup.length;++i)
57484
+ for(var i=0;i<group.Data.length;++i)
57251
57485
  {
57252
- var groupItem=dataInfo.PointGroup[i];
57253
- for(var j=0;j<groupItem.Point.length;++j)
57254
- {
57255
- var item=groupItem.Point[j];
57256
- if (item.Index==dataIndex)
57257
- {
57258
- var item={ Text:item.Value.toFixed(2)};
57259
- if (aryText.length==0) item.Name=dataInfo.Name;
57260
- item.Color=groupItem.BGColor;
57261
- aryText.push(item);
57262
- break;
57263
- }
57264
- }
57486
+ var item=group.Data[i];
57487
+ var config=item.ColorConfig;
57488
+
57489
+ var color=null;
57490
+ if (config.BGColor) color=config.BGColor;
57491
+ else if (config.Color) color=config.Color;
57492
+
57493
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
57494
+
57495
+ var value=item.Data.Value;
57496
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
57497
+ aryText.push({ Text:this.FormatValue(value, dataInfo), Color:color});
57265
57498
  }
57266
57499
 
57267
57500
  if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
@@ -58032,6 +58265,11 @@ function DynamicChartTitlePainting()
58032
58265
  aryText=this.FromatStackedBarTitle(value, item);
58033
58266
  if (!aryText) continue;
58034
58267
  }
58268
+ else if (item.DataType=="ChartMultiPoint")
58269
+ {
58270
+ aryText=this.ForamtMultiPointTitle(dataIndex, item);
58271
+ if (!aryText) continue;
58272
+ }
58035
58273
  else
58036
58274
  {
58037
58275
  valueText=this.FormatValue(value,item);
@@ -71036,6 +71274,20 @@ function JSChartResource()
71036
71274
  Offset:{ X:-5, Y:5 }
71037
71275
  }
71038
71276
 
71277
+ this.ChartSimpleRadar=
71278
+ {
71279
+ TextFont:{ Family:'微软雅黑' , Size:12 },
71280
+ BorderColor:"rgb(169,169,169)",
71281
+ Offset:{ X:-5, Y:5 },
71282
+ TextColor:"rgb(105,105,105)",
71283
+ AryBGColor:['rgba(255,255,255,0.9)', 'rgba(230, 234, 242,0.9)'],
71284
+ AryArea:
71285
+ [
71286
+ { Color:"rgba(242,154,118,0.4)", LineColor:"rgb(242,154,118)"},
71287
+ { Color:"rgba(121,197,228,0.4)", LineColor:"rgb(92,165,196)"},
71288
+ ],
71289
+ }
71290
+
71039
71291
  //手机端tooltip
71040
71292
  this.TooltipPaint = {
71041
71293
  BGColor:'rgba(250,250,250,0.8)', //背景色
@@ -72267,6 +72519,7 @@ function JSChartResource()
72267
72519
 
72268
72520
  if (style.ChartSimpleTable) this.SetChartSimpleTable(style.ChartSimpleTable);
72269
72521
  if (style.ChartSimplePie) this.SetChartSimplePie(style.ChartSimplePie);
72522
+ if (style.ChartSimpleRadar) this.SetChartSimpleRadar(style.ChartSimpleRadar);
72270
72523
 
72271
72524
  if (style.DRAWICON)
72272
72525
  {
@@ -73360,6 +73613,30 @@ function JSChartResource()
73360
73613
  }
73361
73614
  }
73362
73615
 
73616
+ this.SetChartSimpleRadar=function(style)
73617
+ {
73618
+ var dest=this.ChartSimpleRadar;
73619
+ if (style.TextFont)
73620
+ {
73621
+ var item=style.TextFont;
73622
+ if (item.Name) dest.TextFont.Name=item.Name;
73623
+ if (IFrameSplitOperator.IsNumber(item.Size)) dest.TextFont.Size=item.Size;
73624
+ }
73625
+
73626
+ if (style.BorderColor) dest.BorderColor=style.BorderColor;
73627
+ if (style.TextColor) dest.TextColor=style.TextColor;
73628
+
73629
+ if (style.Offset)
73630
+ {
73631
+ var item=style.Offset;
73632
+ if (IFrameSplitOperator.IsNumber(item.X)) dest.Offset.X=item.X;
73633
+ if (IFrameSplitOperator.IsNumber(item.Y)) dest.Offset.Y=item.Y;
73634
+ }
73635
+
73636
+ if (IFrameSplitOperator.IsNonEmptyArray(style.AryBGColor)) dest.AryBGColor=style.AryBGColor.slice();
73637
+ if (IFrameSplitOperator.IsNonEmptyArray(style.AryArea)) dest.AryArea=style.AryArea.slice();
73638
+ }
73639
+
73363
73640
  }
73364
73641
 
73365
73642
  var g_JSChartResource=new JSChartResource();
@@ -79973,18 +80250,18 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
79973
80250
  {
79974
80251
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
79975
80252
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
79976
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
80253
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio}}, e);
79977
80254
 
79978
80255
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
79979
80256
  if (event)
79980
80257
  {
79981
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
80258
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, Point:{ X:x*pixelTatio, Y:y*pixelTatio}, CursorIndex:this.CursorIndex, };
79982
80259
  event.Callback(event,data,this);
79983
80260
  }
79984
80261
  }
79985
80262
 
79986
80263
  //右键菜单数据
79987
- this.GetRightMenuData=function(frameID)
80264
+ this.GetRightMenuData=function(frameID, option)
79988
80265
  {
79989
80266
  var windowCount=this.Frame.SubFrame.length; //窗口个数
79990
80267
  var klineChart=this.ChartPaint[0];
@@ -80027,6 +80304,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80027
80304
  var bPopMinuteChart=false;
80028
80305
  if (this.PopMinuteChart) bPopMinuteChart=true;
80029
80306
 
80307
+ var kItem=null;
80308
+ if (frameID>=0 && option && IFrameSplitOperator.IsNumber(option.CursorIndex))
80309
+ {
80310
+ var kData=this.GetKData();
80311
+ if (kData && IFrameSplitOperator.IsNonEmptyArray(kData.Data))
80312
+ {
80313
+ var dataIndex=kData.DataOffset+option.CursorIndex;
80314
+ if (dataIndex>=0 && dataIndex<kData.Data.length) kItem=kData.Data[dataIndex];
80315
+ }
80316
+ }
80317
+
80030
80318
  var aryMenu=
80031
80319
  [
80032
80320
  {
@@ -80309,6 +80597,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80309
80597
  }
80310
80598
  }
80311
80599
  }
80600
+ else if (item.Name=="其他设置")
80601
+ {
80602
+ if (kItem)
80603
+ {
80604
+ var bLocked=this.IsLockCorssCursor();
80605
+ if (bLocked)
80606
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR }, Checked:bLocked });
80607
+ else
80608
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR, Args:[{ KItem:{Date:kItem.Date, Time:kItem.Time}, Draw:true }] }, Checked:bLocked });
80609
+ }
80610
+ }
80312
80611
  }
80313
80612
 
80314
80613
  return aryMenu;
@@ -81912,19 +82211,36 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
81912
82211
  if (option && option.Draw) this.Draw();
81913
82212
  }
81914
82213
 
82214
+ //option={ KItem:{ Date:, Time:}}
81915
82215
  this.LockCorssCursor=function(option)
81916
82216
  {
81917
- if (this.CursorIndex<0) return false;
81918
- var kData=this.GetKData();
81919
- if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
82217
+ if (option && option.KItem) //指定日期时间
82218
+ {
82219
+ var kData=this.GetKData();
82220
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
81920
82221
 
81921
- var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
81922
- var kItem=kData.Data[dataIndex];
81923
- if (!kItem) return false;
82222
+ var kItem={ Date:option.KItem.Date, Time:option.KItem.Time, Index:-1};
82223
+ kData.FindDataIndexByDateTime([kItem]);
82224
+ if (kItem.Index<0) return false;
81924
82225
 
81925
- var xItem=this.GlobalOption.LockCorssCursor.X;
81926
- xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
81927
- xItem.Enable=true;
82226
+ var xItem=this.GlobalOption.LockCorssCursor.X;
82227
+ xItem.KLine={ DataIndex:kItem.Index, Date:kItem.Date, Time:kItem.Time };
82228
+ xItem.Enable=true;
82229
+ }
82230
+ else
82231
+ {
82232
+ if (this.CursorIndex<0) return false;
82233
+ var kData=this.GetKData();
82234
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
82235
+
82236
+ var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
82237
+ var kItem=kData.Data[dataIndex];
82238
+ if (!kItem) return false;
82239
+
82240
+ var xItem=this.GlobalOption.LockCorssCursor.X;
82241
+ xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
82242
+ xItem.Enable=true;
82243
+ }
81928
82244
 
81929
82245
  if (option && option.Draw) this.Draw();
81930
82246
  return true;
@@ -81947,7 +82263,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
81947
82263
  if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return position;
81948
82264
 
81949
82265
  position.CursorIndex=xItem.KLine.DataIndex-kData.DataOffset;
81950
- position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex);
82266
+ position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex, false);
81951
82267
 
81952
82268
  var border=this.Frame.ChartBorder.GetBorder();
81953
82269
  if (position.LastPoint.Y<border.Top || position.LastPoint.Y>border.Bottom) //超出图形框子, 调整为收盘价
@@ -84020,18 +84336,18 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
84020
84336
  {
84021
84337
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
84022
84338
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
84023
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
84339
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} }, e);
84024
84340
 
84025
84341
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
84026
84342
  if (event)
84027
84343
  {
84028
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
84344
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} };
84029
84345
  event.Callback(event,data,this);
84030
84346
  }
84031
84347
  }
84032
84348
 
84033
84349
  //右键菜单数据
84034
- this.GetRightMenuData=function(frameID)
84350
+ this.GetRightMenuData=function(frameID, option)
84035
84351
  {
84036
84352
  var windowCount=this.Frame.SubFrame.length; //窗口个数
84037
84353
 
@@ -84158,11 +84474,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
84158
84474
  }
84159
84475
 
84160
84476
 
84161
- //删除菜单
84477
+
84162
84478
  for(var i=0;i<aryMenu.length;++i)
84163
84479
  {
84164
84480
  var item=aryMenu[i];
84165
- if (item.Name=="叠加品种")
84481
+ if (item.Name=="叠加品种") //删除菜单
84166
84482
  {
84167
84483
  for(var j=0;j<item.SubMenu.length;++j)
84168
84484
  {
@@ -84174,6 +84490,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
84174
84490
  }
84175
84491
  }
84176
84492
  }
84493
+ else if (item.Name=="其他设置")
84494
+ {
84495
+
84496
+ }
84177
84497
  }
84178
84498
 
84179
84499
  return aryMenu;