hqchart 1.1.13167 → 1.1.13182

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.
@@ -4211,6 +4211,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4211
4211
  chart.ModifyIndexDialog=this.ModifyIndexDialog;
4212
4212
  chart.ChangeIndexDialog=this.ChangeIndexDialog;
4213
4213
  chart.MinuteDialog=this.MinuteDialog;
4214
+
4215
+ var pixelRatio=GetDevicePixelRatio();
4214
4216
 
4215
4217
  //右键菜单
4216
4218
  if (option.IsShowRightMenu==true) chart.RightMenu=new KLineRightMenu(this.DivElement);
@@ -4429,8 +4431,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4429
4431
  chart.Frame.SubFrame[i].Frame.IsShowYText[1]=item.IsShowRightText;
4430
4432
  chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=item.IsShowRightText; //显示右边刻度
4431
4433
  }
4432
- if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace;
4433
- if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace;
4434
+ if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace*pixelRatio;
4435
+ if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace*pixelRatio;
4434
4436
 
4435
4437
  if (item.RightTextPosition>0) chart.Frame.SubFrame[i].Frame.YTextPosition[1]=item.RightTextPosition;
4436
4438
  if (item.LeftTextPosition>0) chart.Frame.SubFrame[i].Frame.YTextPosition[0]=item.LeftTextPosition;
@@ -4732,6 +4734,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4732
4734
  chart.ModifyIndexDialog=this.ModifyIndexDialog;
4733
4735
  chart.ChangeIndexDialog=this.ChangeIndexDialog;
4734
4736
 
4737
+ var pixelRatio=GetDevicePixelRatio();
4738
+
4735
4739
  var windowsCount=2;
4736
4740
  if (option.Windows && option.Windows.length>0) windowsCount+=option.Windows.length; //指标窗口从第3个窗口开始
4737
4741
  if (option.EnableScrollUpDown==true) chart.EnableScrollUpDown=option.EnableScrollUpDown;
@@ -4899,8 +4903,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4899
4903
  if (IFrameSplitOperator.IsNumber(item.YTextBaseline)) chart.Frame.SubFrame[i].Frame.YTextBaseline=item.YTextBaseline;
4900
4904
  if (IFrameSplitOperator.IsBool(item.IsShowIndexTitle)) chart.Frame.SubFrame[i].Frame.IsShowIndexTitle=item.IsShowIndexTitle;
4901
4905
 
4902
- if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace;
4903
- if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace;
4906
+ if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace*pixelRatio;
4907
+ if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace*pixelRatio;
4904
4908
 
4905
4909
  //是否显示关闭集合竞价按钮
4906
4910
  if (IFrameSplitOperator.IsNumber(item.CloseBeforeButton)) chart.Frame.SubFrame[i].Frame.IsShowCloseButton=item.CloseBeforeButton;
@@ -5573,6 +5577,13 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5573
5577
  //是否自动更新
5574
5578
  if (option.IsAutoUpdate!=null) chart.IsAutoUpdate=option.IsAutoUpdate;
5575
5579
  if (option.AutoUpdateFrequency>0) chart.AutoUpdateFrequency=option.AutoUpdateFrequency;
5580
+ //内置菜单
5581
+ if (option.EnablePopMenuV2===true)
5582
+ {
5583
+ chart.JSPopMenu=new JSPopMenu();
5584
+ chart.JSPopMenu.Inital();
5585
+ chart.EnablePopMenuV2=true;
5586
+ }
5576
5587
  //注册事件
5577
5588
  if (option.EventCallback)
5578
5589
  {
@@ -5599,19 +5610,6 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5599
5610
  this.DivElement.JSChart=this; //div中保存一份
5600
5611
  this.JSChartContainer.Draw();
5601
5612
  }
5602
-
5603
- if (IFrameSplitOperator.IsBool(option.CheckLatestVerion) && option.CheckLatestVerion==false)
5604
- {
5605
-
5606
- }
5607
- else if (JSChart.LastVersion==null)
5608
- {
5609
- if (chart && typeof(chart.GetLatestVersion)=='function')
5610
- {
5611
- //由于域名都要备案,获取最新版本接口停止使用
5612
- //chart.GetLatestVersion();
5613
- }
5614
- }
5615
5613
  }
5616
5614
 
5617
5615
  //创建工具条
@@ -6055,6 +6053,15 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
6055
6053
  return this.JSChartContainer.ChangePriceGap(option);
6056
6054
  }
6057
6055
  }
6056
+
6057
+ this.PopupMenuByTab=function(menuData, rtTab)
6058
+ {
6059
+ if(this.JSChartContainer && typeof(this.JSChartContainer.PopupMenuByTab)=='function')
6060
+ {
6061
+ JSConsole.Chart.Log('[JSChart:ChangePriceGap] ');
6062
+ return this.JSChartContainer.PopupMenuByTab(menuData, rtTab);
6063
+ }
6064
+ }
6058
6065
  }
6059
6066
 
6060
6067
  JSChart.LastVersion=null; //最新的版本号
@@ -6260,6 +6267,12 @@ JSChart.ToFixedRect=function(value)
6260
6267
  return ToFixedRect(value);
6261
6268
  }
6262
6269
 
6270
+ JSChart.GetScrollPosition=function()
6271
+ {
6272
+ return GetScrollPosition();
6273
+ }
6274
+
6275
+
6263
6276
 
6264
6277
 
6265
6278
  var JSCHART_EVENT_ID=
@@ -6545,6 +6558,36 @@ var JSCHART_WORKER_MESSAGE_ID=
6545
6558
  ERROR_EXECUTE_SCRIPT:3,
6546
6559
  }
6547
6560
 
6561
+ var JSCHART_MENU_ID=
6562
+ {
6563
+ CMD_CHANGE_PERIOD_ID:1, //切换周期
6564
+ CMD_CHANGE_WINDOW_COUNT_ID:2, //窗口个数
6565
+ CMD_CHANGE_RIGHT_ID:3, //复权
6566
+ CMD_CHANGE_INDEX_ID:4, //切换指标
6567
+ CMD_CHANGE_COLOR_INDEX_ID:5, //五彩K线指标
6568
+ CMD_CHANGE_TRADE_INDEX_ID:6, //专家系统(交易指标)
6569
+ CMD_DELETE_COLOR_INDEX_ID:7, //删除五彩K线指标
6570
+ CMD_DELETE_TRADE_INDEX_ID:8, //删除专家系统(交易指标)
6571
+ CMD_CHANGE_KLINE_TYPE_ID:9, //切换K线类型
6572
+ CMD_CHANGE_PRICE_GAP_ID:10, //缺口提示
6573
+ CMD_OVERLAY_SYMBOL_ID:11, //叠加品种
6574
+ CMD_DELETE_ALL_OVERLAY_SYMBOL_ID:12, //删除所有叠加品种
6575
+ CMD_CHANGE_COORDINATETYPE_ID:13, //切换坐标类型
6576
+ CMD_CHANGE_KLINE_INFO_ID:14, //切换信息地雷
6577
+ CMD_DELETE_ALL_KLINE_INFO_ID:15, //清空信息地雷
6578
+ CMD_CHANGE_DRAG_MODE_ID:16, //切换拖动模式
6579
+ CMD_CHANGE_BG_SPLIT_ID:17, //背景分割
6580
+
6581
+ CMD_SHOW_DRAWTOOL_ID:18, //画图工具
6582
+ CMD_HIDE_DRAWTOOL_ID:19,
6583
+
6584
+ CMD_SHOW_STOCKCHIP_ID:20, //筹码分布
6585
+ CMD_HIDE_STOCKCHIP_ID:21,
6586
+
6587
+ CMD_ENABLE_SELECT_RECT_ID:22, //启动区间选择
6588
+ CMD_CHANGE_DAY_COUNT_ID:23, //切换天数
6589
+ }
6590
+
6548
6591
 
6549
6592
  function PhoneDBClick()
6550
6593
  {
@@ -6630,6 +6673,11 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
6630
6673
  this.LoadDataSplashTitle="数据加载中"; //下载数据提示信息
6631
6674
  this.DefaultCursor="default"; //crosshair , default 默认手型
6632
6675
 
6676
+ this.EnablePopMenuV2=false;
6677
+ this.JSPopMenu; //内置菜单
6678
+ //this.JSPopMenu=new JSPopMenu(); //内置菜单
6679
+ //this.JSPopMenu.Inital();
6680
+
6633
6681
  //绘图缓存
6634
6682
  this.CacheCanvas=null;
6635
6683
  this.CacheElement=null;
@@ -6825,61 +6873,10 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
6825
6873
  {
6826
6874
  this.IsDestroy=true;
6827
6875
  this.StopAutoUpdate();
6828
-
6829
- if (this.GetLatestVersionTimer!=null)
6830
- {
6831
- clearTimeout(this.GetLatestVersionTimer);
6832
- this.GetLatestVersionTimer=null;
6833
- }
6834
6876
  }
6835
6877
 
6836
6878
  this.ChartDestory=this.ChartDestroy; //老版本写错了,需要兼容下
6837
6879
 
6838
-
6839
- this.GetLatestVersionTimer=null; //获取最新版本
6840
- this.GetLatestVersion=function()
6841
- {
6842
- if (this.GetLatestVersionTimer!=null)
6843
- {
6844
- clearTimeout(this.GetLatestVersionTimer);
6845
- this.GetLatestVersionTimer=null;
6846
- }
6847
-
6848
- var roundeTime=Math.floor(Math.random()*50);
6849
- var waittimer=1000*60*3+(roundeTime*1000);
6850
- var value="aHR0cHM6Ly9ocWNoYXJ0LnplYWxpbmsuY29tL2FwaS9HZXRWZXJzaW9u";
6851
- JSConsole.Chart.Log("[JSChartContainer::GetLatestVersion] wait for get hqchart latest version. ",waittimer);
6852
- this.GetLatestVersionTimer = setTimeout(()=>
6853
- {
6854
- var width=0, height=0;
6855
- if (this.Frame && this.Frame.ChartBorder)
6856
- {
6857
- width=this.Frame.ChartBorder.GetChartWidth();
6858
- height=this.Frame.ChartBorder.GetChartHeight();
6859
- }
6860
-
6861
- var url=`${atob(value)}?width=${width}&height=${height}&type=h5`;
6862
-
6863
- if (JSChart.LastVersion!=null) return; //只请求一次
6864
-
6865
- JSNetwork.HttpRequest({
6866
- url: url,
6867
- type:"get",
6868
- dataType: "json",
6869
- async:true,
6870
- success:function(data)
6871
- {
6872
- JSConsole.Chart.Log("[JSChartContainer::GetLatestVersion] hqchart latest version. ",data);
6873
- JSChart.LastVersion=data;
6874
- },
6875
- error:function(request, textStatus, errorThrown)
6876
- {
6877
- JSConsole.Chart.Log("[JSChartContainer::GetLatestVersion] Get HQChart latest version failed.", request);
6878
- }
6879
- });
6880
- }, waittimer);
6881
- }
6882
-
6883
6880
  //设置焦点
6884
6881
  this.SetFocus=function()
6885
6882
  {
@@ -9171,10 +9168,13 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9171
9168
  var item=this.ChartDrawPicture[i];
9172
9169
  if (item.IsDrawFirst) continue;
9173
9170
  if (item.IsDrawMain && item.IsDrawMain()) continue;
9171
+ if (this.SelectChartDrawPicture && this.SelectChartDrawPicture.Guid==item.Guid) continue; //当前选中在最后画
9174
9172
 
9175
9173
  item.Draw();
9176
9174
  }
9177
9175
 
9176
+ if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.Draw();
9177
+
9178
9178
  if (this.CurrentChartDrawPicture && this.CurrentChartDrawPicture.Status!=10)
9179
9179
  {
9180
9180
  this.CurrentChartDrawPicture.Draw();
@@ -9614,10 +9614,16 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9614
9614
  var item=this.ChartDrawPicture[i];
9615
9615
  if (item.IsDrawFirst) continue;
9616
9616
  if (item.IsDrawMain && item.IsDrawMain()) continue;
9617
+ if (this.SelectChartDrawPicture &&item.Guid==this.SelectChartDrawPicture.Guid) continue; //选中画图最后画 确保显示在最外面
9617
9618
 
9618
9619
  item.Draw(moveonPoint, this.LastMouseStatus);
9619
9620
  }
9620
9621
 
9622
+ if (this.SelectChartDrawPicture)
9623
+ {
9624
+ this.SelectChartDrawPicture.Draw(moveonPoint, this.LastMouseStatus);
9625
+ }
9626
+
9621
9627
  if (this.CurrentChartDrawPicture && this.CurrentChartDrawPicture.Status!=10)
9622
9628
  {
9623
9629
  this.CurrentChartDrawPicture.Draw();
@@ -12929,6 +12935,213 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
12929
12935
  }
12930
12936
  }
12931
12937
  }
12938
+
12939
+ this.PopupMenuByTab=function(menuData, rtTab)
12940
+ {
12941
+ if (!this.JSPopMenu) return;
12942
+
12943
+ var pixelRatio=GetDevicePixelRatio();
12944
+ var rtCell={ Left:rtTab.Left/pixelRatio, Right:rtTab.Right/pixelRatio, Bottom:rtTab.Bottom/pixelRatio, Top:rtTab.Top/pixelRatio };
12945
+ rtCell.Width=rtCell.Right-rtCell.Left;
12946
+ rtCell.Height=rtCell.Bottom-rtCell.Top;
12947
+
12948
+ var rtClient=this.UIElement.getBoundingClientRect();
12949
+ var rtScroll=GetScrollPosition();
12950
+
12951
+ var offsetLeft=rtClient.left+rtScroll.Left;
12952
+ var offsetTop=rtClient.top+rtScroll.Top;
12953
+ rtCell.Left+=offsetLeft;
12954
+ rtCell.Right+=offsetLeft;
12955
+ rtCell.Top+=offsetTop;
12956
+ rtCell.Bottom+=offsetTop;
12957
+
12958
+ this.JSPopMenu.CreatePopMenu(menuData);
12959
+ this.JSPopMenu.PopupMenuByTab(rtCell);
12960
+ }
12961
+
12962
+ this.PopuMenuByRClick=function(menuData, x, y)
12963
+ {
12964
+ var rtClient=this.UIElement.getBoundingClientRect();
12965
+ var rtScroll=GetScrollPosition();
12966
+
12967
+ x+=rtClient.left+rtScroll.Left;
12968
+ y+=rtClient.top+rtScroll.Top;
12969
+
12970
+ this.JSPopMenu.CreatePopMenu(menuData);
12971
+ this.JSPopMenu.PopupMenuByRight(x,y);
12972
+ }
12973
+
12974
+ //点击右键菜单
12975
+ this.OnClickRightMenu=function(data)
12976
+ {
12977
+ JSConsole.Chart.Log('[JSChartContainer::OnClickRightMenu] ',data);
12978
+ if (!data || !data.Data) return;
12979
+
12980
+ var cmdID=data.Data.ID; //命令ID
12981
+ var aryArgs=data.Data.Args; //参数
12982
+ var param=null, srcParam=null; //原始值
12983
+ if (IFrameSplitOperator.IsNonEmptyArray(aryArgs))
12984
+ {
12985
+ srcParam=aryArgs[0];
12986
+ if (IFrameSplitOperator.IsNumber(aryArgs[0])) param=aryArgs[0];
12987
+ }
12988
+
12989
+ switch(cmdID)
12990
+ {
12991
+ case JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID:
12992
+ if (this.ChangePeriod && param!=null)
12993
+ this.ChangePeriod(param);
12994
+ break;
12995
+ case JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID:
12996
+ if (this.ChangeIndexWindowCount && param!=null)
12997
+ this.ChangeIndexWindowCount(param);
12998
+ break;
12999
+ case JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID:
13000
+ if (this.ChangeRight && param!=null)
13001
+ this.ChangeRight(param);
13002
+ break;
13003
+ case JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID:
13004
+ if (this.ChangeIndex && param!=null && aryArgs[1])
13005
+ this.ChangeIndex(param,aryArgs[1]);
13006
+ break;
13007
+
13008
+ case JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID:
13009
+ case JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID:
13010
+ if (this.ChangeInstructionIndex && aryArgs[0])
13011
+ this.ChangeInstructionIndex(aryArgs[0]);
13012
+ break;
13013
+ case JSCHART_MENU_ID.CMD_DELETE_COLOR_INDEX_ID: //删除五彩K线指标
13014
+ case JSCHART_MENU_ID.CMD_DELETE_TRADE_INDEX_ID: //删除专家系统(交易指标)
13015
+ if (this.CancelInstructionIndex) this.CancelInstructionIndex();
13016
+ break;
13017
+ case JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID: //切换K线类型
13018
+ if (this.ChangeKLineDrawType && param!=null)
13019
+ this.ChangeKLineDrawType(param,aryArgs[1],aryArgs[2]);
13020
+ break;
13021
+ case JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID: //缺口提示
13022
+ if (this.ChangePriceGap && IFrameSplitOperator.IsBool(aryArgs[0]))
13023
+ {
13024
+ if (aryArgs[0]==false)
13025
+ {
13026
+ this.ChangePriceGap({ Enable:aryArgs[0] });
13027
+ }
13028
+ else
13029
+ {
13030
+ if (IFrameSplitOperator.IsNumber(aryArgs[1]))
13031
+ this.ChangePriceGap({ Enable:aryArgs[0], Count:aryArgs[1] });
13032
+ }
13033
+ }
13034
+ break;
13035
+ case JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID:
13036
+ if (aryArgs[1]===true)
13037
+ {
13038
+ if (this.OverlaySymbol && aryArgs[0]) this.OverlaySymbol(aryArgs[0]);
13039
+ }
13040
+ else if (aryArgs[1]===false)
13041
+ {
13042
+ if (this.DeleteOverlaySymbol && aryArgs[0]) this.DeleteOverlaySymbol(aryArgs[0]);
13043
+ }
13044
+ break;
13045
+ case JSCHART_MENU_ID.CMD_DELETE_ALL_OVERLAY_SYMBOL_ID:
13046
+ if (this.ClearOverlaySymbol) this.ClearOverlaySymbol();
13047
+ break;
13048
+ case JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID:
13049
+ if (this.ChangeCoordinateType && aryArgs[0]) this.ChangeCoordinateType(aryArgs[0]);
13050
+ break;
13051
+ case JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID:
13052
+ if (aryArgs[0] && IFrameSplitOperator.IsBool(aryArgs[1]))
13053
+ {
13054
+ if (aryArgs[1]==true && this.AddKLineInfo) this.AddKLineInfo(aryArgs[0],true);
13055
+ else if (aryArgs[1]==false && this.DeleteKLineInfo) this.DeleteKLineInfo(aryArgs[0]);
13056
+ }
13057
+ break;
13058
+ case JSCHART_MENU_ID.CMD_DELETE_ALL_KLINE_INFO_ID:
13059
+ if (this.ClearKLineInfo) this.ClearKLineInfo();
13060
+ break;
13061
+ case JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID:
13062
+ if (param!=null) this.DragMode=param;
13063
+ break;
13064
+ case JSCHART_MENU_ID.CMD_CHANGE_BG_SPLIT_ID:
13065
+ if (IFrameSplitOperator.IsBool(srcParam))
13066
+ {
13067
+ if (srcParam)
13068
+ {
13069
+ this.CreateExtendChart("SessionBreaksPaint", { });
13070
+ this.Draw();
13071
+ }
13072
+ else
13073
+ {
13074
+ var finder=this.GetExtendChartByClassName("SessionBreaksPaint");
13075
+ if (finder)
13076
+ {
13077
+ this.DeleteExtendChartByID(finder.Chart.ID);
13078
+ this.Draw();
13079
+ }
13080
+ }
13081
+ }
13082
+ break;
13083
+ case JSCHART_MENU_ID.CMD_SHOW_DRAWTOOL_ID:
13084
+ var option={Name:'画图工具', Top:this.Frame.ChartBorder.Top };
13085
+ var extendChart=this.CreateExtendChart(option.Name, option); //创建扩展图形
13086
+ this.SetSizeChange(true);
13087
+ this.Draw();
13088
+ break;
13089
+ case JSCHART_MENU_ID.CMD_HIDE_DRAWTOOL_ID:
13090
+ var drawTools=this.GetExtendChartByClassName('DrawToolsButton');
13091
+ if (drawTools)
13092
+ {
13093
+ var toolsWidth=drawTools.Chart.Width;
13094
+ var toolsIndex=parseInt(drawTools.Index);
13095
+ for(var i=toolsIndex+1; i<this.ExtendChartPaint.length; ++i) //在画图工具后面创建的需要减去工具的宽度
13096
+ {
13097
+ var item=this.ExtendChartPaint[i];
13098
+ if (item.ClassName=='StockChip')
13099
+ {
13100
+ item.Left-=toolsWidth;
13101
+ }
13102
+ }
13103
+ this.DeleteExtendChart(drawTools);
13104
+ this.Frame.ChartBorder.Right-=toolsWidth;
13105
+ this.SetSizeChange(true);
13106
+ this.Draw();
13107
+ }
13108
+ break;
13109
+ case JSCHART_MENU_ID.CMD_SHOW_STOCKCHIP_ID:
13110
+ var option={Name:'筹码分布', ShowType:1, Width:230 };
13111
+ var extendChart=this.CreateExtendChart(option.Name, option); //创建扩展图形
13112
+ this.SetSizeChange(true);
13113
+ this.Draw();
13114
+ break;
13115
+ case JSCHART_MENU_ID.CMD_HIDE_STOCKCHIP_ID:
13116
+ var StockChip=chart.GetExtendChartByClassName('StockChip');
13117
+ if (StockChip)
13118
+ {
13119
+ var chipWidth=StockChip.Chart.Width;
13120
+ var chipIndex=parseInt(StockChip.Index);
13121
+ for(var i=chipIndex+1; i<this.ExtendChartPaint.length; ++i) //在筹码后面创建的需要筹码的宽度
13122
+ {
13123
+ var item=this.ExtendChartPaint[i];
13124
+ if (item.ClassName=='DrawToolsButton')
13125
+ {
13126
+ item.Left-=chipWidth;
13127
+ }
13128
+ }
13129
+ this.DeleteExtendChart(StockChip);
13130
+ this.Frame.ChartBorder.Right-=chipWidth;
13131
+ this.SetSizeChange(true);
13132
+ this.Draw();
13133
+ }
13134
+ break;
13135
+ case JSCHART_MENU_ID.CMD_ENABLE_SELECT_RECT_ID:
13136
+ if (IFrameSplitOperator.IsBool(srcParam))
13137
+ this.EnableSelectRect=srcParam;
13138
+ break;
13139
+ case JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID:
13140
+ if (this.ChangeDayCount && param!=null)
13141
+ this.ChangeDayCount(param);
13142
+ break;
13143
+ }
13144
+ }
12932
13145
  }
12933
13146
 
12934
13147
  function GetDevicePixelRatio()
@@ -13026,11 +13239,12 @@ function GetScrollPosition()
13026
13239
  var scrollPos={};
13027
13240
  var scrollTop=0;
13028
13241
  var scrollLeft=0;
13029
- if(document.documentElement && document.documentElement.scrollTop)
13242
+ if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft))
13030
13243
  {
13031
13244
  scrollTop=document.documentElement.scrollTop;
13032
13245
  scrollLeft=document.documentElement.scrollLeft;
13033
- }else if(document.body)
13246
+ }
13247
+ else if(document.body)
13034
13248
  {
13035
13249
  scrollTop=document.body.scrollTop;
13036
13250
  scrollLeft=document.body.scrollLeft;
@@ -47994,7 +48208,8 @@ function FrameButtomToolbarPaint()
47994
48208
  this.Canvas.fillRect(rtBG.Left,rtBG.Top,rtBG.Width,rtBG.Height);
47995
48209
  }
47996
48210
 
47997
- var font=this.TitleFont(rtBG.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom);
48211
+ var font=this.GetTitleFont(rtBG.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom);
48212
+ var svgFont=this.GetSVGFont(rtBG.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom);
47998
48213
  this.Canvas.textBaseline='middle';
47999
48214
  this.Canvas.textAlign='center';
48000
48215
  this.Canvas.font=font;
@@ -48002,9 +48217,23 @@ function FrameButtomToolbarPaint()
48002
48217
  for(var i=0;i<this.AryButton.length;++i)
48003
48218
  {
48004
48219
  var item=this.AryButton[i];
48005
- if (!item.Title) return;
48006
- var textWidth=this.Canvas.measureText(item.Title).width+2;
48007
- var buttonWidth=textWidth+this.ButtonConfig.Mergin.Left+this.ButtonConfig.Mergin.Right;
48220
+ if (!item.Title && !(item.SVGButton && item.SVGButton.Symbol)) return;
48221
+
48222
+ var textWidth=0;
48223
+ if (item.Title)
48224
+ {
48225
+ textWidth=this.Canvas.measureText(item.Title).width+2;
48226
+ }
48227
+
48228
+ var svgButtonWidth=0;
48229
+ if (item.SVGButton && item.SVGButton.Symbol)
48230
+ {
48231
+ svgButtonWidth=this.ButtonConfig.SVG.Size;
48232
+ if (textWidth>0) svgButtonWidth+=this.ButtonConfig.SVG.MerginLeft;
48233
+
48234
+ }
48235
+
48236
+ var buttonWidth=textWidth+svgButtonWidth+this.ButtonConfig.Mergin.Left+this.ButtonConfig.Mergin.Right;
48008
48237
  var rtButton={ Left:xBotton, Top:rtBG.Top, Bottom:rtBG.Bottom, Height:rtBG.Height, Width:buttonWidth };
48009
48238
  rtButton.Right=rtButton.Left+rtButton.Width;
48010
48239
 
@@ -48041,12 +48270,50 @@ function FrameButtomToolbarPaint()
48041
48270
  this.Canvas.stroke();
48042
48271
  }
48043
48272
 
48044
- this.Canvas.fillStyle=titleColor;
48045
- var xText=rtButton.Left+rtButton.Width/2; //居中
48046
- var yText=rtButton.Top+this.ButtonConfig.Mergin.Top+(rtButton.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom)/2;
48047
- this.Canvas.fillText(item.Title,xText,yText);
48273
+ if (item.Title)
48274
+ {
48275
+ this.Canvas.fillStyle=titleColor;
48276
+ var xText=rtButton.Left+(rtButton.Width-svgButtonWidth)/2; //居中
48277
+ var yText=rtButton.Top+this.ButtonConfig.Mergin.Top+(rtButton.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom)/2;
48278
+ this.Canvas.fillText(item.Title,xText,yText);
48279
+ }
48280
+
48281
+
48282
+ var rtSVG=null;
48283
+ if (item.SVGButton && item.SVGButton.Symbol)
48284
+ {
48285
+ this.Canvas.font=svgFont;
48286
+ this.Canvas.fillStyle=titleColor;
48287
+ var xText=rtButton.Right-this.ButtonConfig.SVG.Size/2-this.ButtonConfig.Mergin.Right;
48288
+ this.Canvas.fillText(item.SVGButton.Symbol,xText,yText);
48289
+ this.Canvas.font=font;
48290
+
48291
+ rtSVG={Left:rtButton.Right-this.ButtonConfig.Mergin.Right-this.ButtonConfig.SVG.Size, Top:rtButton.Top, Width:this.ButtonConfig.SVG.Size, Height:this.ButtonConfig.SVG.Size};
48292
+ rtSVG.Right=rtSVG.Left+rtSVG.Width;
48293
+ rtSVG.Bottom=rtSVG.Top+rtSVG.Height;
48294
+ }
48295
+
48296
+ //{ Rect:rtButton, ID:item.ID, Data:item, RectSVG:rtSVG }
48297
+ if (textWidth>0 && svgButtonWidth>0)
48298
+ {
48299
+ var rtText={ Left:rtButton.Left, Top:rtButton.Top, Bottom:rtButton.Bottom };
48300
+ rtText.Right=rtText.Left+textWidth+this.ButtonConfig.Mergin.Left+this.ButtonConfig.SVG.MerginLeft/2;
48301
+ var cacheItem={ Rect:rtText, ID:item.ID, Data:item, RectCell:rtButton, ButtonType:0 };
48302
+ this.AryRectButton.push(cacheItem);
48303
+
48304
+ var rtSVG={Left:rtText.Right, Right:rtButton.Right, Top:rtButton.Top, Bottom:rtButton.Bottom };
48305
+ var cacheItem={ Rect:rtSVG, ID:item.ID, Data:item, RectCell:rtButton, ButtonType:1 };
48306
+ this.AryRectButton.push(cacheItem);
48307
+ }
48308
+ else
48309
+ {
48310
+ var cacheItem={ Rect:rtButton, ID:item.ID, Data:item, RectCell:rtButton }; //RectCell 全部的大小
48311
+ if (textWidth>0) cacheItem.ButtonType=0;
48312
+ else if (svgButtonWidth>0) cacheItem.ButtonType=1;
48313
+ this.AryRectButton.push(cacheItem);
48314
+ }
48315
+
48048
48316
 
48049
- this.AryRectButton.push({ Rect:rtButton, ID:item.ID, Data:item });
48050
48317
 
48051
48318
  xBotton+=buttonWidth+1;
48052
48319
  }
@@ -48075,13 +48342,22 @@ function FrameButtomToolbarPaint()
48075
48342
  return null;
48076
48343
  }
48077
48344
 
48078
- this.TitleFont=function(height)
48345
+ this.GetTitleFont=function(height)
48079
48346
  {
48080
48347
  var config=this.ButtonConfig.Font;
48081
- var fontSize=height;
48348
+ var fontSize=height*GetDevicePixelRatio();
48082
48349
  if (IFrameSplitOperator.IsPlusNumber(config.Size)) fontSize=config.Size;
48083
48350
 
48084
- var font=`${fontSize*GetDevicePixelRatio()}px ${config.Family}`;
48351
+ var font=`${fontSize}px ${config.Family}`;
48352
+ return font;
48353
+ }
48354
+
48355
+ this.GetSVGFont=function(height)
48356
+ {
48357
+ var config=this.ButtonConfig.SVG;
48358
+ var fontSize=height*GetDevicePixelRatio();
48359
+ if (IFrameSplitOperator.IsPlusNumber(config.Size)) fontSize=config.Size;
48360
+ var font=`${fontSize}px ${config.Family}`;
48085
48361
  return font;
48086
48362
  }
48087
48363
 
@@ -48094,7 +48370,7 @@ function FrameButtomToolbarPaint()
48094
48370
  if (x>rect.Left && x<rect.Right && y>rect.Top && y<rect.Bottom)
48095
48371
  {
48096
48372
  var frame=this.GetFrame();
48097
- var result={ ID:item.Data.ID, Rect:rect, FrameID:this.FrameID, Frame:frame, Data:item.Data };
48373
+ var result={ ID:item.Data.ID, Rect:rect, FrameID:this.FrameID, Frame:frame, Data:item.Data, ButtonType:item.ButtonType, RectCell:item.RectCell, };
48098
48374
  return result;
48099
48375
  }
48100
48376
  }
@@ -57435,7 +57711,7 @@ function IChartDrawPicture()
57435
57711
  if (option.LineWidth>0) this.LineWidth=option.LineWidth;
57436
57712
  if (option.AreaColor) this.AreaColor=option.AreaColor;
57437
57713
  if (option.PointColor) this.PointColor=option.PointColor;
57438
- if (option.MoveOnPointColor) this.SelectPointColor=option.PointColor;
57714
+ if (option.MoveOnPointColor) this.MoveOnPointColor=option.MoveOnPointColor;
57439
57715
  if (option.PointRadius) this.PointRadius=option.PointRadius;
57440
57716
  if (IFrameSplitOperator.IsNumber(option.SquareSize)) this.SquareSize=option.SquareSize;
57441
57717
  if (IFrameSplitOperator.IsBool(option.IsShowPoint)) this.IsShowPoint=option.IsShowPoint;
@@ -57634,8 +57910,8 @@ function IChartDrawPicture()
57634
57910
  for(var i=0; i<this.Point.length; ++i)
57635
57911
  {
57636
57912
  var item=this.Point[i];
57637
- var xValue=parseInt(this.Frame.GetXData(item.Y));
57638
- var yValue=this.Frame.GetYData(item.X);
57913
+ var xValue=parseInt(this.Frame.GetXData(item.Y,false));
57914
+ var yValue=this.Frame.GetYData(item.X,false);
57639
57915
 
57640
57916
  var valueItem={ XValue:xValue, YValue:yValue };
57641
57917
  var minuteItem=data.Data[xValue];
@@ -57649,8 +57925,8 @@ function IChartDrawPicture()
57649
57925
  for(var i=0; i<this.Point.length; ++i)
57650
57926
  {
57651
57927
  var item=this.Point[i];
57652
- var xValue=parseInt(this.Frame.GetXData(item.X));
57653
- var yValue=this.Frame.GetYData(item.Y);
57928
+ var xValue=parseInt(this.Frame.GetXData(item.X,false));
57929
+ var yValue=this.Frame.GetYData(item.Y,false);
57654
57930
 
57655
57931
  if (xValue>=data.Data.length) //超过当前数据,直接读固定时间
57656
57932
  {
@@ -57725,7 +58001,7 @@ function IChartDrawPicture()
57725
58001
  }
57726
58002
 
57727
58003
  data.FindDataIndexByDateTime(aryDateTime);
57728
- for(var i in aryDateTime)
58004
+ for(var i=0; i<aryDateTime.length; ++i)
57729
58005
  {
57730
58006
  var findItem=aryDateTime[i];
57731
58007
  var valueItem=this.Value[i];
@@ -57733,6 +58009,17 @@ function IChartDrawPicture()
57733
58009
  }
57734
58010
  }
57735
58011
 
58012
+ //重置X索引数据
58013
+ this.ResetXValue=function()
58014
+ {
58015
+ for(var i=0; i<this.Value.length; ++i)
58016
+ {
58017
+ var item=this.Value[i];
58018
+ item.XValue=null;
58019
+ }
58020
+ return true;
58021
+ }
58022
+
57736
58023
  //xStep,yStep 移动的偏移量
57737
58024
  this.Move=function(xStep,yStep)
57738
58025
  {
@@ -57858,6 +58145,8 @@ function IChartDrawPicture()
57858
58145
  for(var i=0; i<this.Value.length; ++i)
57859
58146
  {
57860
58147
  var item=this.Value[i];
58148
+ if (!IFrameSplitOperator.IsNumber(item.XValue)) return null; //无效索引 不显示
58149
+
57861
58150
  var dataIndex=item.XValue-data.DataOffset;
57862
58151
  if (dataIndex<0 || dataIndex>=showCount) ++invaildX;
57863
58152
 
@@ -58928,7 +59217,7 @@ function ChartDrawPictureLine()
58928
59217
  if (this.IsFrameMinSize()) return;
58929
59218
  if (!this.IsShow) return;
58930
59219
 
58931
- var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:true} );
59220
+ var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:false} );
58932
59221
  if (!drawPoint) return;
58933
59222
  if (drawPoint.length!=2) return;
58934
59223
 
@@ -68761,12 +69050,14 @@ function JSChartResource()
68761
69050
  BorderColor:"rgb(204,204,204)",
68762
69051
  Button:
68763
69052
  {
68764
- Font:{ Family:"微软雅黑" },
69053
+ Font:{ Family:"微软雅黑", Size:12*GetDevicePixelRatio() },
68765
69054
  TitleColor: { Selected:"rgb(255,255,255)", Default:"rgb(125,125,125)", MoveOn:"rgb(234,85,4)" },
68766
69055
  BGColor: { Selected:"rgb(234,85,4)", Default:"rgb(235,235,235)", MoveOn:"rgb(242,242,242)" },
68767
69056
  BorderColor:"rgb(204,204,204)",
68768
69057
 
68769
- Mergin: { Left:5*GetDevicePixelRatio(), Right:5*GetDevicePixelRatio(), Top:4*GetDevicePixelRatio(), Bottom:2*GetDevicePixelRatio() }
69058
+ Mergin: { Left:5*GetDevicePixelRatio(), Right:5*GetDevicePixelRatio(), Top:4*GetDevicePixelRatio(), Bottom:2*GetDevicePixelRatio() },
69059
+
69060
+ SVG:{ Family:"iconfont", Size:12*GetDevicePixelRatio(), MerginLeft:4*GetDevicePixelRatio() }
68770
69061
  }
68771
69062
  }
68772
69063
 
@@ -69785,6 +70076,15 @@ function JSChartResource()
69785
70076
  if (IFrameSplitOperator.IsNumber(item.Top)) destItem.Top=item.Top;
69786
70077
  if (IFrameSplitOperator.IsNumber(item.Bottom)) destItem.Bottom=item.Bottom;
69787
70078
  }
70079
+
70080
+ if (button.SVG)
70081
+ {
70082
+ var item=button.SVG;
70083
+ var destItem=this.FrameButtomToolbar.Button.SVG;
70084
+ if (IFrameSplitOperator.IsNumber(item.Size)) destItem.Size=item.Size;
70085
+ if (IFrameSplitOperator.IsNumber(item.MerginLeft)) destItem.MerginLeft=item.MerginLeft;
70086
+ if (item.Family) destItem.Family=item.Family;
70087
+ }
69788
70088
  }
69789
70089
 
69790
70090
  }
@@ -76096,12 +76396,16 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76096
76396
  }
76097
76397
  }
76098
76398
 
76099
-
76100
76399
  //注册鼠标右键事件
76101
76400
  this.OnRightMenu=function(x,y,e)
76102
76401
  {
76103
76402
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
76104
- if (this.RightMenu)
76403
+ if (this.EnablePopMenuV2)
76404
+ {
76405
+ var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
76406
+ this.PopuRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
76407
+ }
76408
+ else if (this.RightMenu)
76105
76409
  {
76106
76410
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
76107
76411
  e.data={ Chart:this, FrameID:frameId };
@@ -76117,11 +76421,286 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76117
76421
  }
76118
76422
  }
76119
76423
 
76424
+ //右键菜单数据
76425
+ this.GetRightMenuData=function(frameID)
76426
+ {
76427
+ var windowCount=this.Frame.SubFrame.length; //窗口个数
76428
+ var klineChart=this.ChartPaint[0];
76429
+ var priceGap=klineChart.PriceGap; //缺口配置信息
76430
+ var coordinateType=null, yCoordinateType=null; //坐标类型
76431
+ var mainFrame=null;
76432
+ if (this.Frame.SubFrame[0] && this.Frame.SubFrame[0].Frame) mainFrame=this.Frame.SubFrame[0].Frame;
76433
+ if (mainFrame)
76434
+ {
76435
+ coordinateType=mainFrame.CoordinateType;
76436
+ if (mainFrame.YSplitOperator) yCoordinateType=mainFrame.YSplitOperator.CoordinateType;
76437
+ }
76438
+
76439
+ var aryKLineInfo=[]; //信息地雷
76440
+ for(var i=0;i<this.ChartInfo.length;++i)
76441
+ {
76442
+ var item=this.ChartInfo[i];
76443
+ if (item && item.ClassName) aryKLineInfo.push(item.ClassName);
76444
+ }
76445
+
76446
+ var aryOverlaySymbol=[]; //叠加的股票列表
76447
+ for(var i=0; i<this.OverlayChartPaint.length; ++i)
76448
+ {
76449
+ var item=this.OverlayChartPaint[i];
76450
+ if (item && item.Symbol) aryOverlaySymbol.push(item.Symbol)
76451
+ }
76452
+
76453
+ var bBGSpit=false, bShowDrawTool=false, bShowStockChip=false;
76454
+ if (this.GetExtendChartByClassName("SessionBreaksPaint")) bBGSpit=true;
76455
+ if (this.GetExtendChartByClassName('DrawToolsButton')) bShowDrawTool=true; //画图工具
76456
+ if (this.GetExtendChartByClassName('StockChip')) bShowStockChip=true; //筹码
76457
+
76458
+ var aryMenu=
76459
+ [
76460
+ {
76461
+ Name:"分析周期",
76462
+ SubMenu:
76463
+ [
76464
+ { Name:"日线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[0] }, Checked:this.Period==0 },
76465
+ { Name:"周线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[1] }, Checked:this.Period==1 },
76466
+ { Name:"双周线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[21]}, Checked:this.Period==21 },
76467
+ { Name:"月线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[2]}, Checked:this.Period==2 },
76468
+ { Name:"季线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[9]}, Checked:this.Period==9 },
76469
+ { Name:"半年", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[22]}, Checked:this.Period==22 },
76470
+ { Name:"年线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[3]}, Checked:this.Period==3 },
76471
+ { Name:"1分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[4]}, Checked:this.Period==4 },
76472
+ { Name:"5分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[5]}, Checked:this.Period==5 },
76473
+ { Name:"15分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[6]}, Checked:this.Period==6 },
76474
+ { Name:"30分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[7]}, Checked:this.Period==7 },
76475
+ { Name:"60分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[8]}, Checked:this.Period==8 },
76476
+ { Name:"2小时", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[11]}, Checked:this.Period==11 },
76477
+ { Name:"4小时", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[12]}, Checked:this.Period==12 },
76478
+ { Name:"分笔", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[10]}, Checked:this.Period==10 },
76479
+ { Name:"自定义周期:3分钟", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[20003]}, Checked:this.Period==20003 },
76480
+ { Name:"自定义周期:35分钟", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[20035]}, Checked:this.Period==20035 },
76481
+ { Name:"自定义周期:8日", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[40008]}, Checked:this.Period==40008 },
76482
+ ]
76483
+ },
76484
+ {
76485
+ Name:"指标切换",
76486
+ SubMenu:
76487
+ [
76488
+ { Name:"均线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "均线"]}},
76489
+ { Name:"BOLL", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "BOLL"]}},
76490
+ { Name:"MACD", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "MACD"]}},
76491
+ { Name:"KDJ", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "KDJ"]}},
76492
+ { Name:"VOL", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "VOL"]}},
76493
+ { Name:"RSI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "RSI"]}},
76494
+ { Name:"BRAR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "BRAR"]}},
76495
+ { Name:"WR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "WR"]}},
76496
+ ]
76497
+ },
76498
+ {
76499
+ Name:"五彩K线",
76500
+ SubMenu:
76501
+ [
76502
+ { Name:"十字星", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-十字星"]}},
76503
+ { Name:"早晨之星", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-早晨之星"]}},
76504
+ { Name:"垂死十字", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-垂死十字"]}},
76505
+ { Name:"三只乌鸦", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-三只乌鸦"]}},
76506
+ { Name:"光脚阴线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-光脚阴线"]}},
76507
+ { Name:"黄昏之星", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-黄昏之星"]}},
76508
+ ]
76509
+
76510
+ },
76511
+ {
76512
+ Name:"专家系统",
76513
+ SubMenu:
76514
+ [
76515
+ { Name:"BIAS", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-BIAS"]}},
76516
+ { Name:"CCI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-CCI"]}},
76517
+ { Name:"DMI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-DMI"]}},
76518
+ { Name:"KD", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-KD"]}},
76519
+ { Name:"BOLL", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-BOLL"]}},
76520
+ { Name:"KDJ", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-KDJ"]}},
76521
+ ]
76522
+ },
76523
+ {
76524
+ Name:"信息地雷",
76525
+ SubMenu:
76526
+ [
76527
+ { Name:"公告", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["公告", !aryKLineInfo.includes("AnnouncementInfo")]}, Checked:aryKLineInfo.includes("AnnouncementInfo") },
76528
+ { Name:"业绩预告", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["业绩预告", !aryKLineInfo.includes("PforecastInfo")]}, Checked:aryKLineInfo.includes("PforecastInfo") },
76529
+ { Name:"调研", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["调研", !aryKLineInfo.includes("ResearchInfo") ]}, Checked:aryKLineInfo.includes("ResearchInfo") },
76530
+ { Name:"大宗交易", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["大宗交易", !aryKLineInfo.includes("BlockTrading")]}, Checked:aryKLineInfo.includes("BlockTrading") },
76531
+ { Name:"龙虎榜", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["龙虎榜", !aryKLineInfo.includes("TradeDetail")]}, Checked:aryKLineInfo.includes("TradeDetail") },
76532
+ { Name:"互动易", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["互动易", !aryKLineInfo.includes("InvestorInfo")]}, Checked:aryKLineInfo.includes("InvestorInfo") },
76533
+ ]
76534
+ },
76535
+ {
76536
+ Name:"缺口提示",
76537
+ SubMenu:
76538
+ [
76539
+ { Name:"显示1个缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[true, 1]}, Checked:(priceGap.Enable==true && priceGap.Count==1) },
76540
+ { Name:"显示2个缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[true, 2]}, Checked:(priceGap.Enable==true && priceGap.Count==2) },
76541
+ { Name:"显示3个缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[true, 3]}, Checked:(priceGap.Enable==true && priceGap.Count==3) },
76542
+ { Name:"隐藏缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[false]}, Checked:priceGap.Enable==false },
76543
+ ]
76544
+ },
76545
+ {
76546
+ Name:"叠加品种",
76547
+ SubMenu:
76548
+ [
76549
+ { Name:"上证指数", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000001.sh", !aryOverlaySymbol.includes("000001.sh")]}, Checked:aryOverlaySymbol.includes("000001.sh") },
76550
+ { Name:"深证成指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399001.sz", !aryOverlaySymbol.includes("399001.sz")]}, Checked:aryOverlaySymbol.includes("399001.sz") },
76551
+ { Name:"中小板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399005.sz", !aryOverlaySymbol.includes("399005.sz")]}, Checked:aryOverlaySymbol.includes("399005.sz") },
76552
+ { Name:"创业板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399006.sz", !aryOverlaySymbol.includes("399006.sz")]}, Checked:aryOverlaySymbol.includes("399006.sz") },
76553
+ { Name:"沪深300", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000300.sh", !aryOverlaySymbol.includes("000300.sh")]}, Checked:aryOverlaySymbol.includes("000300.sh")},
76554
+ ]
76555
+ },
76556
+ {
76557
+ Name:"主图线型",
76558
+ SubMenu:
76559
+ [
76560
+ { Name:"K线(空心阳线)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[3]} },
76561
+ { Name:"K线(实心阳线)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[0]} },
76562
+ { Name:"美国线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[2, true, { IsThinAKBar:false }]} },
76563
+ { Name:"美国线(细)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[2, true, { IsThinAKBar:true }]} },
76564
+ { Name:"收盘线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[1]} },
76565
+ { Name:"收盘面积", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[4]} },
76566
+ { Name:"K线(空心阳线阴线)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[6]} },
76567
+ { Name:"Heikin Ashi", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[11]} },
76568
+ { Name:"Line Break", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[12]} },
76569
+ { Name:"High-low", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[13]} },
76570
+ { Name:"HLC Area", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[15]} },
76571
+ ]
76572
+ },
76573
+ {
76574
+ Name:"坐标类型",
76575
+ SubMenu:
76576
+ [
76577
+ { Name:"反转坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ IsReverse:coordinateType==0 }]}, Checked:coordinateType==1 },
76578
+ { Name:JSPopMenu.SEPARATOR_LINE_NAME },
76579
+
76580
+ { Name:"普通坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:0 }]}, Checked:yCoordinateType==0 },
76581
+ { Name:"百分比坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:1 }]}, Checked:yCoordinateType==1 },
76582
+ { Name:"对数坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:2 }]}, Checked:yCoordinateType==2 },
76583
+ { Name:"等比坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:3 }]}, Checked:yCoordinateType==3 },
76584
+ { Name:"等分坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:4 }]}, Checked:yCoordinateType==4 },
76585
+ { Name:"黄金分割", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:5 }]}, Checked:yCoordinateType==5},
76586
+
76587
+ ]
76588
+ },
76589
+ {
76590
+ Name:"指标窗口个数",
76591
+ SubMenu:
76592
+ [
76593
+ { Name:"1个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[2]}, Checked:2==windowCount },
76594
+ { Name:"2个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[3]}, Checked:3==windowCount },
76595
+ { Name:"3个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[4]}, Checked:4==windowCount },
76596
+ { Name:"4个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[5]}, Checked:5==windowCount },
76597
+ { Name:"5个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[6]}, Checked:6==windowCount },
76598
+ ]
76599
+ },
76600
+ {
76601
+ Name:"其他设置",
76602
+ SubMenu:
76603
+ [
76604
+
76605
+ { Name:"禁止拖拽", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID, Args:[0]}, Checked:0==this.DragMode },
76606
+ { Name:"启动拖拽", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID, Args:[1]}, Checked:1==this.DragMode },
76607
+ { Name:"区间选择", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID, Args:[2]}, Checked:2==this.DragMode },
76608
+ { Name:JSPopMenu.SEPARATOR_LINE_NAME },
76609
+
76610
+ { Name:"背景分割", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_BG_SPLIT_ID, Args:[!bBGSpit]}, Checked:bBGSpit},
76611
+
76612
+ { Name:"画图工具", Data:{ ID:bShowDrawTool?JSCHART_MENU_ID.CMD_HIDE_DRAWTOOL_ID:JSCHART_MENU_ID.CMD_SHOW_DRAWTOOL_ID, Args:[]}, Checked:bShowDrawTool},
76613
+
76614
+ { Name:"移动筹码图", Data:{ ID:bShowStockChip?JSCHART_MENU_ID.CMD_HIDE_STOCKCHIP_ID:JSCHART_MENU_ID.CMD_SHOW_STOCKCHIP_ID, Args:[]}, Checked:bShowStockChip},
76615
+ ]
76616
+ }
76617
+ ];
76618
+
76619
+ //复权
76620
+ if(!MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol) && !MARKET_SUFFIX_NAME.IsBIT(this.Symbol))
76621
+ {
76622
+ var rightMenu=
76623
+ {
76624
+ Name:"复权处理",
76625
+ SubMenu:
76626
+ [
76627
+ { Name:"不复权", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID, Args:[0]}, Checked:0==this.Right },
76628
+ { Name:"前复权", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID, Args:[1]}, Checked:1==this.Right },
76629
+ { Name:"后复权", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID, Args:[2]}, Checked:2==this.Right }
76630
+ ]
76631
+ };
76632
+
76633
+ aryMenu.splice(1,0,rightMenu);
76634
+ }
76635
+
76636
+ //删除菜单
76637
+ for(var i=0;i<aryMenu.length;++i)
76638
+ {
76639
+ var item=aryMenu[i];
76640
+ if (item.Name=="五彩K线")
76641
+ {
76642
+ if (this.ColorIndex)
76643
+ {
76644
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
76645
+ item.SubMenu.push({ Name:"删除五彩K线", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_COLOR_INDEX_ID} });
76646
+ }
76647
+ }
76648
+ else if (item.Name=="专家系统")
76649
+ {
76650
+ if (this.TradeIndex)
76651
+ {
76652
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
76653
+ item.SubMenu.push({ Name:"删除专家系统", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_TRADE_INDEX_ID} });
76654
+ }
76655
+ }
76656
+ else if (item.Name=="叠加品种")
76657
+ {
76658
+ for(var j=0;j<item.SubMenu.length;++j)
76659
+ {
76660
+ if (item.SubMenu[j].Checked)
76661
+ {
76662
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
76663
+ item.SubMenu.push({ Name:"取消叠加", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_ALL_OVERLAY_SYMBOL_ID} });
76664
+ break;
76665
+ }
76666
+ }
76667
+ }
76668
+ else if (item.Name=="信息地雷")
76669
+ {
76670
+ for(var j=0;j<item.SubMenu.length;++j)
76671
+ {
76672
+ if (item.SubMenu[j].Checked)
76673
+ {
76674
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
76675
+ item.SubMenu.push({ Name:"删除所有", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_ALL_KLINE_INFO_ID} });
76676
+ break;
76677
+ }
76678
+ }
76679
+ }
76680
+ }
76681
+
76682
+ return aryMenu;
76683
+ }
76684
+
76685
+ this.PopuRightMenuV2=function(data,e)
76686
+ {
76687
+ if (!this.JSPopMenu) return;
76688
+ var x=data.X, y=data.Y;
76689
+ var frameID=data.FrameID;
76690
+ var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
76691
+ menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
76692
+
76693
+ this.PopuMenuByRClick(menuData, x, y);
76694
+ }
76695
+
76120
76696
  //重新加载画图工具(切换股票|周期)
76121
76697
  this.ReloadChartDrawPicture=function()
76122
76698
  {
76123
76699
  this.ChartDrawPicture=[];
76124
- this.ChartDrawStorageCache;
76700
+ if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.IsSelected=false;
76701
+ this.SelectChartDrawPicture=null;
76702
+ this.CurrentChartDrawPicture=null;
76703
+
76125
76704
  if (this.ChartDrawStorage)
76126
76705
  {
76127
76706
  this.ChartDrawStorageCache=this.ChartDrawStorage.GetDrawData( {Symbol:this.Symbol, Period:this.Period} );
@@ -77512,7 +78091,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
77512
78091
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_EXTENDCHART_BUTTON);
77513
78092
  if (event && event.Callback)
77514
78093
  {
77515
- var data={ Info:button, PreventDefault:false }; //PreventDefault 是否阻止内置的点击处理
78094
+ var data={ Info:button, PreventDefault:false, e:e }; //PreventDefault 是否阻止内置的点击处理
77516
78095
  event.Callback(event,data,this);
77517
78096
  if (data.PreventDefault) return;
77518
78097
  }
@@ -79479,7 +80058,13 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79479
80058
  //注册鼠标右键事件
79480
80059
  this.OnRightMenu=function(x,y,e)
79481
80060
  {
79482
- if (this.RightMenu)
80061
+ var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
80062
+ if (this.EnablePopMenuV2)
80063
+ {
80064
+ var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
80065
+ this.PopuRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
80066
+ }
80067
+ else if (this.RightMenu)
79483
80068
  {
79484
80069
  var frameId=this.Frame.PtInFrame(x,y);
79485
80070
  e.data={ Chart:this, FrameID:frameId };
@@ -79495,6 +80080,107 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79495
80080
  }
79496
80081
  }
79497
80082
 
80083
+ //右键菜单数据
80084
+ this.GetRightMenuData=function(frameID)
80085
+ {
80086
+ var windowCount=this.Frame.SubFrame.length; //窗口个数
80087
+
80088
+ var aryOverlaySymbol=[]; //叠加的股票列表
80089
+ for(var i=0; i<this.OverlayChartPaint.length; ++i)
80090
+ {
80091
+ var item=this.OverlayChartPaint[i];
80092
+ if (item && item.Symbol) aryOverlaySymbol.push(item.Symbol)
80093
+ }
80094
+
80095
+ var aryMenu=
80096
+ [
80097
+ {
80098
+ Name:"叠加品种",
80099
+ SubMenu:
80100
+ [
80101
+ { Name:"上证指数", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000001.sh", !aryOverlaySymbol.includes("000001.sh")]}, Checked:aryOverlaySymbol.includes("000001.sh") },
80102
+ { Name:"深证成指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399001.sz", !aryOverlaySymbol.includes("399001.sz")]}, Checked:aryOverlaySymbol.includes("399001.sz") },
80103
+ { Name:"中小板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399005.sz", !aryOverlaySymbol.includes("399005.sz")]}, Checked:aryOverlaySymbol.includes("399005.sz") },
80104
+ { Name:"创业板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399006.sz", !aryOverlaySymbol.includes("399006.sz")]}, Checked:aryOverlaySymbol.includes("399006.sz") },
80105
+ { Name:"沪深300", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000300.sh", !aryOverlaySymbol.includes("000300.sh")]}, Checked:aryOverlaySymbol.includes("000300.sh")},
80106
+ ]
80107
+ },
80108
+ {
80109
+ Name:"多日分时图",
80110
+ SubMenu:
80111
+ [
80112
+ { Name:"当日分时图", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[1]}, Checked:this.DayCount==1 },
80113
+ { Name:"最近2日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[2]}, Checked:this.DayCount==2 },
80114
+ { Name:"最近3日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[3]}, Checked:this.DayCount==3 },
80115
+ { Name:"最近4日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[4]}, Checked:this.DayCount==4 },
80116
+ { Name:"最近5日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[5]}, Checked:this.DayCount==5 },
80117
+ ]
80118
+ },
80119
+ {
80120
+ Name:"指标窗口个数",
80121
+ SubMenu:
80122
+ [
80123
+ { Name:"1个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[2]}, Checked:3==windowCount },
80124
+ { Name:"2个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[3]}, Checked:4==windowCount },
80125
+ { Name:"3个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[4]}, Checked:5==windowCount },
80126
+ { Name:"4个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[5]}, Checked:6==windowCount },
80127
+ { Name:"5个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[6]}, Checked:7==windowCount },
80128
+ ]
80129
+ },
80130
+ {
80131
+ Name:"指标切换",
80132
+ SubMenu:
80133
+ [
80134
+ { Name:"MACD", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "MACD"]}},
80135
+ { Name:"DMI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "DMI"]}},
80136
+ { Name:"DMA", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "DMA"]}},
80137
+ { Name:"BRAR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "BRAR"]}},
80138
+ { Name:"KDJ", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "KDJ"]}},
80139
+ { Name:"RSI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "RSI"]}},
80140
+ { Name:"WR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "WR"]}},
80141
+ { Name:"CCI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "CCI"]}},
80142
+ { Name:"TRIX", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "TRIX"]}},
80143
+ ]
80144
+ },
80145
+ {
80146
+ Name:"区间选择",Data:{ ID: JSCHART_MENU_ID.CMD_ENABLE_SELECT_RECT_ID, Args:[!this.EnableSelectRect]}, Checked:this.EnableSelectRect
80147
+ }
80148
+
80149
+ ];
80150
+
80151
+
80152
+ //删除菜单
80153
+ for(var i=0;i<aryMenu.length;++i)
80154
+ {
80155
+ var item=aryMenu[i];
80156
+ if (item.Name=="叠加品种")
80157
+ {
80158
+ for(var j=0;j<item.SubMenu.length;++j)
80159
+ {
80160
+ if (item.SubMenu[j].Checked)
80161
+ {
80162
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
80163
+ item.SubMenu.push({ Name:"取消叠加", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_ALL_OVERLAY_SYMBOL_ID} });
80164
+ break;
80165
+ }
80166
+ }
80167
+ }
80168
+ }
80169
+
80170
+ return aryMenu;
80171
+ }
80172
+
80173
+ this.PopuRightMenuV2=function(data,e)
80174
+ {
80175
+ if (!this.JSPopMenu) return;
80176
+ var x=data.X, y=data.Y;
80177
+ var frameID=data.FrameID;
80178
+ var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
80179
+ menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
80180
+
80181
+ this.PopuMenuByRClick(menuData, x, y);
80182
+ }
80183
+
79498
80184
  this.OnWheel=function(e)
79499
80185
  {
79500
80186
  JSConsole.Chart.Log('[MinuteChartContainer::OnWheel]',e);
@@ -80599,15 +81285,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
80599
81285
  this.ResetDayOffset();
80600
81286
  }
80601
81287
 
80602
- if (this.DayCount>1)
80603
- {
80604
- this.ChartDrawPicture=[];
80605
- }
80606
- else
80607
- {
80608
- this.ReloadChartDrawPicture();
80609
- }
80610
-
81288
+ this.ReloadChartDrawPicture();
80611
81289
  this.ResetDataStatus();
80612
81290
  this.ClearIndexPaint(); //清空指标
80613
81291
  this.Frame.ClearYCoordinateMaxMin();
@@ -81129,6 +81807,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
81129
81807
  this.TitlePaint[0].IsShowDate=true;
81130
81808
  this.UpdateDataOffset();
81131
81809
  this.UpdateFrameMaxMin(); //调整坐标最大 最小值
81810
+ this.CreateChartDrawPictureByStorage(); //创建画图工具
81132
81811
 
81133
81812
  //执行脚本
81134
81813
  if (this.Frame.SubFrame.length>2)
@@ -81427,7 +82106,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
81427
82106
  this.UpdateLatestMinuteDataV2(minuteData);
81428
82107
  this.UpdateHistoryMinuteUI(updateTime);
81429
82108
  this.RecvMinuteDataEvent({FunctionName:"RecvUpdateMinuteData"} );
81430
- this.RequestOverlayMinuteData(); //请求叠加数据 (主数据下载完再下载)
82109
+ this.RequestOverlayMinuteData(); //请求叠加数据 (主数据下载完再下载)
81431
82110
  this.BindAllOverlayIndexData(this.SourceData);
81432
82111
  this.AutoUpdateEvent(true, "MinuteChartContainer::RecvUpdateMinuteData");
81433
82112
  this.AutoUpdate();
@@ -82847,7 +83526,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
82847
83526
  this.ReloadChartDrawPicture=function()
82848
83527
  {
82849
83528
  this.ChartDrawPicture=[];
82850
- this.ChartDrawStorageCache;
83529
+ if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.IsSelected=false;
83530
+ this.SelectChartDrawPicture=null;
83531
+ this.CurrentChartDrawPicture=null;
83532
+ this.MoveOnChartDrawPicture=null;
83533
+
82851
83534
  if (this.ChartDrawStorage)
82852
83535
  {
82853
83536
  this.ChartDrawStorageCache=this.ChartDrawStorage.GetDrawData( { Symbol:this.Symbol, Period:888888888 } );
@@ -82858,7 +83541,8 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
82858
83541
  {
82859
83542
  if (!this.ChartDrawStorageCache || this.ChartDrawStorageCache.length<=0) return;
82860
83543
 
82861
- for(var i in this.ChartDrawStorageCache)
83544
+ var self=this;
83545
+ for(var i=0; i<this.ChartDrawStorageCache.length; ++i)
82862
83546
  {
82863
83547
  var item=this.ChartDrawStorageCache[i];
82864
83548
  if (item.FrameID<0 || !this.Frame.SubFrame || this.Frame.SubFrame.length<item.FrameID) continue;
@@ -82869,8 +83553,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
82869
83553
  drawPicture.Canvas=this.Canvas;
82870
83554
  drawPicture.Status=10;
82871
83555
  drawPicture.Frame=this.Frame.SubFrame[item.FrameID].Frame; //绑定框架坐标
83556
+ if (drawPicture.ImportStorageData) drawPicture.ImportStorageData(item);
83557
+ drawPicture.ResetXValue();
82872
83558
  drawPicture.UpdateXValue();
82873
83559
  drawPicture.ValueToPoint();
83560
+ drawPicture.GetActiveDrawPicture=()=>{ return this.GetActiveDrawPicture(); }
82874
83561
 
82875
83562
  if (drawPicture.ClassName==='ChartDrawPictureText') drawPicture.IsInitialized=true;
82876
83563
 
@@ -115620,7 +116307,7 @@ function ScriptIndex(name,script,args,option)
115620
116307
  if (varItem.Background) chartText.TextBG=varItem.Background;
115621
116308
 
115622
116309
  //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
115623
-
116310
+ this.SetChartIndexName(chartText);
115624
116311
  hqChart.ChartPaint.push(chartText);
115625
116312
  }
115626
116313
 
@@ -116284,6 +116971,7 @@ function ScriptIndex(name,script,args,option)
116284
116971
 
116285
116972
  //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
116286
116973
 
116974
+ this.SetChartIndexName(chartText);
116287
116975
  hqChart.ChartPaint.push(chartText);
116288
116976
  }
116289
116977
 
@@ -117673,6 +118361,7 @@ function OverlayScriptIndex(name,script,args,option)
117673
118361
  var titlePaint=hqChart.TitlePaint[titleIndex];
117674
118362
  titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=new DynamicTitleData(chart.Data,varItem.Name,chart.Color);
117675
118363
 
118364
+ this.SetChartIndexName(chart);
117676
118365
  frame.ChartPaint.push(chart);
117677
118366
  }
117678
118367
 
@@ -117891,7 +118580,7 @@ function OverlayScriptIndex(name,script,args,option)
117891
118580
  chart.Text=varItem.Draw.DrawData.Text;
117892
118581
 
117893
118582
  //hqChart.TitlePaint[titleIndex].Data[id]=new DynamicTitleData(bar.Data,varItem.Name,bar.Color);
117894
-
118583
+ this.SetChartIndexName(chart);
117895
118584
  frame.ChartPaint.push(chart);
117896
118585
  }
117897
118586
 
@@ -134938,6 +135627,272 @@ function ScrollBarBGChart()
134938
135627
  }
134939
135628
 
134940
135629
 
135630
+ /*
135631
+ Copyright (c) 2018 jones
135632
+
135633
+ http://www.apache.org/licenses/LICENSE-2.0
135634
+
135635
+ 开源项目 https://github.com/jones2000/HQChart
135636
+
135637
+ jones_2000@163.com
135638
+
135639
+ 内置菜单 使用table模式
135640
+ */
135641
+
135642
+ function JSPopMenu()
135643
+ {
135644
+ this.Data={ Menu:[], Position:0 }; //{ Name:, SVG, ID, bChecked:, SubMenu:[] } Position 0=右键菜单 1=Tab弹菜单 2=下拉菜单
135645
+
135646
+ this.RootDOM=null;
135647
+ this.TBodyDOM=null;
135648
+ this.ArySubRootDOM=[];
135649
+
135650
+ this.ClickCallback=null; //点击回调
135651
+ this.CheckedClassName="UMyChart_MenuItem_Span_Checked iconfont icon-checked"; //选中图标
135652
+ this.RightArrowClassName="UMyChart_MenuItem_Span_Arrow iconfont icon-menu_arraw_right"; //右侧箭头
135653
+
135654
+ this.AryTDClassName=
135655
+ [
135656
+ "UMyChart_MenuItem_Td_Status", //图标
135657
+ "UMyChart_MenuItem_Td_Content", //文字
135658
+ "UMyChart_MenuItem_Td_Shortcut", //快捷方式
135659
+ "UMyChart_MenuItem_Td_Arrow" //箭头
135660
+ ];
135661
+
135662
+ this.Inital=function()
135663
+ {
135664
+ window.addEventListener('mousedown', (e)=>{ this.OnWindowMouseDown(e)});
135665
+ }
135666
+
135667
+ //创建菜单
135668
+ this.CreatePopMenu=function(data)
135669
+ {
135670
+ this.Clear();
135671
+
135672
+ var root=document.createElement("div");
135673
+ root.className="UMyChart_PopMenu";
135674
+
135675
+ var table=document.createElement("table");
135676
+ table.className="UMyChart_PopMenu_Table";
135677
+ root.appendChild(table);
135678
+
135679
+ var tbody=document.createElement("tbody");
135680
+ tbody.className="UMyChart_PopMenu_Tbody";
135681
+ table.appendChild(tbody);
135682
+
135683
+
135684
+ var rootData={ Root:root, TBody:tbody, Table:table };
135685
+ for(var i=0;i<data.Menu.length;++i)
135686
+ {
135687
+ var item=data.Menu[i];
135688
+ var trDom=this.CreateMenu(rootData, item);
135689
+ tbody.appendChild(trDom);
135690
+ }
135691
+
135692
+ document.body.appendChild(root);
135693
+ this.RootDOM=root;
135694
+ this.TBodyDOM=tbody;
135695
+
135696
+ if (IFrameSplitOperator.IsNumber(data.Position)) this.Data.Position=data.Position;
135697
+ if (data.ClickCallback) this.ClickCallback=data.ClickCallback;
135698
+
135699
+ }
135700
+
135701
+ //清除菜单
135702
+ this.Clear=function()
135703
+ {
135704
+ this.Data.Menu=[];
135705
+ this.Data.Position=JSPopMenu.POSITION_ID.RIGHT_MENU_ID;
135706
+ this.ClickCallback=null;
135707
+
135708
+ if (!this.RootDOM) return;
135709
+
135710
+ document.body.removeChild(this.RootDOM);
135711
+ this.RootDOM=null;
135712
+ this.TBodyDOM=null;
135713
+
135714
+ for(var i=0;i<this.ArySubRootDOM.length;++i)
135715
+ {
135716
+ document.body.removeChild(this.ArySubRootDOM[i]);
135717
+ }
135718
+ this.ArySubRootDOM=[]
135719
+ }
135720
+
135721
+ this.CreateMenu=function(parentItem, item)
135722
+ {
135723
+ var trDom=document.createElement("tr");
135724
+ trDom.className='UMyChart_MenuItem_Tr';
135725
+
135726
+ var prtTdDom=null;
135727
+ for(var i=0;i<this.AryTDClassName.length;++i)
135728
+ {
135729
+ var tdDom=document.createElement("td");
135730
+ tdDom.className=this.AryTDClassName[i];
135731
+
135732
+ if (i==0) //图标
135733
+ {
135734
+ if (item.Checked)
135735
+ {
135736
+ var spanDom=document.createElement("span");
135737
+ spanDom.className=this.CheckedClassName;
135738
+ tdDom.appendChild(spanDom);
135739
+ }
135740
+ }
135741
+ else if (i==1) //内容
135742
+ {
135743
+ tdDom.innerText=item.Name;
135744
+ }
135745
+ else if (i==2) //快捷方式
135746
+ {
135747
+
135748
+ }
135749
+ else if (i==3) //箭头
135750
+ {
135751
+ if (IFrameSplitOperator.IsNonEmptyArray(item.SubMenu))
135752
+ {
135753
+ var spanDom=document.createElement("span");
135754
+ spanDom.className=this.RightArrowClassName;
135755
+ tdDom.appendChild(spanDom);
135756
+ }
135757
+ }
135758
+
135759
+ trDom.appendChild(tdDom);
135760
+ }
135761
+
135762
+ if (IFrameSplitOperator.IsNonEmptyArray(item.SubMenu)) //子菜单
135763
+ {
135764
+ var subRoot=document.createElement("div");
135765
+ subRoot.className="UMyChart_PopSubMenu";
135766
+
135767
+ var subTable=document.createElement("table");
135768
+ subTable.className="UMyChart_PopMenu_Table";
135769
+ subRoot.appendChild(subTable);
135770
+
135771
+ var subTbody=document.createElement("tbody");
135772
+ subTbody.className="UMyChart_PopMenu_TBody";
135773
+ subTable.appendChild(subTbody);
135774
+
135775
+ var subRootData={ Root:subRoot, TBody:subTbody, Table:subTable };
135776
+ var preTrDom=null;
135777
+ for(var i=0;i<item.SubMenu.length;++i)
135778
+ {
135779
+ var subItem=item.SubMenu[i];
135780
+ if (subItem.Name==JSPopMenu.SEPARATOR_LINE_NAME)
135781
+ {
135782
+ if (preTrDom) preTrDom.classList.add("border");
135783
+ continue;
135784
+ }
135785
+
135786
+ var subTrDom=this.CreateMenu(subRootData, subItem);
135787
+ preTrDom=subTrDom;
135788
+ subTbody.appendChild(subTrDom);
135789
+ }
135790
+
135791
+ trDom.onmouseover=(e)=>{ this.OnMouseOver(e, parentItem, trDom, subRoot); }
135792
+ document.body.appendChild(subRoot);
135793
+ this.ArySubRootDOM.push(subRoot);
135794
+ }
135795
+ else
135796
+ {
135797
+ trDom.onmousedown=(e)=> { this.OnClickMenu(e, item, false); }; //菜单点击
135798
+ trDom.onmouseover=(e)=>{ this.OnMouseOver(e, parentItem); }
135799
+ }
135800
+
135801
+ return trDom;
135802
+ }
135803
+
135804
+ //弹tab菜单
135805
+ this.PopupMenuByTab=function(rtTab)
135806
+ {
135807
+ if (!this.RootDOM) return;
135808
+ if (!rtTab) return;
135809
+
135810
+ var xLeft=rtTab.Left;
135811
+ var yTop=rtTab.Top-this.RootDOM.offsetHeight;
135812
+
135813
+ this.RootDOM.style.visibility='visible';
135814
+ this.RootDOM.style.top = yTop + "px";
135815
+ this.RootDOM.style.left = xLeft + "px";
135816
+ }
135817
+
135818
+ //弹右键菜单
135819
+ this.PopupMenuByRight=function(x,y)
135820
+ {
135821
+ if (!this.RootDOM) return;
135822
+ if (!IFrameSplitOperator.IsNumber(x) || !IFrameSplitOperator.IsNumber(y)) return;
135823
+
135824
+ this.RootDOM.style.visibility='visible';
135825
+ this.RootDOM.style.top = y + "px";
135826
+ this.RootDOM.style.left = x + "px";
135827
+ }
135828
+
135829
+ this.OnClickMenu=function(e, item, bSubMenu)
135830
+ {
135831
+ console.log("[JSPopMenu::OnClickMenu] e=, item=, bSubMenu", e, item, bSubMenu);
135832
+ if (!this.ClickCallback) return;
135833
+
135834
+ this.ClickCallback(item);
135835
+ }
135836
+
135837
+ this.OnMouseOver=function(e, parentItem, trDom, subMenu)
135838
+ {
135839
+ if (parentItem && parentItem.PopMenu && parentItem.PopMenu!=subMenu)
135840
+ {
135841
+ parentItem.PopMenu.style.visibility="hidden";
135842
+ parentItem.PopMenu=null;
135843
+ parentItem.PopRow=null;
135844
+ }
135845
+
135846
+ if (subMenu)
135847
+ {
135848
+ if (subMenu.style.visibility=="visible")
135849
+ {
135850
+
135851
+ }
135852
+ else
135853
+ {
135854
+ var rtParent=trDom.getBoundingClientRect();
135855
+ subMenu.style.left=`${rtParent.right}px`;
135856
+ subMenu.style.top=`${rtParent.top}px`;
135857
+
135858
+ /*
135859
+ if (this.Data.Position==JSPopMenu.POSITION_ID.TAB_MENU_ID)
135860
+ {
135861
+ var yButton=parentItem.Root.getBoundingClientRect().bottom;
135862
+ var ySubButton=subMenu.getBoundingClientRect().bottom;
135863
+ if (yButton<ySubButton)
135864
+ {
135865
+ var yOffset=yButton-ySubButton;
135866
+ subMenu.style.top=`${yOffset}px`;
135867
+ }
135868
+ }
135869
+ */
135870
+
135871
+ subMenu.style.visibility="visible";
135872
+ }
135873
+
135874
+ parentItem.PopMenu=subMenu;
135875
+ parentItem.PopRow=trDom;
135876
+ }
135877
+ }
135878
+
135879
+
135880
+
135881
+ this.OnWindowMouseDown=function(e)
135882
+ {
135883
+ if (!this.RootDOM) return;
135884
+
135885
+ console.log("[JSPopMenu::OnWindowMouseDown] e=", e);
135886
+
135887
+ this.Clear();
135888
+ }
135889
+ }
135890
+
135891
+
135892
+ JSPopMenu.POSITION_ID={ };
135893
+ JSPopMenu.POSITION_ID.RIGHT_MENU_ID=0;
135894
+ JSPopMenu.POSITION_ID.TAB_MENU_ID=1;
135895
+ JSPopMenu.SEPARATOR_LINE_NAME="MENU_SEPARATOR"; //分割线
134941
135896
  ///////////////////////////////////////////////////////////////////////////////////
134942
135897
  // 工作线程计算指标示例
134943
135898
  //
@@ -135059,7 +136014,7 @@ function HQChartScriptWorker()
135059
136014
 
135060
136015
 
135061
136016
 
135062
- var HQCHART_VERSION="1.1.13166";
136017
+ var HQCHART_VERSION="1.1.13181";
135063
136018
 
135064
136019
  function PrintHQChartVersion()
135065
136020
  {
@@ -135196,5 +136151,7 @@ export default {
135196
136151
 
135197
136152
 
135198
136153
  HQChartScriptWorker:HQChartScriptWorker, //计算工作线程
136154
+
136155
+ JSPopMenu:JSPopMenu, //弹出菜单
135199
136156
 
135200
136157
  }