hqchart 1.1.14330 → 1.1.14340

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
  {
@@ -31274,15 +31307,7 @@ function ChartOverlayKLine()
31274
31307
 
31275
31308
  if (!this.MainData || !this.Data) return range;
31276
31309
 
31277
- var firstOpen=null; //主线数据第1个收盘价
31278
- for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length && j<xPointCount;++i,++j)
31279
- {
31280
- var data=this.MainData.Data[i];
31281
- if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
31282
- firstOpen=data.Close;
31283
- break;
31284
- }
31285
-
31310
+ var firstOpen=this.GetFirstOpen();
31286
31311
  if (firstOpen==null) return range;
31287
31312
 
31288
31313
  var firstOverlayOpen=null;
@@ -40880,7 +40905,7 @@ function ChartMultiLine()
40880
40905
  }
40881
40906
  }
40882
40907
 
40883
- // 线段集合 支持横屏
40908
+ // 多个点集合 支持横屏
40884
40909
  function ChartMultiPoint()
40885
40910
  {
40886
40911
  this.newMethod=IChartPainting; //派生
@@ -40888,98 +40913,219 @@ function ChartMultiPoint()
40888
40913
  delete this.newMethod;
40889
40914
 
40890
40915
  this.ClassName="ChartMultiPoint";
40891
- this.PointGroup=[]; // [ {Point:[ {Index, Value }, ], Color: }, ]
40916
+ this.PointGroup=[]; // [ {Point:[ {Date, Time, Value }, ], Color: }, ]
40892
40917
 
40893
40918
 
40894
40919
  this.IsHScreen=false;
40895
40920
  this.LineWidth=1;
40896
40921
  this.PointRadius=5;
40897
40922
 
40923
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
40924
+ this.GetKValue=ChartData.GetKValue;
40925
+
40926
+ this.BuildKey=function(item)
40927
+ {
40928
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
40929
+ else return item.Date;
40930
+ }
40931
+
40932
+ this.GetItem=function(kItem)
40933
+ {
40934
+ if (!this.MapCache || this.MapCache.size<=0) return null;
40935
+
40936
+ var key=this.BuildKey(kItem);
40937
+ if (!this.MapCache.has(key)) return null;
40938
+
40939
+ return this.MapCache.get(key);
40940
+ }
40941
+
40942
+ this.BuildCacheData=function()
40943
+ {
40944
+ var mapData=new Map();
40945
+ this.MapCache=mapData;
40946
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
40947
+
40948
+ for(var i=0; i<this.PointGroup.length; ++i)
40949
+ {
40950
+ var groupItem=this.PointGroup[i];
40951
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
40952
+
40953
+ var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
40954
+ if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
40955
+
40956
+ for(var j=0; j<groupItem.Point.length; ++j)
40957
+ {
40958
+ var point=groupItem.Point[j];
40959
+ var key=this.BuildKey(point);
40960
+
40961
+ var item={ Data:point, ColorConfig:clrConfig }
40962
+ if (mapData.has(key))
40963
+ {
40964
+ var mapItem=mapData.get(key);
40965
+ mapItem.Data.push(item);
40966
+ }
40967
+ else
40968
+ {
40969
+ mapData.set(key,{ Data:[item] });
40970
+ }
40971
+ }
40972
+ }
40973
+ }
40974
+
40898
40975
  this.Draw=function()
40899
40976
  {
40900
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
40901
- if (!this.Data || this.Data.length<=0) return;
40977
+ if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
40978
+ if (this.IsShowIndexTitleOnly()) return;
40979
+ if (this.IsHideScriptIndex()) return;
40980
+
40981
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
40902
40982
  if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
40983
+ if (!this.MapCache || this.MapCache.size<=0) return;
40903
40984
 
40904
40985
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
40905
40986
  var xPointCount=this.ChartFrame.XPointCount;
40906
- var offset=this.Data.DataOffset;
40907
- var pixel=GetDevicePixelRatio();
40987
+ var dataWidth=this.ChartFrame.DataWidth;
40988
+ var distanceWidth=this.ChartFrame.DistanceWidth;
40989
+ var isMinute=this.IsMinuteFrame();
40990
+
40991
+ var border=this.GetBorder();
40992
+ if (this.IsHScreen)
40993
+ {
40994
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
40995
+ var chartright=border.BottomEx;
40996
+ var chartLeft=border.TopEx;
40997
+ }
40998
+ else
40999
+ {
41000
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
41001
+ var chartright=border.RightEx;
41002
+ var chartLeft=border.LeftEx;
41003
+ }
41004
+
41005
+ //计算所有的点位置
41006
+ var mapPoint=new Map();
41007
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
41008
+ {
41009
+ var kItem=this.Data.Data[i];
41010
+ var key=this.BuildKey(kItem);
41011
+ if (!this.MapCache.has(key)) continue;
41012
+ var mapItem=this.MapCache.get(key);
41013
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
41014
+
41015
+ if (isMinute)
41016
+ {
41017
+ var x=this.ChartFrame.GetXFromIndex(j);
41018
+ }
41019
+ else
41020
+ {
41021
+ var left=xOffset;
41022
+ var right=xOffset+dataWidth;
41023
+ if (right>chartright) break;
41024
+ var x=left+(right-left)/2;
41025
+ }
41026
+
41027
+ this.CalculateItem(mapItem, kItem, x, mapPoint);
41028
+ }
41029
+
41030
+ if (mapPoint.size<=0) return;
40908
41031
 
40909
41032
  this.Canvas.save();
40910
41033
  this.ClipClient(this.IsHScreen);
40911
-
40912
- for(var i=0; i<this.PointGroup.length; ++i)
41034
+
41035
+ this.DrawAllPoint(mapPoint);
41036
+
41037
+ this.Canvas.restore();
41038
+ }
41039
+
41040
+ this.CalculateItem=function(groupItem, kItem, x, mapPoint)
41041
+ {
41042
+ for(var i=0; i<groupItem.Data.length; ++i)
40913
41043
  {
40914
- var item=this.PointGroup[i];
40915
- var color=item.Color;
40916
- var bgColor=item.BGColor;
40917
- var lineWidth=this.LineWidth;
40918
- var radius=this.PointRadius;
40919
- if (IFrameSplitOperator.IsNumber(item.LineWidth)) lineWidth=item.LineWidth;
40920
- if (IFrameSplitOperator.IsNumber(item.PointRadius)) radius=item.PointRadius;
41044
+ var item=groupItem.Data[i];
41045
+ var value=item.Data.Value;
41046
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
41047
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
41048
+
41049
+ var y=this.ChartFrame.GetYFromData(value,false);
41050
+
41051
+ var strConfig=JSON.stringify(item.ColorConfig);
41052
+ if (!mapPoint.has(strConfig)) mapPoint.set(strConfig, { AryPoint:[]});
41053
+ var mapItem=mapPoint.get(strConfig);
41054
+
41055
+ mapItem.AryPoint.push({ X:x, Y:y, Data:item });
41056
+ }
41057
+ }
41058
+
41059
+ this.DrawAllPoint=function(mapPoint)
41060
+ {
41061
+ var pixelRatio=GetDevicePixelRatio();
41062
+
41063
+ for(var mapItem of mapPoint)
41064
+ {
41065
+ var aryPoint=mapItem[1].AryPoint;
41066
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryPoint)) continue;
41067
+ var config=null;
40921
41068
  var path=new Path2D();
40922
41069
  var count=0;
40923
-
40924
- for(var j=0; j<item.Point.length; ++j)
41070
+ for(var i=0;i<aryPoint.length;++i)
40925
41071
  {
40926
- var point=item.Point[j];
40927
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
40928
-
40929
- var index=point.Index-offset;
40930
- if (index>=0 && index<xPointCount)
40931
- {
40932
- var x=this.ChartFrame.GetXFromIndex(index);
40933
- var y=this.ChartFrame.GetYFromData(point.Value, false);
41072
+ var item=aryPoint[i];
41073
+ if (!config) config=item.Data.ColorConfig;
40934
41074
 
40935
- var pointPath = new Path2D();
40936
- if (this.IsHScreen)
40937
- pointPath.arc(y,x,radius*pixel,0,360,false);
40938
- else
40939
- pointPath.arc(x,y,radius*pixel,0,360,false);
41075
+ var pointPath = new Path2D();
41076
+ if (this.IsHScreen)
41077
+ pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
41078
+ else
41079
+ pointPath.arc(item.X,item.Y,config.Radius*pixelRatio,0,360,false);
40940
41080
 
40941
- path.addPath(pointPath);
40942
- ++count;
40943
- }
41081
+ path.addPath(pointPath);
41082
+ ++count;
40944
41083
  }
40945
41084
 
40946
- if (count>0 && (bgColor || color))
41085
+ if (count>0 && config)
40947
41086
  {
40948
- this.Canvas.lineWidth=lineWidth*pixel;
40949
- this.Canvas.fillStyle=bgColor; //背景填充颜色
40950
- this.Canvas.strokeStyle=color;
41087
+ if (config.BGColor)
41088
+ {
41089
+ this.Canvas.fillStyle=config.BGColor; //背景填充颜色
41090
+ this.Canvas.fill(path);
41091
+ }
40951
41092
 
40952
- if (bgColor) this.Canvas.fill(path);
40953
- if (color) this.Canvas.stroke(path);
41093
+ if (config.Color)
41094
+ {
41095
+ this.Canvas.lineWidth=config.LineWidth*pixelRatio;
41096
+ this.Canvas.strokeStyle=config.Color;
41097
+ this.Canvas.stroke(path);
41098
+ }
40954
41099
  }
40955
-
40956
41100
  }
40957
-
40958
- this.Canvas.restore();
40959
41101
  }
40960
41102
 
40961
41103
  this.GetMaxMin=function()
40962
41104
  {
40963
41105
  var range={ Min:null, Max:null };
41106
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
41107
+ if (!this.MapCache || this.MapCache.size<=0) return;
40964
41108
  var xPointCount=this.ChartFrame.XPointCount;
40965
- var start=this.Data.DataOffset;
40966
- var end=start+xPointCount;
40967
41109
 
40968
- for(var i=0; i<this.PointGroup.length; ++i)
41110
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
40969
41111
  {
40970
- var item=this.PointGroup[i];
40971
- if (!IFrameSplitOperator.IsNonEmptyArray(item.Point)) continue;
41112
+ var kItem=this.Data.Data[i];
41113
+ var key=this.BuildKey(kItem);
41114
+ if (!this.MapCache.has(key)) continue;
41115
+ var mapItem=this.MapCache.get(key);
41116
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
40972
41117
 
40973
- for(var j=0; j<item.Point.length; ++j)
41118
+ for(k=0;k<mapItem.Data.length;++k)
40974
41119
  {
40975
- var point=item.Point[j];
40976
- if (point.Index>=start && point.Index<end)
40977
- {
40978
- if (range.Max==null) range.Max=point.Value;
40979
- else if (range.Max<point.Value) range.Max=point.Value;
40980
- if (range.Min==null) range.Min=point.Value;
40981
- else if (range.Min>point.Value) range.Min=point.Value;
40982
- }
41120
+ var item=mapItem.Data[k];
41121
+ var value=item.Data.Value;
41122
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
41123
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
41124
+
41125
+ if (range.Max==null) range.Max=value;
41126
+ else if (range.Max<value) range.Max=value;
41127
+ if (range.Min==null) range.Min=value;
41128
+ else if (range.Min>value) range.Min=value;
40983
41129
  }
40984
41130
  }
40985
41131
 
@@ -41246,6 +41392,8 @@ function ChartMultiSVGIconV2()
41246
41392
  this.IconRect=[]; //0=序号,1=区域
41247
41393
 
41248
41394
  this.MapCache=null; //key=date/date-time value={ Data:[] }
41395
+ this.GetKValue=ChartData.GetKValue;
41396
+
41249
41397
 
41250
41398
  this.BuildKey=function(item)
41251
41399
  {
@@ -41360,28 +41508,7 @@ function ChartMultiSVGIconV2()
41360
41508
 
41361
41509
  this.Canvas.restore();
41362
41510
  }
41363
-
41364
- this.GetKValue=function(kItem, valueName)
41365
- {
41366
- switch(valueName)
41367
- {
41368
- case "HIGH":
41369
- case "H":
41370
- return kItem.High;
41371
- case "L":
41372
- case "LOW":
41373
- return kItem.Low;
41374
- case "C":
41375
- case "CLOSE":
41376
- return kItem.Close;
41377
- case "O":
41378
- case "OPEN":
41379
- return KItem.Open;
41380
- default:
41381
- return null;
41382
- }
41383
- }
41384
-
41511
+
41385
41512
  this.DrawItem=function(groupItem, kItem, x, drawInfo)
41386
41513
  {
41387
41514
  if (!IFrameSplitOperator.IsNonEmptyArray(groupItem.Data)) return;
@@ -57337,24 +57464,29 @@ function DynamicChartTitlePainting()
57337
57464
 
57338
57465
  this.ForamtMultiPointTitle=function(dataIndex, dataInfo)
57339
57466
  {
57340
- if (!IFrameSplitOperator.IsNonEmptyArray(dataInfo.PointGroup)) return null;
57467
+ if (!dataInfo.GetItemCallback) return null;
57468
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
57469
+ var kItem=dataInfo.Data.Data[dataIndex];
57470
+ if (!kItem) return null;
57471
+
57472
+ var group=dataInfo.GetItemCallback(kItem);
57473
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
57341
57474
 
57342
57475
  var aryText=[];
57343
- for(var i=0;i<dataInfo.PointGroup.length;++i)
57476
+ for(var i=0;i<group.Data.length;++i)
57344
57477
  {
57345
- var groupItem=dataInfo.PointGroup[i];
57346
- for(var j=0;j<groupItem.Point.length;++j)
57347
- {
57348
- var item=groupItem.Point[j];
57349
- if (item.Index==dataIndex)
57350
- {
57351
- var item={ Text:item.Value.toFixed(2)};
57352
- if (aryText.length==0) item.Name=dataInfo.Name;
57353
- item.Color=groupItem.BGColor;
57354
- aryText.push(item);
57355
- break;
57356
- }
57357
- }
57478
+ var item=group.Data[i];
57479
+ var config=item.ColorConfig;
57480
+
57481
+ var color=null;
57482
+ if (config.BGColor) color=config.BGColor;
57483
+ else if (config.Color) color=config.Color;
57484
+
57485
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
57486
+
57487
+ var value=item.Data.Value;
57488
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
57489
+ aryText.push({ Text:this.FormatValue(value, dataInfo), Color:color});
57358
57490
  }
57359
57491
 
57360
57492
  if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
@@ -58125,6 +58257,11 @@ function DynamicChartTitlePainting()
58125
58257
  aryText=this.FromatStackedBarTitle(value, item);
58126
58258
  if (!aryText) continue;
58127
58259
  }
58260
+ else if (item.DataType=="ChartMultiPoint")
58261
+ {
58262
+ aryText=this.ForamtMultiPointTitle(dataIndex, item);
58263
+ if (!aryText) continue;
58264
+ }
58128
58265
  else
58129
58266
  {
58130
58267
  valueText=this.FormatValue(value,item);
@@ -80105,18 +80242,18 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80105
80242
  {
80106
80243
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
80107
80244
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
80108
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
80245
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio}}, e);
80109
80246
 
80110
80247
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
80111
80248
  if (event)
80112
80249
  {
80113
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
80250
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, Point:{ X:x*pixelTatio, Y:y*pixelTatio}, CursorIndex:this.CursorIndex, };
80114
80251
  event.Callback(event,data,this);
80115
80252
  }
80116
80253
  }
80117
80254
 
80118
80255
  //右键菜单数据
80119
- this.GetRightMenuData=function(frameID)
80256
+ this.GetRightMenuData=function(frameID, option)
80120
80257
  {
80121
80258
  var windowCount=this.Frame.SubFrame.length; //窗口个数
80122
80259
  var klineChart=this.ChartPaint[0];
@@ -80159,6 +80296,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80159
80296
  var bPopMinuteChart=false;
80160
80297
  if (this.PopMinuteChart) bPopMinuteChart=true;
80161
80298
 
80299
+ var kItem=null;
80300
+ if (frameID>=0 && option && IFrameSplitOperator.IsNumber(option.CursorIndex))
80301
+ {
80302
+ var kData=this.GetKData();
80303
+ if (kData && IFrameSplitOperator.IsNonEmptyArray(kData.Data))
80304
+ {
80305
+ var dataIndex=kData.DataOffset+option.CursorIndex;
80306
+ if (dataIndex>=0 && dataIndex<kData.Data.length) kItem=kData.Data[dataIndex];
80307
+ }
80308
+ }
80309
+
80162
80310
  var aryMenu=
80163
80311
  [
80164
80312
  {
@@ -80441,6 +80589,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80441
80589
  }
80442
80590
  }
80443
80591
  }
80592
+ else if (item.Name=="其他设置")
80593
+ {
80594
+ if (kItem)
80595
+ {
80596
+ var bLocked=this.IsLockCorssCursor();
80597
+ if (bLocked)
80598
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR }, Checked:bLocked });
80599
+ else
80600
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR, Args:[{ KItem:{Date:kItem.Date, Time:kItem.Time}, Draw:true }] }, Checked:bLocked });
80601
+ }
80602
+ }
80444
80603
  }
80445
80604
 
80446
80605
  return aryMenu;
@@ -82044,19 +82203,36 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82044
82203
  if (option && option.Draw) this.Draw();
82045
82204
  }
82046
82205
 
82206
+ //option={ KItem:{ Date:, Time:}}
82047
82207
  this.LockCorssCursor=function(option)
82048
82208
  {
82049
- if (this.CursorIndex<0) return false;
82050
- var kData=this.GetKData();
82051
- if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
82209
+ if (option && option.KItem) //指定日期时间
82210
+ {
82211
+ var kData=this.GetKData();
82212
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
82052
82213
 
82053
- var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
82054
- var kItem=kData.Data[dataIndex];
82055
- if (!kItem) return false;
82214
+ var kItem={ Date:option.KItem.Date, Time:option.KItem.Time, Index:-1};
82215
+ kData.FindDataIndexByDateTime([kItem]);
82216
+ if (kItem.Index<0) return false;
82056
82217
 
82057
- var xItem=this.GlobalOption.LockCorssCursor.X;
82058
- xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
82059
- xItem.Enable=true;
82218
+ var xItem=this.GlobalOption.LockCorssCursor.X;
82219
+ xItem.KLine={ DataIndex:kItem.Index, Date:kItem.Date, Time:kItem.Time };
82220
+ xItem.Enable=true;
82221
+ }
82222
+ else
82223
+ {
82224
+ if (this.CursorIndex<0) return false;
82225
+ var kData=this.GetKData();
82226
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
82227
+
82228
+ var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
82229
+ var kItem=kData.Data[dataIndex];
82230
+ if (!kItem) return false;
82231
+
82232
+ var xItem=this.GlobalOption.LockCorssCursor.X;
82233
+ xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
82234
+ xItem.Enable=true;
82235
+ }
82060
82236
 
82061
82237
  if (option && option.Draw) this.Draw();
82062
82238
  return true;
@@ -82079,7 +82255,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82079
82255
  if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return position;
82080
82256
 
82081
82257
  position.CursorIndex=xItem.KLine.DataIndex-kData.DataOffset;
82082
- position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex);
82258
+ position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex, false);
82083
82259
 
82084
82260
  var border=this.Frame.ChartBorder.GetBorder();
82085
82261
  if (position.LastPoint.Y<border.Top || position.LastPoint.Y>border.Bottom) //超出图形框子, 调整为收盘价
@@ -84152,18 +84328,18 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
84152
84328
  {
84153
84329
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
84154
84330
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
84155
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
84331
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} }, e);
84156
84332
 
84157
84333
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
84158
84334
  if (event)
84159
84335
  {
84160
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
84336
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} };
84161
84337
  event.Callback(event,data,this);
84162
84338
  }
84163
84339
  }
84164
84340
 
84165
84341
  //右键菜单数据
84166
- this.GetRightMenuData=function(frameID)
84342
+ this.GetRightMenuData=function(frameID, option)
84167
84343
  {
84168
84344
  var windowCount=this.Frame.SubFrame.length; //窗口个数
84169
84345
 
@@ -84290,11 +84466,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
84290
84466
  }
84291
84467
 
84292
84468
 
84293
- //删除菜单
84469
+
84294
84470
  for(var i=0;i<aryMenu.length;++i)
84295
84471
  {
84296
84472
  var item=aryMenu[i];
84297
- if (item.Name=="叠加品种")
84473
+ if (item.Name=="叠加品种") //删除菜单
84298
84474
  {
84299
84475
  for(var j=0;j<item.SubMenu.length;++j)
84300
84476
  {
@@ -84306,6 +84482,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
84306
84482
  }
84307
84483
  }
84308
84484
  }
84485
+ else if (item.Name=="其他设置")
84486
+ {
84487
+
84488
+ }
84309
84489
  }
84310
84490
 
84311
84491
  return aryMenu;