hqchart 1.1.13171 → 1.1.13191

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.
@@ -275,11 +275,12 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
275
275
  chart.ModifyIndexDialog=this.ModifyIndexDialog;
276
276
  chart.ChangeIndexDialog=this.ChangeIndexDialog;
277
277
  chart.MinuteDialog=this.MinuteDialog;
278
+
279
+ var pixelRatio=GetDevicePixelRatio();
278
280
 
279
281
  //右键菜单
280
- if (option.IsShowRightMenu==true) chart.RightMenu=new KLineRightMenu(this.DivElement);
282
+ if (IFrameSplitOperator.IsBool(option.IsShowRightMenu)) chart.IsShowRightMenu=option.IsShowRightMenu;
281
283
  if (option.ScriptError) chart.ScriptErrorCallback=option.ScriptError;
282
- chart.SelectRectRightMenu=new KLineSelectRightMenu(this.DivElement);
283
284
  if (option.EnableScrollUpDown==true) chart.EnableScrollUpDown=option.EnableScrollUpDown;
284
285
  if (option.DisableMouse==true) chart.DisableMouse=option.DisableMouse;
285
286
  if (option.TouchMoveMinAngle) chart.TouchMoveMinAngle=option.TouchMoveMinAngle;
@@ -493,8 +494,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
493
494
  chart.Frame.SubFrame[i].Frame.IsShowYText[1]=item.IsShowRightText;
494
495
  chart.Frame.SubFrame[i].Frame.YSplitOperator.IsShowRightText=item.IsShowRightText; //显示右边刻度
495
496
  }
496
- if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace;
497
- if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace;
497
+ if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace*pixelRatio;
498
+ if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace*pixelRatio;
498
499
 
499
500
  if (item.RightTextPosition>0) chart.Frame.SubFrame[i].Frame.YTextPosition[1]=item.RightTextPosition;
500
501
  if (item.LeftTextPosition>0) chart.Frame.SubFrame[i].Frame.YTextPosition[0]=item.LeftTextPosition;
@@ -693,7 +694,7 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
693
694
  chart.MinuteDialog=this.MinuteDialog;
694
695
 
695
696
  //右键菜单
696
- if (option.IsShowRightMenu==true) chart.RightMenu=new KLineRightMenu(this.DivElement);
697
+ if (IFrameSplitOperator.IsBool(option.IsShowRightMenu)) chart.IsShowRightMenu=option.IsShowRightMenu;
697
698
 
698
699
  if (option.KLine) //k线图的属性设置
699
700
  {
@@ -796,6 +797,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
796
797
  chart.ModifyIndexDialog=this.ModifyIndexDialog;
797
798
  chart.ChangeIndexDialog=this.ChangeIndexDialog;
798
799
 
800
+ var pixelRatio=GetDevicePixelRatio();
801
+
799
802
  var windowsCount=2;
800
803
  if (option.Windows && option.Windows.length>0) windowsCount+=option.Windows.length; //指标窗口从第3个窗口开始
801
804
  if (option.EnableScrollUpDown==true) chart.EnableScrollUpDown=option.EnableScrollUpDown;
@@ -911,7 +914,7 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
911
914
 
912
915
  if (option.MinuteInfo) chart.CreateMinuteInfo(option.MinuteInfo);
913
916
 
914
- if (option.IsShowRightMenu==true) chart.RightMenu=new MinuteRightMenu(this.DivElement);
917
+ if (IFrameSplitOperator.IsBool(option.IsShowRightMenu)) chart.IsShowRightMenu=option.IsShowRightMenu;
915
918
 
916
919
  if (IFrameSplitOperator.IsNumber(option.DayCount)) chart.DayCount=option.DayCount;
917
920
 
@@ -963,8 +966,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
963
966
  if (IFrameSplitOperator.IsNumber(item.YTextBaseline)) chart.Frame.SubFrame[i].Frame.YTextBaseline=item.YTextBaseline;
964
967
  if (IFrameSplitOperator.IsBool(item.IsShowIndexTitle)) chart.Frame.SubFrame[i].Frame.IsShowIndexTitle=item.IsShowIndexTitle;
965
968
 
966
- if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace;
967
- if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace;
969
+ if (item.TopSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.TopSpace=item.TopSpace*pixelRatio;
970
+ if (item.BottomSpace>=0) chart.Frame.SubFrame[i].Frame.ChartBorder.BottomSpace=item.BottomSpace*pixelRatio;
968
971
 
969
972
  //是否显示关闭集合竞价按钮
970
973
  if (IFrameSplitOperator.IsNumber(item.CloseBeforeButton)) chart.Frame.SubFrame[i].Frame.IsShowCloseButton=item.CloseBeforeButton;
@@ -1630,6 +1633,7 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
1630
1633
  if (!chart) return false;
1631
1634
 
1632
1635
  this.JSChartContainer=chart;
1636
+ chart.DivElement=this.DivElement;
1633
1637
 
1634
1638
  if (option.DefaultCursor) chart.DefaultCursor=option.DefaultCursor;
1635
1639
  if (option.OnCreatedCallback) option.OnCreatedCallback(chart);
@@ -1637,6 +1641,10 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
1637
1641
  //是否自动更新
1638
1642
  if (option.IsAutoUpdate!=null) chart.IsAutoUpdate=option.IsAutoUpdate;
1639
1643
  if (option.AutoUpdateFrequency>0) chart.AutoUpdateFrequency=option.AutoUpdateFrequency;
1644
+
1645
+ //内置菜单
1646
+ if (option.EnablePopMenuV2===true) chart.InitalPopMenu();
1647
+
1640
1648
  //注册事件
1641
1649
  if (option.EventCallback)
1642
1650
  {
@@ -1663,19 +1671,6 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
1663
1671
  this.DivElement.JSChart=this; //div中保存一份
1664
1672
  this.JSChartContainer.Draw();
1665
1673
  }
1666
-
1667
- if (IFrameSplitOperator.IsBool(option.CheckLatestVerion) && option.CheckLatestVerion==false)
1668
- {
1669
-
1670
- }
1671
- else if (JSChart.LastVersion==null)
1672
- {
1673
- if (chart && typeof(chart.GetLatestVersion)=='function')
1674
- {
1675
- //由于域名都要备案,获取最新版本接口停止使用
1676
- //chart.GetLatestVersion();
1677
- }
1678
- }
1679
1674
  }
1680
1675
 
1681
1676
  //创建工具条
@@ -2119,6 +2114,15 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
2119
2114
  return this.JSChartContainer.ChangePriceGap(option);
2120
2115
  }
2121
2116
  }
2117
+
2118
+ this.PopupMenuByTab=function(menuData, rtTab)
2119
+ {
2120
+ if(this.JSChartContainer && typeof(this.JSChartContainer.PopupMenuByTab)=='function')
2121
+ {
2122
+ JSConsole.Chart.Log('[JSChart:ChangePriceGap] ');
2123
+ return this.JSChartContainer.PopupMenuByTab(menuData, rtTab);
2124
+ }
2125
+ }
2122
2126
  }
2123
2127
 
2124
2128
  JSChart.LastVersion=null; //最新的版本号
@@ -2324,6 +2328,12 @@ JSChart.ToFixedRect=function(value)
2324
2328
  return ToFixedRect(value);
2325
2329
  }
2326
2330
 
2331
+ JSChart.GetScrollPosition=function()
2332
+ {
2333
+ return GetScrollPosition();
2334
+ }
2335
+
2336
+
2327
2337
 
2328
2338
 
2329
2339
  var JSCHART_EVENT_ID=
@@ -2609,6 +2619,40 @@ var JSCHART_WORKER_MESSAGE_ID=
2609
2619
  ERROR_EXECUTE_SCRIPT:3,
2610
2620
  }
2611
2621
 
2622
+ var JSCHART_MENU_ID=
2623
+ {
2624
+ CMD_CHANGE_PERIOD_ID:1, //切换周期
2625
+ CMD_CHANGE_WINDOW_COUNT_ID:2, //窗口个数
2626
+ CMD_CHANGE_RIGHT_ID:3, //复权
2627
+ CMD_CHANGE_INDEX_ID:4, //切换指标
2628
+ CMD_CHANGE_COLOR_INDEX_ID:5, //五彩K线指标
2629
+ CMD_CHANGE_TRADE_INDEX_ID:6, //专家系统(交易指标)
2630
+ CMD_DELETE_COLOR_INDEX_ID:7, //删除五彩K线指标
2631
+ CMD_DELETE_TRADE_INDEX_ID:8, //删除专家系统(交易指标)
2632
+ CMD_CHANGE_KLINE_TYPE_ID:9, //切换K线类型
2633
+ CMD_CHANGE_PRICE_GAP_ID:10, //缺口提示
2634
+ CMD_OVERLAY_SYMBOL_ID:11, //叠加品种
2635
+ CMD_DELETE_ALL_OVERLAY_SYMBOL_ID:12, //删除所有叠加品种
2636
+ CMD_CHANGE_COORDINATETYPE_ID:13, //切换坐标类型
2637
+ CMD_CHANGE_KLINE_INFO_ID:14, //切换信息地雷
2638
+ CMD_DELETE_ALL_KLINE_INFO_ID:15, //清空信息地雷
2639
+ CMD_CHANGE_DRAG_MODE_ID:16, //切换拖动模式
2640
+ CMD_CHANGE_BG_SPLIT_ID:17, //背景分割
2641
+
2642
+ CMD_SHOW_DRAWTOOL_ID:18, //画图工具
2643
+ CMD_HIDE_DRAWTOOL_ID:19,
2644
+
2645
+ CMD_SHOW_STOCKCHIP_ID:20, //筹码分布
2646
+ CMD_HIDE_STOCKCHIP_ID:21,
2647
+
2648
+ CMD_ENABLE_SELECT_RECT_ID:22, //启动区间选择
2649
+ CMD_CHANGE_DAY_COUNT_ID:23, //切换天数
2650
+ CMD_SHOW_BEFORE_DATA_ID:24, //显示|隐藏集合竞价
2651
+
2652
+ CMD_SELECTED_ZOOM_ID:25, //选中放大
2653
+ CMD_SELECTED_SUMMARY_ID:26, //区间统计
2654
+ }
2655
+
2612
2656
 
2613
2657
  function PhoneDBClick()
2614
2658
  {
@@ -2772,9 +2816,6 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
2772
2816
  this.SelectRect.oncontextmenu=function() { return false; }; //屏蔽选中区域系统右键菜单
2773
2817
  uielement.parentNode.appendChild(this.SelectRect);
2774
2818
 
2775
- //区间选择右键菜单
2776
- this.SelectRectRightMenu;
2777
-
2778
2819
  //坐标轴风格方法 double-更加数值型分割 price-更加股票价格分割
2779
2820
  this.FrameSplitData=new Map();
2780
2821
  this.FrameSplitData.set("double",new SplitData());
@@ -2834,12 +2875,23 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
2834
2875
 
2835
2876
  this.StockCache={ Data:null }; //扩展数据缓存数据
2836
2877
 
2878
+ this.JSPopMenu; //内置菜单
2879
+ this.IsShowRightMenu=true; //显示右键菜单
2880
+
2837
2881
 
2838
2882
  this.ClearStockCache=function()
2839
2883
  {
2840
2884
  this.StockCache.Data=null;
2841
2885
  }
2842
2886
 
2887
+ this.InitalPopMenu=function() //初始化弹出窗口
2888
+ {
2889
+ if (this.JSPopMenu) return;
2890
+
2891
+ this.JSPopMenu=new JSPopMenu(); //内置菜单
2892
+ this.JSPopMenu.Inital();
2893
+ }
2894
+
2843
2895
  //obj={ Element:, Canvas: }
2844
2896
  this.SetCorssCursorElement=function(obj)
2845
2897
  {
@@ -2889,61 +2941,10 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
2889
2941
  {
2890
2942
  this.IsDestroy=true;
2891
2943
  this.StopAutoUpdate();
2892
-
2893
- if (this.GetLatestVersionTimer!=null)
2894
- {
2895
- clearTimeout(this.GetLatestVersionTimer);
2896
- this.GetLatestVersionTimer=null;
2897
- }
2898
2944
  }
2899
2945
 
2900
2946
  this.ChartDestory=this.ChartDestroy; //老版本写错了,需要兼容下
2901
2947
 
2902
-
2903
- this.GetLatestVersionTimer=null; //获取最新版本
2904
- this.GetLatestVersion=function()
2905
- {
2906
- if (this.GetLatestVersionTimer!=null)
2907
- {
2908
- clearTimeout(this.GetLatestVersionTimer);
2909
- this.GetLatestVersionTimer=null;
2910
- }
2911
-
2912
- var roundeTime=Math.floor(Math.random()*50);
2913
- var waittimer=1000*60*3+(roundeTime*1000);
2914
- var value="aHR0cHM6Ly9ocWNoYXJ0LnplYWxpbmsuY29tL2FwaS9HZXRWZXJzaW9u";
2915
- JSConsole.Chart.Log("[JSChartContainer::GetLatestVersion] wait for get hqchart latest version. ",waittimer);
2916
- this.GetLatestVersionTimer = setTimeout(()=>
2917
- {
2918
- var width=0, height=0;
2919
- if (this.Frame && this.Frame.ChartBorder)
2920
- {
2921
- width=this.Frame.ChartBorder.GetChartWidth();
2922
- height=this.Frame.ChartBorder.GetChartHeight();
2923
- }
2924
-
2925
- var url=`${atob(value)}?width=${width}&height=${height}&type=h5`;
2926
-
2927
- if (JSChart.LastVersion!=null) return; //只请求一次
2928
-
2929
- JSNetwork.HttpRequest({
2930
- url: url,
2931
- type:"get",
2932
- dataType: "json",
2933
- async:true,
2934
- success:function(data)
2935
- {
2936
- JSConsole.Chart.Log("[JSChartContainer::GetLatestVersion] hqchart latest version. ",data);
2937
- JSChart.LastVersion=data;
2938
- },
2939
- error:function(request, textStatus, errorThrown)
2940
- {
2941
- JSConsole.Chart.Log("[JSChartContainer::GetLatestVersion] Get HQChart latest version failed.", request);
2942
- }
2943
- });
2944
- }, waittimer);
2945
- }
2946
-
2947
2948
  //设置焦点
2948
2949
  this.SetFocus=function()
2949
2950
  {
@@ -3059,6 +3060,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
3059
3060
  this.UIOnContextMenu=function(e)
3060
3061
  {
3061
3062
  if (this.ChartSplashPaint && this.ChartSplashPaint.IsEnableSplash == true) return;
3063
+ if (!this.IsShowRightMenu) return;
3062
3064
 
3063
3065
  var x = e.clientX-this.UIElement.getBoundingClientRect().left;
3064
3066
  var y = e.clientY-this.UIElement.getBoundingClientRect().top;
@@ -3300,7 +3302,6 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
3300
3302
  }
3301
3303
 
3302
3304
  this.HideSelectRect();
3303
- if (this.SelectRectRightMenu) this.SelectRectRightMenu.Hide();
3304
3305
  if (this.ChartPictureMenu) this.ChartPictureMenu.Hide();
3305
3306
 
3306
3307
  var paint=this.GetRectSelectPaint();
@@ -3940,17 +3941,19 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
3940
3941
  }
3941
3942
  else
3942
3943
  {
3943
- if (isShowMenu && this.SelectRectRightMenu)
3944
+ if (isShowMenu)
3944
3945
  {
3945
- e.data=
3946
- {
3946
+ var data=
3947
+ {
3947
3948
  Chart:this,
3948
3949
  X:drag.LastMove.X-uielement.getBoundingClientRect().left,
3949
3950
  Y:drag.LastMove.Y-uielement.getBoundingClientRect().top,
3950
3951
  SelectData:selectData, //区间选择的数据
3951
3952
  RectSelectPaint:paint //区间选择背景
3952
3953
  };
3953
- this.SelectRectRightMenu.DoModal(e);
3954
+
3955
+ e.data=data;
3956
+ this.PopupSelectRectMenuV2(data, e);
3954
3957
  }
3955
3958
  }
3956
3959
  }
@@ -9002,6 +9005,225 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
9002
9005
  }
9003
9006
  }
9004
9007
  }
9008
+
9009
+ this.PopupMenuByTab=function(menuData, rtTab)
9010
+ {
9011
+ if (!this.JSPopMenu) return;
9012
+
9013
+ var pixelRatio=GetDevicePixelRatio();
9014
+ var rtCell={ Left:rtTab.Left/pixelRatio, Right:rtTab.Right/pixelRatio, Bottom:rtTab.Bottom/pixelRatio, Top:rtTab.Top/pixelRatio };
9015
+ rtCell.Width=rtCell.Right-rtCell.Left;
9016
+ rtCell.Height=rtCell.Bottom-rtCell.Top;
9017
+
9018
+ var rtClient=this.UIElement.getBoundingClientRect();
9019
+ var rtScroll=GetScrollPosition();
9020
+
9021
+ var offsetLeft=rtClient.left+rtScroll.Left;
9022
+ var offsetTop=rtClient.top+rtScroll.Top;
9023
+ rtCell.Left+=offsetLeft;
9024
+ rtCell.Right+=offsetLeft;
9025
+ rtCell.Top+=offsetTop;
9026
+ rtCell.Bottom+=offsetTop;
9027
+
9028
+ this.JSPopMenu.CreatePopMenu(menuData);
9029
+ this.JSPopMenu.PopupMenuByTab(rtCell);
9030
+ }
9031
+
9032
+ this.PopuMenuByRClick=function(menuData, x, y)
9033
+ {
9034
+ var rtClient=this.UIElement.getBoundingClientRect();
9035
+ var rtScroll=GetScrollPosition();
9036
+
9037
+ x+=rtClient.left+rtScroll.Left;
9038
+ y+=rtClient.top+rtScroll.Top;
9039
+
9040
+ this.JSPopMenu.CreatePopMenu(menuData);
9041
+ this.JSPopMenu.PopupMenuByRight(x,y);
9042
+ }
9043
+
9044
+ //点击右键菜单
9045
+ this.OnClickRightMenu=function(data)
9046
+ {
9047
+ JSConsole.Chart.Log('[JSChartContainer::OnClickRightMenu] ',data);
9048
+ if (!data || !data.Data) return;
9049
+
9050
+ var cmdID=data.Data.ID; //命令ID
9051
+ var aryArgs=data.Data.Args; //参数
9052
+ var param=null, srcParam=null; //原始值
9053
+ if (IFrameSplitOperator.IsNonEmptyArray(aryArgs))
9054
+ {
9055
+ srcParam=aryArgs[0];
9056
+ if (IFrameSplitOperator.IsNumber(aryArgs[0])) param=aryArgs[0];
9057
+ }
9058
+
9059
+ switch(cmdID)
9060
+ {
9061
+ case JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID:
9062
+ if (this.ChangePeriod && param!=null)
9063
+ this.ChangePeriod(param);
9064
+ break;
9065
+ case JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID:
9066
+ if (this.ChangeIndexWindowCount && param!=null)
9067
+ this.ChangeIndexWindowCount(param);
9068
+ break;
9069
+ case JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID:
9070
+ if (this.ChangeRight && param!=null)
9071
+ this.ChangeRight(param);
9072
+ break;
9073
+ case JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID:
9074
+ if (this.ChangeIndex && param!=null && aryArgs[1])
9075
+ this.ChangeIndex(param,aryArgs[1]);
9076
+ break;
9077
+
9078
+ case JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID:
9079
+ case JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID:
9080
+ if (this.ChangeInstructionIndex && aryArgs[0])
9081
+ this.ChangeInstructionIndex(aryArgs[0]);
9082
+ break;
9083
+ case JSCHART_MENU_ID.CMD_DELETE_COLOR_INDEX_ID: //删除五彩K线指标
9084
+ case JSCHART_MENU_ID.CMD_DELETE_TRADE_INDEX_ID: //删除专家系统(交易指标)
9085
+ if (this.CancelInstructionIndex) this.CancelInstructionIndex();
9086
+ break;
9087
+ case JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID: //切换K线类型
9088
+ if (this.ChangeKLineDrawType && param!=null)
9089
+ this.ChangeKLineDrawType(param,aryArgs[1],aryArgs[2]);
9090
+ break;
9091
+ case JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID: //缺口提示
9092
+ if (this.ChangePriceGap && IFrameSplitOperator.IsBool(aryArgs[0]))
9093
+ {
9094
+ if (aryArgs[0]==false)
9095
+ {
9096
+ this.ChangePriceGap({ Enable:aryArgs[0] });
9097
+ }
9098
+ else
9099
+ {
9100
+ if (IFrameSplitOperator.IsNumber(aryArgs[1]))
9101
+ this.ChangePriceGap({ Enable:aryArgs[0], Count:aryArgs[1] });
9102
+ }
9103
+ }
9104
+ break;
9105
+ case JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID:
9106
+ if (aryArgs[1]===true)
9107
+ {
9108
+ if (this.OverlaySymbol && aryArgs[0]) this.OverlaySymbol(aryArgs[0]);
9109
+ }
9110
+ else if (aryArgs[1]===false)
9111
+ {
9112
+ if (this.DeleteOverlaySymbol && aryArgs[0]) this.DeleteOverlaySymbol(aryArgs[0]);
9113
+ }
9114
+ break;
9115
+ case JSCHART_MENU_ID.CMD_DELETE_ALL_OVERLAY_SYMBOL_ID:
9116
+ if (this.ClearOverlaySymbol) this.ClearOverlaySymbol();
9117
+ break;
9118
+ case JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID:
9119
+ if (this.ChangeCoordinateType && aryArgs[0]) this.ChangeCoordinateType(aryArgs[0]);
9120
+ break;
9121
+ case JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID:
9122
+ if (aryArgs[0] && IFrameSplitOperator.IsBool(aryArgs[1]))
9123
+ {
9124
+ if (aryArgs[1]==true && this.AddKLineInfo) this.AddKLineInfo(aryArgs[0],true);
9125
+ else if (aryArgs[1]==false && this.DeleteKLineInfo) this.DeleteKLineInfo(aryArgs[0]);
9126
+ }
9127
+ break;
9128
+ case JSCHART_MENU_ID.CMD_DELETE_ALL_KLINE_INFO_ID:
9129
+ if (this.ClearKLineInfo) this.ClearKLineInfo();
9130
+ break;
9131
+ case JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID:
9132
+ if (param!=null) this.DragMode=param;
9133
+ break;
9134
+ case JSCHART_MENU_ID.CMD_CHANGE_BG_SPLIT_ID:
9135
+ if (IFrameSplitOperator.IsBool(srcParam))
9136
+ {
9137
+ if (srcParam)
9138
+ {
9139
+ this.CreateExtendChart("SessionBreaksPaint", { });
9140
+ this.Draw();
9141
+ }
9142
+ else
9143
+ {
9144
+ var finder=this.GetExtendChartByClassName("SessionBreaksPaint");
9145
+ if (finder)
9146
+ {
9147
+ this.DeleteExtendChartByID(finder.Chart.ID);
9148
+ this.Draw();
9149
+ }
9150
+ }
9151
+ }
9152
+ break;
9153
+ case JSCHART_MENU_ID.CMD_SHOW_DRAWTOOL_ID:
9154
+ var option={Name:'画图工具', Top:this.Frame.ChartBorder.Top };
9155
+ var extendChart=this.CreateExtendChart(option.Name, option); //创建扩展图形
9156
+ this.SetSizeChange(true);
9157
+ this.Draw();
9158
+ break;
9159
+ case JSCHART_MENU_ID.CMD_HIDE_DRAWTOOL_ID:
9160
+ var drawTools=this.GetExtendChartByClassName('DrawToolsButton');
9161
+ if (drawTools)
9162
+ {
9163
+ var toolsWidth=drawTools.Chart.Width;
9164
+ var toolsIndex=parseInt(drawTools.Index);
9165
+ for(var i=toolsIndex+1; i<this.ExtendChartPaint.length; ++i) //在画图工具后面创建的需要减去工具的宽度
9166
+ {
9167
+ var item=this.ExtendChartPaint[i];
9168
+ if (item.ClassName=='StockChip')
9169
+ {
9170
+ item.Left-=toolsWidth;
9171
+ }
9172
+ }
9173
+ this.DeleteExtendChart(drawTools);
9174
+ this.Frame.ChartBorder.Right-=toolsWidth;
9175
+ this.SetSizeChange(true);
9176
+ this.Draw();
9177
+ }
9178
+ break;
9179
+ case JSCHART_MENU_ID.CMD_SHOW_STOCKCHIP_ID:
9180
+ var option={Name:'筹码分布', ShowType:1, Width:230 };
9181
+ var extendChart=this.CreateExtendChart(option.Name, option); //创建扩展图形
9182
+ this.SetSizeChange(true);
9183
+ this.Draw();
9184
+ break;
9185
+ case JSCHART_MENU_ID.CMD_HIDE_STOCKCHIP_ID:
9186
+ var StockChip=chart.GetExtendChartByClassName('StockChip');
9187
+ if (StockChip)
9188
+ {
9189
+ var chipWidth=StockChip.Chart.Width;
9190
+ var chipIndex=parseInt(StockChip.Index);
9191
+ for(var i=chipIndex+1; i<this.ExtendChartPaint.length; ++i) //在筹码后面创建的需要筹码的宽度
9192
+ {
9193
+ var item=this.ExtendChartPaint[i];
9194
+ if (item.ClassName=='DrawToolsButton')
9195
+ {
9196
+ item.Left-=chipWidth;
9197
+ }
9198
+ }
9199
+ this.DeleteExtendChart(StockChip);
9200
+ this.Frame.ChartBorder.Right-=chipWidth;
9201
+ this.SetSizeChange(true);
9202
+ this.Draw();
9203
+ }
9204
+ break;
9205
+ case JSCHART_MENU_ID.CMD_ENABLE_SELECT_RECT_ID:
9206
+ if (IFrameSplitOperator.IsBool(srcParam))
9207
+ this.EnableSelectRect=srcParam;
9208
+ break;
9209
+ case JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID:
9210
+ if (this.ChangeDayCount && param!=null)
9211
+ this.ChangeDayCount(param);
9212
+ break;
9213
+ case JSCHART_MENU_ID.CMD_SHOW_BEFORE_DATA_ID:
9214
+ if (this.ShowCallAuctionData && IFrameSplitOperator.IsBool(srcParam))
9215
+ this.ShowCallAuctionData({ Left:srcParam, MultiDay:{ Left:srcParam }});
9216
+ break;
9217
+
9218
+ case JSCHART_MENU_ID.CMD_SELECTED_ZOOM_ID:
9219
+ if (this.ShowSelectData && srcParam) this.ShowSelectData(srcParam);
9220
+ break;
9221
+ case JSCHART_MENU_ID.CMD_SELECTED_SUMMARY_ID:
9222
+ var dlg=new KLineSelectRectDialog(this.DivElement);
9223
+ dlg.DoModal(srcParam);
9224
+ break;
9225
+ }
9226
+ }
9005
9227
  }
9006
9228
 
9007
9229
  function GetDevicePixelRatio()
@@ -9099,11 +9321,12 @@ function GetScrollPosition()
9099
9321
  var scrollPos={};
9100
9322
  var scrollTop=0;
9101
9323
  var scrollLeft=0;
9102
- if(document.documentElement && document.documentElement.scrollTop)
9324
+ if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft))
9103
9325
  {
9104
9326
  scrollTop=document.documentElement.scrollTop;
9105
9327
  scrollLeft=document.documentElement.scrollLeft;
9106
- }else if(document.body)
9328
+ }
9329
+ else if(document.body)
9107
9330
  {
9108
9331
  scrollTop=document.body.scrollTop;
9109
9332
  scrollLeft=document.body.scrollLeft;
@@ -44067,7 +44290,8 @@ function FrameButtomToolbarPaint()
44067
44290
  this.Canvas.fillRect(rtBG.Left,rtBG.Top,rtBG.Width,rtBG.Height);
44068
44291
  }
44069
44292
 
44070
- var font=this.TitleFont(rtBG.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom);
44293
+ var font=this.GetTitleFont(rtBG.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom);
44294
+ var svgFont=this.GetSVGFont(rtBG.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom);
44071
44295
  this.Canvas.textBaseline='middle';
44072
44296
  this.Canvas.textAlign='center';
44073
44297
  this.Canvas.font=font;
@@ -44075,9 +44299,23 @@ function FrameButtomToolbarPaint()
44075
44299
  for(var i=0;i<this.AryButton.length;++i)
44076
44300
  {
44077
44301
  var item=this.AryButton[i];
44078
- if (!item.Title) return;
44079
- var textWidth=this.Canvas.measureText(item.Title).width+2;
44080
- var buttonWidth=textWidth+this.ButtonConfig.Mergin.Left+this.ButtonConfig.Mergin.Right;
44302
+ if (!item.Title && !(item.SVGButton && item.SVGButton.Symbol)) return;
44303
+
44304
+ var textWidth=0;
44305
+ if (item.Title)
44306
+ {
44307
+ textWidth=this.Canvas.measureText(item.Title).width+2;
44308
+ }
44309
+
44310
+ var svgButtonWidth=0;
44311
+ if (item.SVGButton && item.SVGButton.Symbol)
44312
+ {
44313
+ svgButtonWidth=this.ButtonConfig.SVG.Size;
44314
+ if (textWidth>0) svgButtonWidth+=this.ButtonConfig.SVG.MerginLeft;
44315
+
44316
+ }
44317
+
44318
+ var buttonWidth=textWidth+svgButtonWidth+this.ButtonConfig.Mergin.Left+this.ButtonConfig.Mergin.Right;
44081
44319
  var rtButton={ Left:xBotton, Top:rtBG.Top, Bottom:rtBG.Bottom, Height:rtBG.Height, Width:buttonWidth };
44082
44320
  rtButton.Right=rtButton.Left+rtButton.Width;
44083
44321
 
@@ -44114,12 +44352,50 @@ function FrameButtomToolbarPaint()
44114
44352
  this.Canvas.stroke();
44115
44353
  }
44116
44354
 
44117
- this.Canvas.fillStyle=titleColor;
44118
- var xText=rtButton.Left+rtButton.Width/2; //居中
44119
- var yText=rtButton.Top+this.ButtonConfig.Mergin.Top+(rtButton.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom)/2;
44120
- this.Canvas.fillText(item.Title,xText,yText);
44355
+ if (item.Title)
44356
+ {
44357
+ this.Canvas.fillStyle=titleColor;
44358
+ var xText=rtButton.Left+(rtButton.Width-svgButtonWidth)/2; //居中
44359
+ var yText=rtButton.Top+this.ButtonConfig.Mergin.Top+(rtButton.Height-this.ButtonConfig.Mergin.Top-this.ButtonConfig.Mergin.Bottom)/2;
44360
+ this.Canvas.fillText(item.Title,xText,yText);
44361
+ }
44362
+
44363
+
44364
+ var rtSVG=null;
44365
+ if (item.SVGButton && item.SVGButton.Symbol)
44366
+ {
44367
+ this.Canvas.font=svgFont;
44368
+ this.Canvas.fillStyle=titleColor;
44369
+ var xText=rtButton.Right-this.ButtonConfig.SVG.Size/2-this.ButtonConfig.Mergin.Right;
44370
+ this.Canvas.fillText(item.SVGButton.Symbol,xText,yText);
44371
+ this.Canvas.font=font;
44372
+
44373
+ 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};
44374
+ rtSVG.Right=rtSVG.Left+rtSVG.Width;
44375
+ rtSVG.Bottom=rtSVG.Top+rtSVG.Height;
44376
+ }
44377
+
44378
+ //{ Rect:rtButton, ID:item.ID, Data:item, RectSVG:rtSVG }
44379
+ if (textWidth>0 && svgButtonWidth>0)
44380
+ {
44381
+ var rtText={ Left:rtButton.Left, Top:rtButton.Top, Bottom:rtButton.Bottom };
44382
+ rtText.Right=rtText.Left+textWidth+this.ButtonConfig.Mergin.Left+this.ButtonConfig.SVG.MerginLeft/2;
44383
+ var cacheItem={ Rect:rtText, ID:item.ID, Data:item, RectCell:rtButton, ButtonType:0 };
44384
+ this.AryRectButton.push(cacheItem);
44385
+
44386
+ var rtSVG={Left:rtText.Right, Right:rtButton.Right, Top:rtButton.Top, Bottom:rtButton.Bottom };
44387
+ var cacheItem={ Rect:rtSVG, ID:item.ID, Data:item, RectCell:rtButton, ButtonType:1 };
44388
+ this.AryRectButton.push(cacheItem);
44389
+ }
44390
+ else
44391
+ {
44392
+ var cacheItem={ Rect:rtButton, ID:item.ID, Data:item, RectCell:rtButton }; //RectCell 全部的大小
44393
+ if (textWidth>0) cacheItem.ButtonType=0;
44394
+ else if (svgButtonWidth>0) cacheItem.ButtonType=1;
44395
+ this.AryRectButton.push(cacheItem);
44396
+ }
44397
+
44121
44398
 
44122
- this.AryRectButton.push({ Rect:rtButton, ID:item.ID, Data:item });
44123
44399
 
44124
44400
  xBotton+=buttonWidth+1;
44125
44401
  }
@@ -44148,13 +44424,22 @@ function FrameButtomToolbarPaint()
44148
44424
  return null;
44149
44425
  }
44150
44426
 
44151
- this.TitleFont=function(height)
44427
+ this.GetTitleFont=function(height)
44152
44428
  {
44153
44429
  var config=this.ButtonConfig.Font;
44154
- var fontSize=height;
44430
+ var fontSize=height*GetDevicePixelRatio();
44155
44431
  if (IFrameSplitOperator.IsPlusNumber(config.Size)) fontSize=config.Size;
44156
44432
 
44157
- var font=`${fontSize*GetDevicePixelRatio()}px ${config.Family}`;
44433
+ var font=`${fontSize}px ${config.Family}`;
44434
+ return font;
44435
+ }
44436
+
44437
+ this.GetSVGFont=function(height)
44438
+ {
44439
+ var config=this.ButtonConfig.SVG;
44440
+ var fontSize=height*GetDevicePixelRatio();
44441
+ if (IFrameSplitOperator.IsPlusNumber(config.Size)) fontSize=config.Size;
44442
+ var font=`${fontSize}px ${config.Family}`;
44158
44443
  return font;
44159
44444
  }
44160
44445
 
@@ -44167,7 +44452,7 @@ function FrameButtomToolbarPaint()
44167
44452
  if (x>rect.Left && x<rect.Right && y>rect.Top && y<rect.Bottom)
44168
44453
  {
44169
44454
  var frame=this.GetFrame();
44170
- var result={ ID:item.Data.ID, Rect:rect, FrameID:this.FrameID, Frame:frame, Data:item.Data };
44455
+ var result={ ID:item.Data.ID, Rect:rect, FrameID:this.FrameID, Frame:frame, Data:item.Data, ButtonType:item.ButtonType, RectCell:item.RectCell, };
44171
44456
  return result;
44172
44457
  }
44173
44458
  }
@@ -53508,7 +53793,7 @@ function IChartDrawPicture()
53508
53793
  if (option.LineWidth>0) this.LineWidth=option.LineWidth;
53509
53794
  if (option.AreaColor) this.AreaColor=option.AreaColor;
53510
53795
  if (option.PointColor) this.PointColor=option.PointColor;
53511
- if (option.MoveOnPointColor) this.SelectPointColor=option.PointColor;
53796
+ if (option.MoveOnPointColor) this.MoveOnPointColor=option.MoveOnPointColor;
53512
53797
  if (option.PointRadius) this.PointRadius=option.PointRadius;
53513
53798
  if (IFrameSplitOperator.IsNumber(option.SquareSize)) this.SquareSize=option.SquareSize;
53514
53799
  if (IFrameSplitOperator.IsBool(option.IsShowPoint)) this.IsShowPoint=option.IsShowPoint;
@@ -53707,8 +53992,8 @@ function IChartDrawPicture()
53707
53992
  for(var i=0; i<this.Point.length; ++i)
53708
53993
  {
53709
53994
  var item=this.Point[i];
53710
- var xValue=parseInt(this.Frame.GetXData(item.Y));
53711
- var yValue=this.Frame.GetYData(item.X);
53995
+ var xValue=parseInt(this.Frame.GetXData(item.Y,false));
53996
+ var yValue=this.Frame.GetYData(item.X,false);
53712
53997
 
53713
53998
  var valueItem={ XValue:xValue, YValue:yValue };
53714
53999
  var minuteItem=data.Data[xValue];
@@ -53722,8 +54007,8 @@ function IChartDrawPicture()
53722
54007
  for(var i=0; i<this.Point.length; ++i)
53723
54008
  {
53724
54009
  var item=this.Point[i];
53725
- var xValue=parseInt(this.Frame.GetXData(item.X));
53726
- var yValue=this.Frame.GetYData(item.Y);
54010
+ var xValue=parseInt(this.Frame.GetXData(item.X,false));
54011
+ var yValue=this.Frame.GetYData(item.Y,false);
53727
54012
 
53728
54013
  if (xValue>=data.Data.length) //超过当前数据,直接读固定时间
53729
54014
  {
@@ -53798,7 +54083,7 @@ function IChartDrawPicture()
53798
54083
  }
53799
54084
 
53800
54085
  data.FindDataIndexByDateTime(aryDateTime);
53801
- for(var i in aryDateTime)
54086
+ for(var i=0; i<aryDateTime.length; ++i)
53802
54087
  {
53803
54088
  var findItem=aryDateTime[i];
53804
54089
  var valueItem=this.Value[i];
@@ -53806,6 +54091,17 @@ function IChartDrawPicture()
53806
54091
  }
53807
54092
  }
53808
54093
 
54094
+ //重置X索引数据
54095
+ this.ResetXValue=function()
54096
+ {
54097
+ for(var i=0; i<this.Value.length; ++i)
54098
+ {
54099
+ var item=this.Value[i];
54100
+ item.XValue=null;
54101
+ }
54102
+ return true;
54103
+ }
54104
+
53809
54105
  //xStep,yStep 移动的偏移量
53810
54106
  this.Move=function(xStep,yStep)
53811
54107
  {
@@ -53931,6 +54227,8 @@ function IChartDrawPicture()
53931
54227
  for(var i=0; i<this.Value.length; ++i)
53932
54228
  {
53933
54229
  var item=this.Value[i];
54230
+ if (!IFrameSplitOperator.IsNumber(item.XValue)) return null; //无效索引 不显示
54231
+
53934
54232
  var dataIndex=item.XValue-data.DataOffset;
53935
54233
  if (dataIndex<0 || dataIndex>=showCount) ++invaildX;
53936
54234
 
@@ -55001,7 +55299,7 @@ function ChartDrawPictureLine()
55001
55299
  if (this.IsFrameMinSize()) return;
55002
55300
  if (!this.IsShow) return;
55003
55301
 
55004
- var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:true} );
55302
+ var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:false} );
55005
55303
  if (!drawPoint) return;
55006
55304
  if (drawPoint.length!=2) return;
55007
55305
 
@@ -55621,8 +55919,9 @@ function ChartDrawHLine()
55621
55919
 
55622
55920
  this.Button=
55623
55921
  {
55624
- CloseIcon: { Text:'\ue62b', Color:'rgb(255,255,255)', Family:"iconfont", Size:16 },
55625
- SettingIcon: { Text:'\ue623',Color:'rgb(255,255,255)', Family:"iconfont", Size:16 }
55922
+ CloseIcon: { Text:'\ue62b', Color:'rgb(255,255,255)', Family:"iconfont", Size:16, ID:JSCHART_BUTTON_ID.DRAW_PICTURE_DELETE, TooltipText:null },
55923
+ SettingIcon: { Text:'\ue623',Color:'rgb(255,255,255)', Family:"iconfont", Size:16, ID:JSCHART_BUTTON_ID.DRAW_PICTURE_SETTING, TooltipText:null }
55924
+ //修改ID, Text , TooltipText 可以外部定制按钮
55626
55925
  }
55627
55926
 
55628
55927
  this.AryButton=[];
@@ -55816,6 +56115,7 @@ function ChartDrawHLine()
55816
56115
  this.CalculateButtonSize();
55817
56116
  this.DrawValueText(drawPoint[0].Y, rtDraw, labInfo);
55818
56117
  if (labInfo) this.DrawRightLab(labInfo, rtDraw);
56118
+ if (labInfo) this.DrawCustomHLine(labInfo, drawPoint[0].Y);
55819
56119
  }
55820
56120
 
55821
56121
 
@@ -55955,6 +56255,53 @@ function ChartDrawHLine()
55955
56255
  }
55956
56256
  }
55957
56257
 
56258
+ this.DrawCustomHLine=function(labInfo, yLine)
56259
+ {
56260
+ if (!labInfo) return;
56261
+ if (!IFrameSplitOperator.IsNonEmptyArray(labInfo.AryLine)) return;
56262
+
56263
+ var left=this.Frame.ChartBorder.GetLeft();
56264
+ var right=this.Frame.ChartBorder.GetRight();
56265
+ var pixelRatio=GetDevicePixelRatio();
56266
+
56267
+ var yMax=yLine, yMin=yLine;
56268
+ for(var i=0;i<labInfo.AryLine.length;++i)
56269
+ {
56270
+ var item=labInfo.AryLine[i];
56271
+ if (!IFrameSplitOperator.IsNumber(item.Value)) continue;
56272
+
56273
+ var y=this.Frame.GetYFromData(item.Value);
56274
+ var yFixed=ToFixedPoint(y);
56275
+ var xRight=right;
56276
+ if (IFrameSplitOperator.IsNumber(item.Width)) xRight=left+item.Width*pixelRatio;
56277
+ if (item.Color) this.Canvas.strokeStyle=item.Color;
56278
+ else this.Canvas.strokeStyle=this.LineColor;
56279
+
56280
+ this.Canvas.beginPath();
56281
+ this.Canvas.moveTo(left,yFixed);
56282
+ this.Canvas.lineTo(xRight,yFixed);
56283
+ this.Canvas.stroke();
56284
+
56285
+ if (yMax<yFixed) yMax=yFixed;
56286
+ if (yMin>yFixed) yMin=yFixed;
56287
+ }
56288
+
56289
+ if (yMax!=yMin && labInfo.VLine)
56290
+ {
56291
+ var item=labInfo.VLine;
56292
+ var x=left+20*pixelRatio;
56293
+ if (IFrameSplitOperator.IsNumber(item.XOffset)) x=left+item.XOffset*pixelRatio;
56294
+ x=ToFixedPoint(x);
56295
+ if (item.Color) this.Canvas.strokeStyle=item.Color;
56296
+ else this.Canvas.strokeStyle=this.LineColor;
56297
+
56298
+ this.Canvas.beginPath();
56299
+ this.Canvas.moveTo(x,yMax);
56300
+ this.Canvas.lineTo(x,yMin);
56301
+ this.Canvas.stroke();
56302
+ }
56303
+ }
56304
+
55958
56305
  this.DrawValueText=function(y, rtDraw, labInfo)
55959
56306
  {
55960
56307
  var left=this.Frame.ChartBorder.GetLeft();
@@ -56099,7 +56446,7 @@ function ChartDrawHLine()
56099
56446
  this.Canvas.fillStyle=icon.Color;
56100
56447
  this.Canvas.fillText(this.Button.SettingIcon.Text,xCenter,yCenter);
56101
56448
 
56102
- this.AryButton.push({Rect:rtButton, ID:JSCHART_BUTTON_ID.DRAW_PICTURE_SETTING});
56449
+ this.AryButton.push({Rect:rtButton, ID:icon.ID, TooltipText:icon.TooltipText});
56103
56450
 
56104
56451
  /*
56105
56452
  if (this.ColseButtonSize>0)
@@ -56131,7 +56478,7 @@ function ChartDrawHLine()
56131
56478
  this.Canvas.fillStyle=icon.Color;
56132
56479
  this.Canvas.fillText(this.Button.CloseIcon.Text,xCenter,yCenter);
56133
56480
 
56134
- this.AryButton.push({Rect:rtButton,ID:JSCHART_BUTTON_ID.DRAW_PICTURE_DELETE });
56481
+ this.AryButton.push({Rect:rtButton,ID:icon.ID, TooltipText:icon.TooltipText });
56135
56482
 
56136
56483
  left=rtButton.Right;
56137
56484
  }
@@ -64834,12 +65181,14 @@ function JSChartResource()
64834
65181
  BorderColor:"rgb(204,204,204)",
64835
65182
  Button:
64836
65183
  {
64837
- Font:{ Family:"微软雅黑" },
65184
+ Font:{ Family:"微软雅黑", Size:12*GetDevicePixelRatio() },
64838
65185
  TitleColor: { Selected:"rgb(255,255,255)", Default:"rgb(125,125,125)", MoveOn:"rgb(234,85,4)" },
64839
65186
  BGColor: { Selected:"rgb(234,85,4)", Default:"rgb(235,235,235)", MoveOn:"rgb(242,242,242)" },
64840
65187
  BorderColor:"rgb(204,204,204)",
64841
65188
 
64842
- Mergin: { Left:5*GetDevicePixelRatio(), Right:5*GetDevicePixelRatio(), Top:4*GetDevicePixelRatio(), Bottom:2*GetDevicePixelRatio() }
65189
+ Mergin: { Left:5*GetDevicePixelRatio(), Right:5*GetDevicePixelRatio(), Top:4*GetDevicePixelRatio(), Bottom:2*GetDevicePixelRatio() },
65190
+
65191
+ SVG:{ Family:"iconfont", Size:12*GetDevicePixelRatio(), MerginLeft:4*GetDevicePixelRatio() }
64843
65192
  }
64844
65193
  }
64845
65194
 
@@ -65858,6 +66207,15 @@ function JSChartResource()
65858
66207
  if (IFrameSplitOperator.IsNumber(item.Top)) destItem.Top=item.Top;
65859
66208
  if (IFrameSplitOperator.IsNumber(item.Bottom)) destItem.Bottom=item.Bottom;
65860
66209
  }
66210
+
66211
+ if (button.SVG)
66212
+ {
66213
+ var item=button.SVG;
66214
+ var destItem=this.FrameButtomToolbar.Button.SVG;
66215
+ if (IFrameSplitOperator.IsNumber(item.Size)) destItem.Size=item.Size;
66216
+ if (IFrameSplitOperator.IsNumber(item.MerginLeft)) destItem.MerginLeft=item.MerginLeft;
66217
+ if (item.Family) destItem.Family=item.Family;
66218
+ }
65861
66219
  }
65862
66220
 
65863
66221
  }
@@ -68120,10 +68478,9 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
68120
68478
  isShowMenu=data.IsShowMenu;
68121
68479
  }
68122
68480
 
68123
-
68124
- if (isShowMenu && this.SelectRectRightMenu)
68481
+ if (isShowMenu)
68125
68482
  {
68126
- e.data=
68483
+ var data=
68127
68484
  {
68128
68485
  Chart:this,
68129
68486
  X:x,
@@ -68131,8 +68488,9 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
68131
68488
  SelectData:selectData, //区间选择的数据
68132
68489
  RectSelectPaint:paint //区间选择背景
68133
68490
  };
68491
+ e.data=data;
68134
68492
 
68135
- this.SelectRectRightMenu.DoModal(e);
68493
+ this.PopupSelectRectMenuV2(data, e);
68136
68494
  }
68137
68495
  }
68138
68496
 
@@ -68167,7 +68525,6 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
68167
68525
  this.ShowSelectData=function(selectData)
68168
68526
  {
68169
68527
  this.HideSelectRect();
68170
- if (this.SelectRectRightMenu) this.SelectRectRightMenu.Hide();
68171
68528
 
68172
68529
  JSConsole.Chart.Log('[KLineChartContainer::ShowSelectData] selectData', selectData);
68173
68530
  var dataOffset=selectData.Start;
@@ -68252,9 +68609,9 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
68252
68609
  isShowMenu=data.IsShowMenu;
68253
68610
  }
68254
68611
 
68255
- if (isShowMenu && this.SelectRectRightMenu)
68612
+ if (isShowMenu)
68256
68613
  {
68257
- e.data=
68614
+ var data=
68258
68615
  {
68259
68616
  Chart:this,
68260
68617
  X:corssCursor.LastPoint.X/pixelTatio,
@@ -68262,7 +68619,9 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
68262
68619
  SelectData:selectData, //区间选择的数据
68263
68620
  RectSelectPaint:paint //区间选择背景
68264
68621
  };
68265
- this.SelectRectRightMenu.DoModal(e);
68622
+ e.data=data
68623
+
68624
+ this.PopupSelectRectMenuV2(data, e);
68266
68625
  }
68267
68626
  }
68268
68627
 
@@ -72169,32 +72528,315 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72169
72528
  }
72170
72529
  }
72171
72530
 
72172
-
72173
72531
  //注册鼠标右键事件
72174
72532
  this.OnRightMenu=function(x,y,e)
72175
72533
  {
72176
72534
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
72177
- if (this.RightMenu)
72178
- {
72179
- var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
72180
- e.data={ Chart:this, FrameID:frameId };
72181
- this.RightMenu.DoModal(e);
72182
- }
72183
-
72535
+ var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
72536
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
72537
+
72184
72538
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
72185
72539
  if (event)
72186
72540
  {
72187
- var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
72188
72541
  var data={ X:x, Y:y, Event:e, FrameID:frameId };
72189
72542
  event.Callback(event,data,this);
72190
72543
  }
72191
72544
  }
72192
72545
 
72546
+ //右键菜单数据
72547
+ this.GetRightMenuData=function(frameID)
72548
+ {
72549
+ var windowCount=this.Frame.SubFrame.length; //窗口个数
72550
+ var klineChart=this.ChartPaint[0];
72551
+ var priceGap=klineChart.PriceGap; //缺口配置信息
72552
+ var coordinateType=null, yCoordinateType=null; //坐标类型
72553
+ var mainFrame=null;
72554
+ if (this.Frame.SubFrame[0] && this.Frame.SubFrame[0].Frame) mainFrame=this.Frame.SubFrame[0].Frame;
72555
+ if (mainFrame)
72556
+ {
72557
+ coordinateType=mainFrame.CoordinateType;
72558
+ if (mainFrame.YSplitOperator) yCoordinateType=mainFrame.YSplitOperator.CoordinateType;
72559
+ }
72560
+
72561
+ var aryKLineInfo=[]; //信息地雷
72562
+ for(var i=0;i<this.ChartInfo.length;++i)
72563
+ {
72564
+ var item=this.ChartInfo[i];
72565
+ if (item && item.ClassName) aryKLineInfo.push(item.ClassName);
72566
+ }
72567
+
72568
+ var aryOverlaySymbol=[]; //叠加的股票列表
72569
+ for(var i=0; i<this.OverlayChartPaint.length; ++i)
72570
+ {
72571
+ var item=this.OverlayChartPaint[i];
72572
+ if (item && item.Symbol) aryOverlaySymbol.push(item.Symbol)
72573
+ }
72574
+
72575
+ var bBGSpit=false, bShowDrawTool=false, bShowStockChip=false;
72576
+ if (this.GetExtendChartByClassName("SessionBreaksPaint")) bBGSpit=true;
72577
+ if (this.GetExtendChartByClassName('DrawToolsButton')) bShowDrawTool=true; //画图工具
72578
+ if (this.GetExtendChartByClassName('StockChip')) bShowStockChip=true; //筹码
72579
+
72580
+ var aryMenu=
72581
+ [
72582
+ {
72583
+ Name:"分析周期",
72584
+ SubMenu:
72585
+ [
72586
+ { Name:"日线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[0] }, Checked:this.Period==0 },
72587
+ { Name:"周线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[1] }, Checked:this.Period==1 },
72588
+ { Name:"双周线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[21]}, Checked:this.Period==21 },
72589
+ { Name:"月线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[2]}, Checked:this.Period==2 },
72590
+ { Name:"季线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[9]}, Checked:this.Period==9 },
72591
+ { Name:"半年", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[22]}, Checked:this.Period==22 },
72592
+ { Name:"年线", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[3]}, Checked:this.Period==3 },
72593
+ { Name:"1分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[4]}, Checked:this.Period==4 },
72594
+ { Name:"5分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[5]}, Checked:this.Period==5 },
72595
+ { Name:"15分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[6]}, Checked:this.Period==6 },
72596
+ { Name:"30分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[7]}, Checked:this.Period==7 },
72597
+ { Name:"60分", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[8]}, Checked:this.Period==8 },
72598
+ { Name:"2小时", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[11]}, Checked:this.Period==11 },
72599
+ { Name:"4小时", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[12]}, Checked:this.Period==12 },
72600
+ { Name:"分笔", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[10]}, Checked:this.Period==10 },
72601
+ { Name:"自定义周期:3分钟", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[20003]}, Checked:this.Period==20003 },
72602
+ { Name:"自定义周期:35分钟", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[20035]}, Checked:this.Period==20035 },
72603
+ { Name:"自定义周期:8日", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_PERIOD_ID, Args:[40008]}, Checked:this.Period==40008 },
72604
+ ]
72605
+ },
72606
+ {
72607
+ Name:"指标切换",
72608
+ SubMenu:
72609
+ [
72610
+ { Name:"均线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "均线"]}},
72611
+ { Name:"BOLL", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "BOLL"]}},
72612
+ { Name:"MACD", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "MACD"]}},
72613
+ { Name:"KDJ", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "KDJ"]}},
72614
+ { Name:"VOL", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "VOL"]}},
72615
+ { Name:"RSI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "RSI"]}},
72616
+ { Name:"BRAR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "BRAR"]}},
72617
+ { Name:"WR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "WR"]}},
72618
+ ]
72619
+ },
72620
+ {
72621
+ Name:"五彩K线",
72622
+ SubMenu:
72623
+ [
72624
+ { Name:"十字星", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-十字星"]}},
72625
+ { Name:"早晨之星", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-早晨之星"]}},
72626
+ { Name:"垂死十字", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-垂死十字"]}},
72627
+ { Name:"三只乌鸦", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-三只乌鸦"]}},
72628
+ { Name:"光脚阴线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-光脚阴线"]}},
72629
+ { Name:"黄昏之星", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COLOR_INDEX_ID, Args:["五彩K线-黄昏之星"]}},
72630
+ ]
72631
+
72632
+ },
72633
+ {
72634
+ Name:"专家系统",
72635
+ SubMenu:
72636
+ [
72637
+ { Name:"BIAS", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-BIAS"]}},
72638
+ { Name:"CCI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-CCI"]}},
72639
+ { Name:"DMI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-DMI"]}},
72640
+ { Name:"KD", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-KD"]}},
72641
+ { Name:"BOLL", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-BOLL"]}},
72642
+ { Name:"KDJ", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_TRADE_INDEX_ID, Args:["交易系统-KDJ"]}},
72643
+ ]
72644
+ },
72645
+ {
72646
+ Name:"信息地雷",
72647
+ SubMenu:
72648
+ [
72649
+ { Name:"公告", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["公告", !aryKLineInfo.includes("AnnouncementInfo")]}, Checked:aryKLineInfo.includes("AnnouncementInfo") },
72650
+ { Name:"业绩预告", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["业绩预告", !aryKLineInfo.includes("PforecastInfo")]}, Checked:aryKLineInfo.includes("PforecastInfo") },
72651
+ { Name:"调研", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["调研", !aryKLineInfo.includes("ResearchInfo") ]}, Checked:aryKLineInfo.includes("ResearchInfo") },
72652
+ { Name:"大宗交易", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["大宗交易", !aryKLineInfo.includes("BlockTrading")]}, Checked:aryKLineInfo.includes("BlockTrading") },
72653
+ { Name:"龙虎榜", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["龙虎榜", !aryKLineInfo.includes("TradeDetail")]}, Checked:aryKLineInfo.includes("TradeDetail") },
72654
+ { Name:"互动易", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_INFO_ID, Args:["互动易", !aryKLineInfo.includes("InvestorInfo")]}, Checked:aryKLineInfo.includes("InvestorInfo") },
72655
+ ]
72656
+ },
72657
+ {
72658
+ Name:"缺口提示",
72659
+ SubMenu:
72660
+ [
72661
+ { Name:"显示1个缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[true, 1]}, Checked:(priceGap.Enable==true && priceGap.Count==1) },
72662
+ { Name:"显示2个缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[true, 2]}, Checked:(priceGap.Enable==true && priceGap.Count==2) },
72663
+ { Name:"显示3个缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[true, 3]}, Checked:(priceGap.Enable==true && priceGap.Count==3) },
72664
+ { Name:"隐藏缺口", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_PRICE_GAP_ID, Args:[false]}, Checked:priceGap.Enable==false },
72665
+ ]
72666
+ },
72667
+ {
72668
+ Name:"叠加品种",
72669
+ SubMenu:
72670
+ [
72671
+ { Name:"上证指数", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000001.sh", !aryOverlaySymbol.includes("000001.sh")]}, Checked:aryOverlaySymbol.includes("000001.sh") },
72672
+ { Name:"深证成指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399001.sz", !aryOverlaySymbol.includes("399001.sz")]}, Checked:aryOverlaySymbol.includes("399001.sz") },
72673
+ { Name:"中小板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399005.sz", !aryOverlaySymbol.includes("399005.sz")]}, Checked:aryOverlaySymbol.includes("399005.sz") },
72674
+ { Name:"创业板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399006.sz", !aryOverlaySymbol.includes("399006.sz")]}, Checked:aryOverlaySymbol.includes("399006.sz") },
72675
+ { Name:"沪深300", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000300.sh", !aryOverlaySymbol.includes("000300.sh")]}, Checked:aryOverlaySymbol.includes("000300.sh")},
72676
+ ]
72677
+ },
72678
+ {
72679
+ Name:"主图线型",
72680
+ SubMenu:
72681
+ [
72682
+ { Name:"K线(空心阳线)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[3]} },
72683
+ { Name:"K线(实心阳线)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[0]} },
72684
+ { Name:"美国线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[2, true, { IsThinAKBar:false }]} },
72685
+ { Name:"美国线(细)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[2, true, { IsThinAKBar:true }]} },
72686
+ { Name:"收盘线", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[1]} },
72687
+ { Name:"收盘面积", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[4]} },
72688
+ { Name:"K线(空心阳线阴线)", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[6]} },
72689
+ { Name:"Heikin Ashi", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[11]} },
72690
+ { Name:"Line Break", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[12]} },
72691
+ { Name:"High-low", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[13]} },
72692
+ { Name:"HLC Area", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_KLINE_TYPE_ID, Args:[15]} },
72693
+ ]
72694
+ },
72695
+ {
72696
+ Name:"坐标类型",
72697
+ SubMenu:
72698
+ [
72699
+ { Name:"反转坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ IsReverse:coordinateType==0 }]}, Checked:coordinateType==1 },
72700
+ { Name:JSPopMenu.SEPARATOR_LINE_NAME },
72701
+
72702
+ { Name:"普通坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:0 }]}, Checked:yCoordinateType==0 },
72703
+ { Name:"百分比坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:1 }]}, Checked:yCoordinateType==1 },
72704
+ { Name:"对数坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:2 }]}, Checked:yCoordinateType==2 },
72705
+ { Name:"等比坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:3 }]}, Checked:yCoordinateType==3 },
72706
+ { Name:"等分坐标", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:4 }]}, Checked:yCoordinateType==4 },
72707
+ { Name:"黄金分割", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_COORDINATETYPE_ID, Args:[{ Type:5 }]}, Checked:yCoordinateType==5},
72708
+
72709
+ ]
72710
+ },
72711
+ {
72712
+ Name:"指标窗口个数",
72713
+ SubMenu:
72714
+ [
72715
+ { Name:"1个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[2]}, Checked:2==windowCount },
72716
+ { Name:"2个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[3]}, Checked:3==windowCount },
72717
+ { Name:"3个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[4]}, Checked:4==windowCount },
72718
+ { Name:"4个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[5]}, Checked:5==windowCount },
72719
+ { Name:"5个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[6]}, Checked:6==windowCount },
72720
+ ]
72721
+ },
72722
+ {
72723
+ Name:"其他设置",
72724
+ SubMenu:
72725
+ [
72726
+
72727
+ { Name:"禁止拖拽", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID, Args:[0]}, Checked:0==this.DragMode },
72728
+ { Name:"启动拖拽", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID, Args:[1]}, Checked:1==this.DragMode },
72729
+ { Name:"区间选择", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_DRAG_MODE_ID, Args:[2]}, Checked:2==this.DragMode },
72730
+ { Name:JSPopMenu.SEPARATOR_LINE_NAME },
72731
+
72732
+ { Name:"背景分割", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_BG_SPLIT_ID, Args:[!bBGSpit]}, Checked:bBGSpit},
72733
+
72734
+ { Name:"画图工具", Data:{ ID:bShowDrawTool?JSCHART_MENU_ID.CMD_HIDE_DRAWTOOL_ID:JSCHART_MENU_ID.CMD_SHOW_DRAWTOOL_ID, Args:[]}, Checked:bShowDrawTool},
72735
+
72736
+ { Name:"移动筹码图", Data:{ ID:bShowStockChip?JSCHART_MENU_ID.CMD_HIDE_STOCKCHIP_ID:JSCHART_MENU_ID.CMD_SHOW_STOCKCHIP_ID, Args:[]}, Checked:bShowStockChip},
72737
+ ]
72738
+ }
72739
+ ];
72740
+
72741
+ //复权
72742
+ if(!MARKET_SUFFIX_NAME.IsSHSZIndex(this.Symbol) && !MARKET_SUFFIX_NAME.IsBIT(this.Symbol))
72743
+ {
72744
+ var rightMenu=
72745
+ {
72746
+ Name:"复权处理",
72747
+ SubMenu:
72748
+ [
72749
+ { Name:"不复权", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID, Args:[0]}, Checked:0==this.Right },
72750
+ { Name:"前复权", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID, Args:[1]}, Checked:1==this.Right },
72751
+ { Name:"后复权", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_RIGHT_ID, Args:[2]}, Checked:2==this.Right }
72752
+ ]
72753
+ };
72754
+
72755
+ aryMenu.splice(1,0,rightMenu);
72756
+ }
72757
+
72758
+ //删除菜单
72759
+ for(var i=0;i<aryMenu.length;++i)
72760
+ {
72761
+ var item=aryMenu[i];
72762
+ if (item.Name=="五彩K线")
72763
+ {
72764
+ if (this.ColorIndex)
72765
+ {
72766
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
72767
+ item.SubMenu.push({ Name:"删除五彩K线", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_COLOR_INDEX_ID} });
72768
+ }
72769
+ }
72770
+ else if (item.Name=="专家系统")
72771
+ {
72772
+ if (this.TradeIndex)
72773
+ {
72774
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
72775
+ item.SubMenu.push({ Name:"删除专家系统", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_TRADE_INDEX_ID} });
72776
+ }
72777
+ }
72778
+ else if (item.Name=="叠加品种")
72779
+ {
72780
+ for(var j=0;j<item.SubMenu.length;++j)
72781
+ {
72782
+ if (item.SubMenu[j].Checked)
72783
+ {
72784
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
72785
+ item.SubMenu.push({ Name:"取消叠加", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_ALL_OVERLAY_SYMBOL_ID} });
72786
+ break;
72787
+ }
72788
+ }
72789
+ }
72790
+ else if (item.Name=="信息地雷")
72791
+ {
72792
+ for(var j=0;j<item.SubMenu.length;++j)
72793
+ {
72794
+ if (item.SubMenu[j].Checked)
72795
+ {
72796
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
72797
+ item.SubMenu.push({ Name:"删除所有", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_ALL_KLINE_INFO_ID} });
72798
+ break;
72799
+ }
72800
+ }
72801
+ }
72802
+ }
72803
+
72804
+ return aryMenu;
72805
+ }
72806
+
72807
+ this.PopupRightMenuV2=function(data,e)
72808
+ {
72809
+ if (!this.JSPopMenu) return;
72810
+ var x=data.X, y=data.Y;
72811
+ var frameID=data.FrameID;
72812
+ var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
72813
+ menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
72814
+
72815
+ this.PopuMenuByRClick(menuData, x, y);
72816
+ }
72817
+
72818
+ this.PopupSelectRectMenuV2=function(data, e)
72819
+ {
72820
+ var aryMenu=
72821
+ [
72822
+ { Name:"区间统计", Data:{ ID:JSCHART_MENU_ID.CMD_SELECTED_SUMMARY_ID, Args:[e] }},
72823
+ { Name:"区间放大", Data:{ ID:JSCHART_MENU_ID.CMD_SELECTED_ZOOM_ID, Args:[data.SelectData] }}
72824
+ ];
72825
+
72826
+ var menuData={ Menu:aryMenu, Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
72827
+ menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
72828
+ var x=data.X, y=data.Y;
72829
+ this.PopuMenuByRClick(menuData, x, y);
72830
+ }
72831
+
72193
72832
  //重新加载画图工具(切换股票|周期)
72194
72833
  this.ReloadChartDrawPicture=function()
72195
72834
  {
72196
72835
  this.ChartDrawPicture=[];
72197
- this.ChartDrawStorageCache;
72836
+ if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.IsSelected=false;
72837
+ this.SelectChartDrawPicture=null;
72838
+ this.CurrentChartDrawPicture=null;
72839
+
72198
72840
  if (this.ChartDrawStorage)
72199
72841
  {
72200
72842
  this.ChartDrawStorageCache=this.ChartDrawStorage.GetDrawData( {Symbol:this.Symbol, Period:this.Period} );
@@ -73585,7 +74227,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
73585
74227
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CLICK_EXTENDCHART_BUTTON);
73586
74228
  if (event && event.Callback)
73587
74229
  {
73588
- var data={ Info:button, PreventDefault:false }; //PreventDefault 是否阻止内置的点击处理
74230
+ var data={ Info:button, PreventDefault:false, e:e }; //PreventDefault 是否阻止内置的点击处理
73589
74231
  event.Callback(event,data,this);
73590
74232
  if (data.PreventDefault) return;
73591
74233
  }
@@ -75552,22 +76194,135 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
75552
76194
  //注册鼠标右键事件
75553
76195
  this.OnRightMenu=function(x,y,e)
75554
76196
  {
75555
- if (this.RightMenu)
75556
- {
75557
- var frameId=this.Frame.PtInFrame(x,y);
75558
- e.data={ Chart:this, FrameID:frameId };
75559
- this.RightMenu.DoModal(e);
75560
- }
75561
-
76197
+ var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
76198
+ var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
76199
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
76200
+
75562
76201
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
75563
76202
  if (event)
75564
76203
  {
75565
- var frameId=this.Frame.PtInFrame(x,y);
75566
76204
  var data={ X:x, Y:y, Event:e, FrameID:frameId };
75567
76205
  event.Callback(event,data,this);
75568
76206
  }
75569
76207
  }
75570
76208
 
76209
+ //右键菜单数据
76210
+ this.GetRightMenuData=function(frameID)
76211
+ {
76212
+ var windowCount=this.Frame.SubFrame.length; //窗口个数
76213
+
76214
+ var aryOverlaySymbol=[]; //叠加的股票列表
76215
+ for(var i=0; i<this.OverlayChartPaint.length; ++i)
76216
+ {
76217
+ var item=this.OverlayChartPaint[i];
76218
+ if (item && item.Symbol) aryOverlaySymbol.push(item.Symbol)
76219
+ }
76220
+
76221
+ var bShowDrawTool=false;
76222
+ if (this.GetExtendChartByClassName('DrawToolsButton')) bShowDrawTool=true; //画图工具
76223
+
76224
+ var aryMenu=
76225
+ [
76226
+ {
76227
+ Name:"叠加品种",
76228
+ SubMenu:
76229
+ [
76230
+ { Name:"上证指数", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000001.sh", !aryOverlaySymbol.includes("000001.sh")]}, Checked:aryOverlaySymbol.includes("000001.sh") },
76231
+ { Name:"深证成指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399001.sz", !aryOverlaySymbol.includes("399001.sz")]}, Checked:aryOverlaySymbol.includes("399001.sz") },
76232
+ { Name:"中小板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399005.sz", !aryOverlaySymbol.includes("399005.sz")]}, Checked:aryOverlaySymbol.includes("399005.sz") },
76233
+ { Name:"创业板指", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["399006.sz", !aryOverlaySymbol.includes("399006.sz")]}, Checked:aryOverlaySymbol.includes("399006.sz") },
76234
+ { Name:"沪深300", Data:{ ID: JSCHART_MENU_ID.CMD_OVERLAY_SYMBOL_ID, Args:["000300.sh", !aryOverlaySymbol.includes("000300.sh")]}, Checked:aryOverlaySymbol.includes("000300.sh")},
76235
+ ]
76236
+ },
76237
+ {
76238
+ Name:"多日分时图",
76239
+ SubMenu:
76240
+ [
76241
+ { Name:"当日分时图", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[1]}, Checked:this.DayCount==1 },
76242
+ { Name:"最近2日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[2]}, Checked:this.DayCount==2 },
76243
+ { Name:"最近3日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[3]}, Checked:this.DayCount==3 },
76244
+ { Name:"最近4日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[4]}, Checked:this.DayCount==4 },
76245
+ { Name:"最近5日", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_DAY_COUNT_ID, Args:[5]}, Checked:this.DayCount==5 },
76246
+ ]
76247
+ },
76248
+ {
76249
+ Name:"指标窗口个数",
76250
+ SubMenu:
76251
+ [
76252
+ { Name:"1个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[2]}, Checked:3==windowCount },
76253
+ { Name:"2个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[3]}, Checked:4==windowCount },
76254
+ { Name:"3个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[4]}, Checked:5==windowCount },
76255
+ { Name:"4个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[5]}, Checked:6==windowCount },
76256
+ { Name:"5个窗口", Data:{ ID:JSCHART_MENU_ID.CMD_CHANGE_WINDOW_COUNT_ID, Args:[6]}, Checked:7==windowCount },
76257
+ ]
76258
+ },
76259
+ {
76260
+ Name:"指标切换",
76261
+ SubMenu:
76262
+ [
76263
+ { Name:"MACD", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "MACD"]}},
76264
+ { Name:"DMI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "DMI"]}},
76265
+ { Name:"DMA", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "DMA"]}},
76266
+ { Name:"BRAR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "BRAR"]}},
76267
+ { Name:"KDJ", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "KDJ"]}},
76268
+ { Name:"RSI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "RSI"]}},
76269
+ { Name:"WR", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "WR"]}},
76270
+ { Name:"CCI", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "CCI"]}},
76271
+ { Name:"TRIX", Data:{ ID: JSCHART_MENU_ID.CMD_CHANGE_INDEX_ID, Args:[frameID, "TRIX"]}},
76272
+ ]
76273
+ },
76274
+ {
76275
+ Name:"区间选择",Data:{ ID: JSCHART_MENU_ID.CMD_ENABLE_SELECT_RECT_ID, Args:[!this.EnableSelectRect]}, Checked:this.EnableSelectRect
76276
+ },
76277
+ {
76278
+ Name:"其他设置",
76279
+ SubMenu:
76280
+ [
76281
+ { Name:"画图工具", Data:{ ID:bShowDrawTool?JSCHART_MENU_ID.CMD_HIDE_DRAWTOOL_ID:JSCHART_MENU_ID.CMD_SHOW_DRAWTOOL_ID, Args:[]}, Checked:bShowDrawTool},
76282
+ ]
76283
+ }
76284
+
76285
+ ];
76286
+
76287
+ if (MARKET_SUFFIX_NAME.IsSHSZStockA(this.Symbol))
76288
+ {
76289
+ var item={ Name:"集合竞价",Data:{ ID: JSCHART_MENU_ID.CMD_SHOW_BEFORE_DATA_ID, Args:[!this.IsShowBeforeData] }, Checked:this.IsShowBeforeData };
76290
+ aryMenu.splice(4,0,item);
76291
+ }
76292
+
76293
+
76294
+ //删除菜单
76295
+ for(var i=0;i<aryMenu.length;++i)
76296
+ {
76297
+ var item=aryMenu[i];
76298
+ if (item.Name=="叠加品种")
76299
+ {
76300
+ for(var j=0;j<item.SubMenu.length;++j)
76301
+ {
76302
+ if (item.SubMenu[j].Checked)
76303
+ {
76304
+ item.SubMenu.push({ Name:JSPopMenu.SEPARATOR_LINE_NAME });
76305
+ item.SubMenu.push({ Name:"取消叠加", Data:{ ID: JSCHART_MENU_ID.CMD_DELETE_ALL_OVERLAY_SYMBOL_ID} });
76306
+ break;
76307
+ }
76308
+ }
76309
+ }
76310
+ }
76311
+
76312
+ return aryMenu;
76313
+ }
76314
+
76315
+ this.PopupRightMenuV2=function(data,e)
76316
+ {
76317
+ if (!this.JSPopMenu) return;
76318
+ var x=data.X, y=data.Y;
76319
+ var frameID=data.FrameID;
76320
+ var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
76321
+ menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
76322
+
76323
+ this.PopuMenuByRClick(menuData, x, y);
76324
+ }
76325
+
75571
76326
  this.OnWheel=function(e)
75572
76327
  {
75573
76328
  JSConsole.Chart.Log('[MinuteChartContainer::OnWheel]',e);
@@ -76672,15 +77427,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
76672
77427
  this.ResetDayOffset();
76673
77428
  }
76674
77429
 
76675
- if (this.DayCount>1)
76676
- {
76677
- this.ChartDrawPicture=[];
76678
- }
76679
- else
76680
- {
76681
- this.ReloadChartDrawPicture();
76682
- }
76683
-
77430
+ this.ReloadChartDrawPicture();
76684
77431
  this.ResetDataStatus();
76685
77432
  this.ClearIndexPaint(); //清空指标
76686
77433
  this.Frame.ClearYCoordinateMaxMin();
@@ -77202,6 +77949,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
77202
77949
  this.TitlePaint[0].IsShowDate=true;
77203
77950
  this.UpdateDataOffset();
77204
77951
  this.UpdateFrameMaxMin(); //调整坐标最大 最小值
77952
+ this.CreateChartDrawPictureByStorage(); //创建画图工具
77205
77953
 
77206
77954
  //执行脚本
77207
77955
  if (this.Frame.SubFrame.length>2)
@@ -77500,7 +78248,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
77500
78248
  this.UpdateLatestMinuteDataV2(minuteData);
77501
78249
  this.UpdateHistoryMinuteUI(updateTime);
77502
78250
  this.RecvMinuteDataEvent({FunctionName:"RecvUpdateMinuteData"} );
77503
- this.RequestOverlayMinuteData(); //请求叠加数据 (主数据下载完再下载)
78251
+ this.RequestOverlayMinuteData(); //请求叠加数据 (主数据下载完再下载)
77504
78252
  this.BindAllOverlayIndexData(this.SourceData);
77505
78253
  this.AutoUpdateEvent(true, "MinuteChartContainer::RecvUpdateMinuteData");
77506
78254
  this.AutoUpdate();
@@ -78920,7 +79668,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
78920
79668
  this.ReloadChartDrawPicture=function()
78921
79669
  {
78922
79670
  this.ChartDrawPicture=[];
78923
- this.ChartDrawStorageCache;
79671
+ if (this.SelectChartDrawPicture) this.SelectChartDrawPicture.IsSelected=false;
79672
+ this.SelectChartDrawPicture=null;
79673
+ this.CurrentChartDrawPicture=null;
79674
+ this.MoveOnChartDrawPicture=null;
79675
+
78924
79676
  if (this.ChartDrawStorage)
78925
79677
  {
78926
79678
  this.ChartDrawStorageCache=this.ChartDrawStorage.GetDrawData( { Symbol:this.Symbol, Period:888888888 } );
@@ -78931,7 +79683,8 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
78931
79683
  {
78932
79684
  if (!this.ChartDrawStorageCache || this.ChartDrawStorageCache.length<=0) return;
78933
79685
 
78934
- for(var i in this.ChartDrawStorageCache)
79686
+ var self=this;
79687
+ for(var i=0; i<this.ChartDrawStorageCache.length; ++i)
78935
79688
  {
78936
79689
  var item=this.ChartDrawStorageCache[i];
78937
79690
  if (item.FrameID<0 || !this.Frame.SubFrame || this.Frame.SubFrame.length<item.FrameID) continue;
@@ -78942,8 +79695,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
78942
79695
  drawPicture.Canvas=this.Canvas;
78943
79696
  drawPicture.Status=10;
78944
79697
  drawPicture.Frame=this.Frame.SubFrame[item.FrameID].Frame; //绑定框架坐标
79698
+ if (drawPicture.ImportStorageData) drawPicture.ImportStorageData(item);
79699
+ drawPicture.ResetXValue();
78945
79700
  drawPicture.UpdateXValue();
78946
79701
  drawPicture.ValueToPoint();
79702
+ drawPicture.GetActiveDrawPicture=()=>{ return this.GetActiveDrawPicture(); }
78947
79703
 
78948
79704
  if (drawPicture.ClassName==='ChartDrawPictureText') drawPicture.IsInitialized=true;
78949
79705
 
@@ -85483,1479 +86239,6 @@ function WaitDialog(divElement)
85483
86239
  }
85484
86240
  }
85485
86241
 
85486
- //K线右键菜单类
85487
- //id:"kline"
85488
- function KLineRightMenu(divElement)
85489
- {
85490
- this.newMethod=IDivDialog; //派生
85491
- this.newMethod(divElement);
85492
- delete this.newMethod;
85493
-
85494
- this.option={};
85495
-
85496
- this.Create = function () {
85497
- var _self = this;
85498
-
85499
- this.ID=Guid();
85500
-
85501
- _self.BindData();
85502
- _self.BindEvent();
85503
- }
85504
- this.BindData=function(){
85505
- var _self = this;
85506
-
85507
- var id=this.DivElement.id;
85508
- var $body = $("#" + id);
85509
-
85510
- $body.find("div[id^='topMenu_']").remove();
85511
- $body.find("div[id^='childMenu_']").remove();
85512
-
85513
- var $topMenu = $("<div />");
85514
- $topMenu.attr("id", "topMenu_"+_self.ID).addClass("context-menu-wrapper topmenu").hide();
85515
- $body.append($topMenu);
85516
-
85517
- var $topTable = $("<table />");
85518
- $topTable.attr({ id: "topTable_" + _self.ID, cellspacing: "0", cellpadding: "0" }).addClass("context-menu");
85519
- $topMenu.append($topTable);
85520
-
85521
- $topTable.append(_self.childrenList(_self.option.data));
85522
-
85523
- for (var i = 0; i < _self.option.data.length; i++) {
85524
- var isHasChildren = typeof _self.option.data[i].children != "undefined";
85525
-
85526
- if (isHasChildren) {
85527
-
85528
- var $childMenu = $("<div />");
85529
- $childMenu.attr({ id: "childMenu_"+_self.ID + i, "data-index": i }).addClass("context-menu-wrapper").hide();
85530
- $body.append($childMenu);
85531
-
85532
- var $childTable = $("<table />");
85533
- $childTable.attr({ id: "childTable_" + _self.ID + i, cellspacing: "0", cellpadding: "0" }).addClass("context-menu");
85534
- $childMenu.append($childTable);
85535
-
85536
- $childTable.append(_self.childrenList(_self.option.data[i].children));
85537
- }
85538
- }
85539
- }
85540
-
85541
- this.Update=function()
85542
- {
85543
- var _self = this;
85544
- //var id=this.DivElement.id;
85545
- //var $body=$("#"+id);
85546
- //
85547
- //var $topTable = $("#topTable_" + _self.ID);
85548
- //$topTable.empty();
85549
- //$topTable.append(_self.childrenList(_self.option.data));
85550
- //
85551
- //for (var i = 0; i < _self.option.data.length; i++) {
85552
- // var isHasChildren = typeof _self.option.data[i].children != "undefined";
85553
- //
85554
- // if (isHasChildren) {
85555
- // var $childTable = $("#childTable_" + _self.ID + i);
85556
- // $childTable.empty();
85557
- // $childTable.append(_self.childrenList(_self.option.data[i].children));
85558
- // }
85559
- //}
85560
-
85561
- _self.BindData();
85562
- _self.BindEvent();
85563
- }
85564
-
85565
- this.childrenList = function(list) {
85566
- var result = [];
85567
-
85568
- for (var i = 0; i < list.length; i++) {
85569
- var isBorder = typeof list[i].isBorder != "undefined" && list[i].isBorder;
85570
-
85571
- var $tr = $("<tr />");
85572
- $tr.addClass("font_Arial context-menu");
85573
- if (isBorder)
85574
- $tr.addClass("border");
85575
-
85576
- var $td1 = $("<td />");
85577
- if(list[i].selected){
85578
- $td1.addClass("spacer context-menu").html("√");
85579
- }else{
85580
- $td1.addClass("spacer context-menu");
85581
- }
85582
-
85583
- var $td2 = $("<td />");
85584
- $td2.addClass("text").html(list[i].text);
85585
-
85586
- var $td3 = $("<td />");
85587
- $td3.addClass("right shortcut");
85588
-
85589
- var $td4 = $("<td />");
85590
- $td4.addClass(typeof list[i].children != "undefined" ? "submenu-arrow" : "context-menu spacer");
85591
-
85592
- $tr.append($td1).append($td2).append($td3).append($td4);
85593
-
85594
- result.push($tr);
85595
- }
85596
- return result;
85597
- }
85598
-
85599
- this.Show=function (obj) {
85600
- var _self = this;
85601
- $.extend(_self.option, obj);
85602
-
85603
- if (!_self.ID) _self.Create(); //判断是否重复创建
85604
- else _self.Update(); //更新菜单状态
85605
-
85606
- var $topMenu = $("#topMenu_"+_self.ID),
85607
- topWidth = $topMenu.outerWidth(),
85608
- topHeight = $topMenu.outerHeight();
85609
-
85610
- var x = _self.option.x,
85611
- y = _self.option.y;
85612
-
85613
- if (topWidth > _self.option.position.X + _self.option.position.W- x) //超过了右边距
85614
- x = x - topWidth;
85615
-
85616
- if (topHeight > _self.option.position.Y +_self.option.position.H - y)//超过了下边距
85617
- y = y - topHeight;
85618
-
85619
- $topMenu.hide();
85620
- $topMenu.css({ position:"absolute",left: x + "px", top: y + "px" }).show();
85621
-
85622
- this.isInit = true;
85623
- }
85624
-
85625
- this.Hide=function () {
85626
- var _self = this;
85627
- if (typeof($)=="undefined") return;
85628
- $("#topMenu_" + _self.ID).hide();
85629
- $("[id^='childMenu_" + _self.ID + "']").hide();
85630
- }
85631
-
85632
- this.BindEvent=function () {
85633
- var _self = this;
85634
- var $childMenu = $("[id^='childMenu_" + _self.ID + "']");
85635
-
85636
- $("#topTable_" + _self.ID).find("tr").mouseenter(function () {
85637
- var $this = $(this),
85638
- index = $this.index(),
85639
- $topMenu = $("#topMenu_" + _self.ID),
85640
- $child = $("#childMenu_" + _self.ID + index),
85641
- trWidth = $this.outerWidth(),
85642
- trHeight = $this.outerHeight();
85643
-
85644
- var left = $topMenu.position().left + trWidth + 1;
85645
- var top = $topMenu.position().top + (trHeight * index);
85646
-
85647
- if (trWidth > _self.option.position.X + _self.option.position.W - left) //超过了右边距
85648
- left = left - trWidth - $topMenu.outerWidth() - 2;
85649
-
85650
- if ($child.outerHeight() > _self.option.position.Y +_self.option.position.H - top)//超过了下边距
85651
- top = $topMenu.position().top + $topMenu.outerHeight() - $child.outerHeight();
85652
-
85653
- $childMenu.hide();
85654
- $child.css({ left: left + "px", top: top + "px" }).show();
85655
- }).mouseleave(function () {
85656
- var index = $(this).index();
85657
- setTimeout(function () {
85658
- if ($("#childMenu_" + _self.ID + index).attr("data-isShow") != 1) {
85659
- $("#childMenu_" + _self.ID + index).hide();
85660
- }
85661
- }, 10)
85662
-
85663
- }).click(function () {
85664
- var $this = $(this);
85665
- var index = $this.index();
85666
-
85667
- if ($.type(_self.option.data[index].click) == "function") {
85668
- _self.option.data[index].click(_self.option.returnData);
85669
- $this.hide();
85670
- }
85671
- }).contextmenu(function()
85672
- {
85673
- return false; //屏蔽系统右键菜单
85674
- });
85675
-
85676
-
85677
- $childMenu.mouseenter(function () {
85678
- $(this).attr("data-isShow", "1");
85679
- }).mouseleave(function () {
85680
- $(this).attr("data-isShow", "0");
85681
- }).contextmenu(function()
85682
- {
85683
- return false; //屏蔽系统右键菜单
85684
- });
85685
-
85686
- $childMenu.find("tr").click(function () {
85687
- var $this = $(this);
85688
- var divIndex = parseInt($this.closest("div").attr("data-index"));
85689
- var trIndex = $this.index();
85690
-
85691
- if ($.type(_self.option.data[divIndex].children[trIndex].click) == "function") {
85692
- _self.option.data[divIndex].children[trIndex].click(_self.option.windowIndex || 1);
85693
- $childMenu.hide();
85694
- }
85695
- });
85696
- }
85697
-
85698
- this.GetPeriod=function (chart)
85699
- {
85700
- var data=
85701
- [
85702
- {
85703
- text: "日线", Value:0,
85704
- click: function () { chart.ChangePeriod(0); }
85705
- },
85706
- {
85707
- text: "周线",Value:1,
85708
- click: function () { chart.ChangePeriod(1); }
85709
- },
85710
- {
85711
- text: "双周线",Value:21,
85712
- click: function () { chart.ChangePeriod(21); }
85713
- },
85714
- {
85715
- text: "月线",Value:2,
85716
- click: function () { chart.ChangePeriod(2); }
85717
- },
85718
- {
85719
- text: "季线",Value:9,
85720
- click: function () { chart.ChangePeriod(9); }
85721
- },
85722
- {
85723
- text: "半年",Value:22,
85724
- click: function () { chart.ChangePeriod(22); }
85725
- },
85726
- {
85727
- text: "年线",Value:3,
85728
- click: function () { chart.ChangePeriod(3); }
85729
- },
85730
- {
85731
- text: "1分",Value:4,
85732
- click: function () { chart.ChangePeriod(4); }
85733
- },
85734
- {
85735
- text: "5分",Value:5,
85736
- click: function () { chart.ChangePeriod(5); }
85737
- },
85738
- {
85739
- text: "15分",Value:6,
85740
- click: function () { chart.ChangePeriod(6); }
85741
- },
85742
- {
85743
- text: "30分",Value:7,
85744
- click: function () { chart.ChangePeriod(7); }
85745
- },
85746
- {
85747
- text: "60分",Value:8,
85748
- click: function () { chart.ChangePeriod(8); }
85749
- },
85750
- {
85751
- text: "2小时",Value:11,
85752
- click: function () { chart.ChangePeriod(11); }
85753
- },
85754
- {
85755
- text: "4小时",Value:12,
85756
- click: function () { chart.ChangePeriod(12); }
85757
- },
85758
- {
85759
- text: "分笔",Value:10,
85760
- click: function () { chart.ChangePeriod(10); }
85761
- },
85762
- {
85763
- text: "自定义周期:3分钟",Value:20003,
85764
- click: function () { chart.ChangePeriod(20003); }
85765
- },
85766
- {
85767
- text: "自定义周期:35分钟",Value:20035,
85768
- click: function () { chart.ChangePeriod(20035); }
85769
- },
85770
- {
85771
- text: "自定义周期:8日",Value:40008,
85772
- click: function () { chart.ChangePeriod(40008); }
85773
- }
85774
- ];
85775
-
85776
- for(var i in data)
85777
- {
85778
- var item=data[i];
85779
- if (item.Value==chart.Period)
85780
- {
85781
- item.selected=true;
85782
- break;
85783
- }
85784
- }
85785
-
85786
- return data;
85787
- }
85788
-
85789
- this.GetRight=function(chart)
85790
- {
85791
- var data=
85792
- [
85793
- {
85794
- text: "不复权",
85795
- click: function () { chart.ChangeRight(0); }
85796
- },
85797
- {
85798
- text: "前复权",
85799
- click: function () { chart.ChangeRight(1); }
85800
- },
85801
- {
85802
- text: "后复权",
85803
- click: function () { chart.ChangeRight(2); }
85804
- }
85805
- ];
85806
-
85807
- if (chart.Right>=0 && chart.Right<data.length) data[chart.Right].selected=true;
85808
-
85809
- return data;
85810
- }
85811
-
85812
- //指标
85813
- this.GetIndex=function (chart)
85814
- {
85815
- return [{
85816
- text: "均线",
85817
- click: function (windowIndex) {
85818
- chart.ChangeIndex(windowIndex, '均线')
85819
- }
85820
- }, {
85821
- text: "BOLL",
85822
- click: function (windowIndex) {
85823
- chart.ChangeIndex(windowIndex, 'BOLL')
85824
- },
85825
- isBorder:true
85826
- }, {
85827
- text: "MACD",
85828
- click: function (windowIndex) {
85829
- chart.ChangeIndex(windowIndex, 'MACD')
85830
- }
85831
- }, {
85832
- text: "KDJ",
85833
- click: function (windowIndex) {
85834
- chart.ChangeIndex(windowIndex, 'KDJ')
85835
- }
85836
- }, {
85837
- text: "VOL",
85838
- click: function (windowIndex) {
85839
- chart.ChangeIndex(windowIndex, 'VOL')
85840
- }
85841
- }, {
85842
- text: "RSI",
85843
- click: function (windowIndex) {
85844
- chart.ChangeIndex(windowIndex, 'RSI')
85845
- }
85846
- }, {
85847
- text: "BRAR",
85848
- click: function (windowIndex) {
85849
- chart.ChangeIndex(windowIndex, 'BRAR')
85850
- }
85851
- }, {
85852
- text: "WR",
85853
- click: function (windowIndex) {
85854
- chart.ChangeIndex(windowIndex, 'WR')
85855
- }
85856
- }, {
85857
- text: "BIAS",
85858
- click: function (windowIndex) {
85859
- chart.ChangeIndex(windowIndex, 'BIAS')
85860
- }
85861
- }, {
85862
- text: "OBV",
85863
- click: function (windowIndex) {
85864
- chart.ChangeIndex(windowIndex, 'OBV')
85865
- }
85866
- }, {
85867
- text: "DMI",
85868
- click: function (windowIndex) {
85869
- chart.ChangeIndex(windowIndex, 'DMI')
85870
- }
85871
- }, {
85872
- text: "CR",
85873
- click: function (windowIndex) {
85874
- chart.ChangeIndex(windowIndex, 'CR')
85875
- }
85876
- }, {
85877
- text: "PSY",
85878
- click: function (windowIndex) {
85879
- chart.ChangeIndex(windowIndex, 'PSY')
85880
- }
85881
- }, {
85882
- text: "CCI",
85883
- click: function (windowIndex) {
85884
- chart.ChangeIndex(windowIndex, 'CCI')
85885
- }
85886
- }, {
85887
- text: "DMA",
85888
- click: function (windowIndex) {
85889
- chart.ChangeIndex(windowIndex, 'DMA')
85890
- }
85891
- }, {
85892
- text: "TRIX",
85893
- click: function (windowIndex) {
85894
- chart.ChangeIndex(windowIndex, 'TRIX')
85895
- }
85896
- }, {
85897
- text: "VR",
85898
- click: function (windowIndex) {
85899
- chart.ChangeIndex(windowIndex, 'VR')
85900
- }
85901
- }, {
85902
- text: "EMV",
85903
- click: function (windowIndex) {
85904
- chart.ChangeIndex(windowIndex, 'EMV')
85905
- }
85906
- }, {
85907
- text: "ROC",
85908
- click: function (windowIndex) {
85909
- chart.ChangeIndex(windowIndex, 'ROC')
85910
- }
85911
- }, {
85912
- text: "MIM",
85913
- click: function (windowIndex) {
85914
- chart.ChangeIndex(windowIndex, 'MIM')
85915
- }
85916
- }, {
85917
- text: "FSL",
85918
- click: function (windowIndex) {
85919
- chart.ChangeIndex(windowIndex, 'FSL')
85920
- }
85921
- } ]
85922
- }
85923
-
85924
- //五彩K线
85925
- this.GetColorIndex=function (chart)
85926
- {
85927
- var data=
85928
- [
85929
- {
85930
- text: "十字星",
85931
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-十字星') }
85932
- },
85933
- {
85934
- text: "早晨之星",
85935
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-早晨之星') },
85936
- },
85937
- {
85938
- text: "垂死十字",
85939
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-垂死十字') },
85940
- },
85941
- {
85942
- text: "三只乌鸦",
85943
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-三只乌鸦') }
85944
- },
85945
- {
85946
- text: "光脚阴线",
85947
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-光脚阴线') }
85948
- },
85949
- {
85950
- text: "黄昏之星",
85951
- click: function (windowIndex) { chart.ChangeInstructionIndex('五彩K线-黄昏之星') }
85952
- }
85953
- ];
85954
-
85955
- if (chart.ColorIndex)
85956
- {
85957
- data[data.length-1].isBorder=true;
85958
- data.push(
85959
- {
85960
- text: "删除五彩K线",
85961
- click: function (windowIndex) { chart.CancelInstructionIndex() }
85962
- });
85963
- }
85964
-
85965
- return data;
85966
- }
85967
-
85968
- //专家系统
85969
- this.GetTradeIndex=function(chart)
85970
- {
85971
- var data=
85972
- [
85973
- {
85974
- text: "BIAS",
85975
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-BIAS') }
85976
- },
85977
- {
85978
- text: "CCI",
85979
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-CCI') }
85980
- },
85981
- {
85982
- text: "DMI",
85983
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-DMI') }
85984
- },
85985
- {
85986
- text: "KD",
85987
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-KD') }
85988
- },
85989
- {
85990
- text: "BOLL",
85991
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-BOLL') }
85992
- },
85993
- {
85994
- text: "KDJ",
85995
- click: function (windowIndex) { chart.ChangeInstructionIndex('交易系统-KDJ') }
85996
- }
85997
- ];
85998
-
85999
- if (chart.TradeIndex)
86000
- {
86001
- data[data.length-1].isBorder=true;
86002
- data.push(
86003
- {
86004
- text: "删除专家系统",
86005
- click: function (windowIndex) { chart.CancelInstructionIndex()}
86006
- });
86007
- }
86008
- return data;
86009
- }
86010
-
86011
- //叠加
86012
- this.GetOverlay=function (chart)
86013
- {
86014
- var data=
86015
- [
86016
- {
86017
- text: "上证指数",
86018
- click: function () { chart.OverlaySymbol('000001.sh'); }
86019
- },
86020
- {
86021
- text: "深证成指",
86022
- click: function () { chart.OverlaySymbol('399001.sz'); }
86023
- },
86024
- {
86025
- text: "中小板指",
86026
- click: function () { chart.OverlaySymbol('399005.sz'); }
86027
- },
86028
- {
86029
- text: "创业板指",
86030
- click: function () { chart.OverlaySymbol('399006.sz'); }
86031
- },
86032
- {
86033
- text: "沪深300",
86034
- click: function () { chart.OverlaySymbol('000300.sh'); },
86035
- }
86036
- ];
86037
-
86038
- for(var i in chart.OverlayChartPaint)
86039
- {
86040
- var item=chart.OverlayChartPaint[i];
86041
- var symbol=item.Symbol;
86042
- const mapSymbol=new Map([['000001.sh',0],['399001.sz',1],['399005.sz',2],['399006.sz',3],['000300.sh',4]]);
86043
- if (mapSymbol.has(symbol))
86044
- {
86045
- var menuItem=data[mapSymbol.get(symbol)];
86046
- let delSymbol=symbol;
86047
- menuItem.selected=true;
86048
- menuItem.click=function () { chart.DeleteOverlaySymbol(delSymbol); };
86049
- }
86050
- }
86051
-
86052
- if (chart.OverlayChartPaint && chart.OverlayChartPaint.length>0)
86053
- {
86054
- data[data.length-1].isBorder=true;
86055
- data.push(
86056
- {
86057
- text: "取消叠加",
86058
- click: function () { chart.ClearOverlaySymbol();}
86059
- }
86060
- );
86061
- }
86062
-
86063
- return data;
86064
- }
86065
-
86066
- //K线类型设置
86067
- this.GetKLineType=function(chart)
86068
- {
86069
- var data=
86070
- [
86071
- {
86072
- text: "K线(空心阳线)",
86073
- click: function () { chart.ChangeKLineDrawType(3);}
86074
- },
86075
- {
86076
- text: "K线(实心阳线)",
86077
- click: function () { chart.ChangeKLineDrawType(0); }
86078
- },
86079
- {
86080
- text: "美国线",
86081
- click: function () { chart.ChangeKLineDrawType(2, true ,{ IsThinAKBar:false }); }
86082
- },
86083
- {
86084
- text: "收盘线",
86085
- click: function () { chart.ChangeKLineDrawType(1); }
86086
- },
86087
- {
86088
- text: "收盘面积",
86089
- click: function () { chart.ChangeKLineDrawType(4); }
86090
- },
86091
- {
86092
- text: "K线(空心阳线阴线)",
86093
- click: function () { chart.ChangeKLineDrawType(6);}
86094
- },
86095
- {
86096
- text: "Heikin Ashi",
86097
- click: function () { chart.ChangeKLineDrawType(11);}
86098
- },
86099
- {
86100
- text: "Line Break",
86101
- click: function () { chart.ChangeKLineDrawType(12);}
86102
- },
86103
- {
86104
- text: "High-low",
86105
- click: function () { chart.ChangeKLineDrawType(13);}
86106
- },
86107
- {
86108
- text: "HLC Area",
86109
- click: function () { chart.ChangeKLineDrawType(15);}
86110
- }
86111
- ];
86112
-
86113
- switch(chart.KLineDrawType)
86114
- {
86115
- case 0:
86116
- data[1].selected=true;
86117
- break;
86118
- case 1:
86119
- data[3].selected=true;
86120
- break;
86121
- case 2:
86122
- data[2].selected=true;
86123
- break;
86124
- case 3:
86125
- data[0].selected=true;
86126
- break;
86127
- case 4:
86128
- data[4].selected=true;
86129
- break;
86130
- case 6:
86131
- data[5].selected=true;
86132
- break;
86133
- case 11:
86134
- data[6].selected=true;
86135
- break;
86136
- case 12:
86137
- data[7].selected=true;
86138
- break;
86139
- case 13:
86140
- data[8].selected=true;
86141
- break;
86142
- case 15:
86143
- data[9].selected=true;
86144
- break;
86145
- }
86146
- return data;
86147
- }
86148
-
86149
- //指标窗口个数
86150
- this.GetIndexWindowCount=function(chart)
86151
- {
86152
- var data=
86153
- [
86154
- {
86155
- text: "1个窗口",
86156
- click: function () { chart.ChangeIndexWindowCount(1); }
86157
- },
86158
- {
86159
- text: "2个窗口",
86160
- click: function () { chart.ChangeIndexWindowCount(2); }
86161
- },
86162
- {
86163
- text: "3个窗口",
86164
- click: function () { chart.ChangeIndexWindowCount(3); }
86165
- },
86166
- {
86167
- text: "4个窗口",
86168
- click: function () { chart.ChangeIndexWindowCount(4); }
86169
- },
86170
- {
86171
- text: "5个窗口",
86172
- click: function () { chart.ChangeIndexWindowCount(5); }
86173
- }
86174
- ];
86175
-
86176
- var count=chart.Frame.SubFrame.length;
86177
- if ((count-1)>=0 && (count-1)<data.length) data[count-1].selected=true; //选中
86178
-
86179
- return data;
86180
- }
86181
-
86182
- //坐标类型
86183
- this.GetCoordinateType=function(chart)
86184
- {
86185
- var data=
86186
- [
86187
- {
86188
- text: "普通坐标",
86189
- click: function () { chart.ChangeCoordinateType( {Type:0} ); }
86190
- },
86191
- {
86192
- text: "百分比坐标",
86193
- click: function () { chart.ChangeCoordinateType( {Type:1} ); }
86194
- },
86195
- {
86196
- text: "反转坐标",
86197
- click: function () { chart.ChangeCoordinateType( { IsReverse:true } ); }
86198
- },
86199
- {
86200
- text: "对数坐标",
86201
- click: function () { chart.ChangeCoordinateType( {Type:2} ); }
86202
- },
86203
- {
86204
- text: "等比坐标",
86205
- click: function () { chart.ChangeCoordinateType( {Type:3} ); }
86206
- },
86207
- {
86208
- text: "等分坐标",
86209
- click: function () { chart.ChangeCoordinateType( {Type:4} ); }
86210
- },
86211
- {
86212
- text: "黄金分割",
86213
- click: function () { chart.ChangeCoordinateType( {Type:5} ); }
86214
- }
86215
- ];
86216
-
86217
- if (chart.Frame && chart.Frame.SubFrame && chart.Frame.SubFrame.length>0)
86218
- {
86219
- if (chart.Frame.SubFrame[0].Frame.CoordinateType==1)
86220
- {
86221
- data[2].selected=true;
86222
- data[2].click=function() { chart.ChangeCoordinateType( { IsReverse:false } ); } //取消反转
86223
- }
86224
-
86225
- if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==1) data[1].selected=true; //百分比
86226
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==0) data[0].selected=true; //普通坐标
86227
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==2) data[3].selected=true; //对数
86228
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==3) data[4].selected=true; //等比坐标
86229
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==4) data[5].selected=true; //等分坐标
86230
- else if (chart.Frame.SubFrame[0].Frame.YSplitOperator.CoordinateType==5) data[6].selected=true; //黄金分割
86231
- }
86232
-
86233
- return data;
86234
- }
86235
-
86236
- //拖拽模式
86237
- this.GetDragModeType=function(chart)
86238
- {
86239
- var data=
86240
- [
86241
- {
86242
- text: "禁止拖拽",
86243
- click: function () { chart.DragMode=0; }
86244
- },
86245
- {
86246
- text: "启动拖拽",
86247
- click: function () { chart.DragMode=1; }
86248
- },
86249
- {
86250
- text: "区间选择",
86251
- click: function () { chart.DragMode=2; }
86252
- }
86253
- ];
86254
-
86255
- if (chart.DragMode>=0 && chart.DragMode<data.length) data[chart.DragMode].selected=true; //选中
86256
-
86257
- return data;
86258
- }
86259
-
86260
- //工具
86261
- this.GetTools=function(chart)
86262
- {
86263
- var data=[];
86264
- var drawTools=chart.GetExtendChartByClassName('DrawToolsButton');
86265
- if (drawTools)
86266
- {
86267
- data.push(
86268
- {
86269
- text: "关闭画图工具",
86270
- click: function ()
86271
- {
86272
- var toolsWidth=drawTools.Chart.Width;
86273
- var toolsIndex=parseInt(drawTools.Index);
86274
- for(var i=toolsIndex+1; i<chart.ExtendChartPaint.length; ++i) //在画图工具后面创建的需要减去工具的宽度
86275
- {
86276
- var item=chart.ExtendChartPaint[i];
86277
- if (item.ClassName=='StockChip')
86278
- {
86279
- item.Left-=toolsWidth;
86280
- }
86281
- }
86282
- chart.DeleteExtendChart(drawTools);
86283
- chart.Frame.ChartBorder.Right-=toolsWidth;
86284
- chart.SetSizeChange(true);
86285
- chart.Draw();
86286
- }
86287
- }
86288
- );
86289
- }
86290
- else
86291
- {
86292
- data.push(
86293
- {
86294
- text: "画图工具",
86295
- click: function () {
86296
- var option={Name:'画图工具', Top:chart.Frame.ChartBorder.Top };
86297
- var extendChart=chart.CreateExtendChart(option.Name, option); //创建扩展图形
86298
- chart.SetSizeChange(true);
86299
- chart.Draw();
86300
- }
86301
- }
86302
- );
86303
- }
86304
-
86305
- var StockChip=chart.GetExtendChartByClassName('StockChip');
86306
- if (StockChip)
86307
- {
86308
- data.push(
86309
- {
86310
- text: "关闭移动筹码",
86311
- click: function ()
86312
- {
86313
- var chipWidth=StockChip.Chart.Width;
86314
- var chipIndex=parseInt(StockChip.Index);
86315
- for(var i=chipIndex+1; i<chart.ExtendChartPaint.length; ++i) //在筹码后面创建的需要筹码的宽度
86316
- {
86317
- var item=chart.ExtendChartPaint[i];
86318
- if (item.ClassName=='DrawToolsButton')
86319
- {
86320
- item.Left-=chipWidth;
86321
- }
86322
- }
86323
- chart.DeleteExtendChart(StockChip);
86324
- chart.Frame.ChartBorder.Right-=chipWidth;
86325
- chart.SetSizeChange(true);
86326
- chart.Draw();
86327
- }
86328
-
86329
- }
86330
- );
86331
- }
86332
- else
86333
- {
86334
- data.push(
86335
- {
86336
- text: "移动筹码",
86337
- click: function () {
86338
- var option={Name:'筹码分布', ShowType:1, Width:230 };
86339
- var extendChart=chart.CreateExtendChart(option.Name, option); //创建扩展图形
86340
- chart.SetSizeChange(true);
86341
- chart.Draw();
86342
- }
86343
- }
86344
- );
86345
- }
86346
-
86347
- return data;
86348
- }
86349
-
86350
- //缺口提示
86351
- this.GetPriceGap=function(chart)
86352
- {
86353
- var klineChart=chart.ChartPaint[0];
86354
- var priceGap=klineChart.PriceGap;
86355
- var data=
86356
- [
86357
- {
86358
- text: "显示1个缺口",
86359
- click: function () { chart.ChangePriceGap({ Enable:true, Count:1 }); }
86360
- },
86361
- {
86362
- text: "显示2个缺口",
86363
- click: function () { chart.ChangePriceGap({ Enable:true, Count:2 }); }
86364
- },
86365
- {
86366
- text: "显示3个缺口",
86367
- click: function () { chart.ChangePriceGap({ Enable:true, Count:3 }); }
86368
- },
86369
- {
86370
- text: "隐藏缺口",
86371
- click: function () { chart.ChangePriceGap({ Enable:false }); }
86372
- }
86373
- ];
86374
-
86375
- if (!priceGap.Enable || priceGap.Count<=0)
86376
- {
86377
- data[data.length-1].selected=true; //选中
86378
- }
86379
- else if (priceGap.Enable && priceGap.Count>0)
86380
- {
86381
- var index=priceGap.Count-1;
86382
- if (index>data.length-2) index=data.length-2;
86383
- data[index].selected=true; //选中
86384
- }
86385
-
86386
- return data;
86387
- }
86388
-
86389
- this.GetBGSplit=function(chart)
86390
- {
86391
- var data=
86392
- [
86393
- {
86394
- text: "启用",
86395
- click: function ()
86396
- {
86397
- chart.CreateExtendChart("SessionBreaksPaint", { });
86398
- chart.Draw();
86399
- }
86400
- },
86401
- {
86402
- text: "关闭",
86403
- click: function ()
86404
- {
86405
- var finder=chart.GetExtendChartByClassName("SessionBreaksPaint");
86406
- if (finder)
86407
- {
86408
- chart.DeleteExtendChartByID(finder.Chart.ID);
86409
- chart.Draw();
86410
- }
86411
- }
86412
- },
86413
- ];
86414
-
86415
- var finder=chart.GetExtendChartByClassName("SessionBreaksPaint");
86416
- if (finder) data[0].selected=true;
86417
- else data[1].selected=true;
86418
-
86419
- return data;
86420
- }
86421
-
86422
-
86423
- this.GetKLineInfo=function(chart)
86424
- {
86425
- var setInfo=new Set();
86426
- for(var i in chart.ChartInfo)
86427
- {
86428
- var item=chart.ChartInfo[i];
86429
- setInfo.add(item.ClassName);
86430
- }
86431
-
86432
- var aryKLineInfo=["公告","业绩预告","调研","大宗交易","龙虎榜","互动易"]
86433
-
86434
- var data=[];
86435
- for(var i in aryKLineInfo)
86436
- {
86437
- var infoName=aryKLineInfo[i];
86438
- var classInfo=JSKLineInfoMap.GetClassInfo(infoName);
86439
- if (!classInfo) continue;
86440
-
86441
- var item=this.CreateKlineInfoItem(infoName, setInfo.has(classInfo.ClassName), chart);
86442
- data.push(item);
86443
- }
86444
-
86445
- if (chart.ChartInfo.length>0)
86446
- {
86447
- data[data.length-1].isBorder=true;
86448
- var item={ text:'删除所有', click:function() { chart.ClearKLineInfo()} };
86449
- data.push(item);
86450
-
86451
- }
86452
-
86453
- return data;
86454
- }
86455
-
86456
- this.CreateKlineInfoItem=function(infoName,bExist,chart)
86457
- {
86458
- var item=
86459
- {
86460
- text:infoName,
86461
- selected:bExist
86462
- }
86463
-
86464
- if (bExist) item.click=function() { chart.DeleteKLineInfo(infoName) };
86465
- else item.click=function() { chart.AddKLineInfo(infoName,true) }
86466
-
86467
- return item;
86468
- }
86469
-
86470
- this.DoModal=function(event)
86471
- {
86472
- var chart=event.data.Chart;
86473
- var rightMenu=chart.RightMenu;
86474
- var x = event.offsetX;
86475
- var y = event.offsetY;
86476
-
86477
- var dataList=[{
86478
- text: "分析周期",
86479
- children: this.GetPeriod(chart)
86480
- },
86481
- {
86482
- text: "复权处理",
86483
- children: this.GetRight(chart)
86484
- },
86485
- {
86486
- text: "指标切换",
86487
- children: this.GetIndex(chart)
86488
- },
86489
- {
86490
- text:"五彩K线",
86491
- children: this.GetColorIndex(chart)
86492
- },
86493
- {
86494
- text:'专家系统',
86495
- children: this.GetTradeIndex(chart)
86496
- },
86497
- {
86498
- text:'信息地雷',
86499
- children: this.GetKLineInfo(chart)
86500
- },
86501
- {
86502
- text:'缺口提示',
86503
- children: this.GetPriceGap(chart)
86504
- },
86505
- {
86506
- text: "叠加品种",
86507
- children: this.GetOverlay(chart)
86508
- },
86509
- {
86510
- text:'主图线型',
86511
- children: this.GetKLineType(chart)
86512
- },
86513
- {
86514
- text:"坐标类型",
86515
- children:this.GetCoordinateType(chart)
86516
- },
86517
- {
86518
- text:'指标窗口个数',
86519
- children: this.GetIndexWindowCount(chart)
86520
- },
86521
- {
86522
- text:'鼠标拖拽',
86523
- children: this.GetDragModeType(chart)
86524
- },
86525
- {
86526
- text:"工具",
86527
- children:this.GetTools(chart)
86528
- },
86529
- {
86530
- text:"背景分割",
86531
- children:this.GetBGSplit(chart)
86532
- }
86533
- ];
86534
-
86535
- var upperSymbol=chart.Symbol.toUpperCase();
86536
- if(MARKET_SUFFIX_NAME.IsSHSZIndex(chart.Symbol) || MARKET_SUFFIX_NAME.IsBIT(upperSymbol))
86537
- {
86538
- dataList.splice(1,1);
86539
- }
86540
-
86541
- var identify=event.data.FrameID;
86542
- var overlayIndex=this.GetOverlayIndex(chart,identify);
86543
- if (overlayIndex && overlayIndex.length>0)
86544
- {
86545
- var delOverlayIndexMenu={ text:'删除叠加指标', children:this.GetDeleteOverlayIndex(chart,overlayIndex) }
86546
- dataList.splice(3,0,delOverlayIndexMenu);
86547
- }
86548
-
86549
- JSConsole.Chart.Log('[KLineRightMenu::DoModal]',identify);
86550
- rightMenu.Show({
86551
- windowIndex :identify,
86552
- x:x+chart.UIElement.offsetLeft,
86553
- y:y+chart.UIElement.offsetTop,
86554
- position:chart.Frame.Position,
86555
- data:dataList
86556
- })
86557
-
86558
- $(document).click(function () {
86559
- rightMenu.Hide();
86560
- });
86561
- }
86562
-
86563
- this.GetOverlayIndex=function(chart, windowsIndex)
86564
- {
86565
- if (windowsIndex>=chart.Frame.SubFrame.length || windowsIndex<0) return [];
86566
-
86567
- var result=[];
86568
- var item=chart.Frame.SubFrame[windowsIndex];
86569
- for(var i in item.OverlayIndex)
86570
- {
86571
- var overlayItem=item.OverlayIndex[i];
86572
- result.push({Name:overlayItem.Script.Name, Identify:overlayItem.Identify});
86573
- }
86574
-
86575
- return result;
86576
- }
86577
-
86578
- this.GetDeleteOverlayIndex=function(chart,overlayIndex)
86579
- {
86580
- var data=[];
86581
- for(var i in overlayIndex)
86582
- {
86583
- let identify=overlayIndex[i].Identify;
86584
- data.push({text:overlayIndex[i].Name, click:function()
86585
- {
86586
- chart.DeleteOverlayWindowsIndex(identify)
86587
- }});
86588
- }
86589
-
86590
- return data;
86591
- }
86592
- }
86593
-
86594
- //K线区间选择右键菜单
86595
- function KLineSelectRightMenu(divElement)
86596
- {
86597
- this.newMethod=KLineRightMenu; //派生
86598
- this.newMethod(divElement);
86599
- delete this.newMethod;
86600
-
86601
- this.DoModal=function(event)
86602
- {
86603
- var chart=event.data.Chart;
86604
- var rightMenu=this;
86605
- var x = event.data.X;
86606
- var y = event.data.Y;
86607
-
86608
- var dataList=
86609
- [
86610
- {
86611
- text: "区间统计",
86612
- click: function ()
86613
- {
86614
- JSConsole.Chart.Log('[KLineSelectRightMenu::click] 区间统计');
86615
- rightMenu.Hide();
86616
- var dialog=new KLineSelectRectDialog(divElement);
86617
- dialog.DoModal(event);
86618
- }
86619
- },
86620
- {
86621
- text:'区间放大',
86622
- click:function()
86623
- {
86624
- JSConsole.Chart.Log('[KLineSelectRightMenu::click] 区间放大');
86625
- var chart=event.data.Chart;
86626
- chart.ShowSelectData(event.data.SelectData);
86627
- }
86628
- }
86629
- ];
86630
-
86631
- rightMenu.Show({
86632
- x:x,
86633
- y:y,
86634
- position:chart.Frame.Position,
86635
- data:dataList
86636
- });
86637
- }
86638
-
86639
- this.Show=function (obj)
86640
- {
86641
- var _self = this;
86642
- $.extend(_self.option, obj);
86643
-
86644
- //判断是否重复创建
86645
- if (!_self.ID) _self.Create();
86646
- //判断下如果DOM没了需要重新创建
86647
- var divIdName='topMenu_'+_self.ID;
86648
- var divDom=document.getElementById(divIdName);
86649
- if (!divDom) _self.Create();
86650
-
86651
- var $topMenu = $("#topMenu_"+_self.ID),
86652
- topWidth = $topMenu.outerWidth(),
86653
- topHeight = $topMenu.outerHeight();
86654
-
86655
- $topMenu.contextmenu(function()
86656
- {
86657
- return false; //屏蔽系统右键菜单
86658
- });
86659
-
86660
- var x = _self.option.x,
86661
- y = _self.option.y;
86662
-
86663
- if (topWidth > _self.option.position.X + _self.option.position.W- x) //超过了右边距
86664
- x = x - topWidth;
86665
-
86666
- if (topHeight > _self.option.position.Y +_self.option.position.H - y)//超过了下边距
86667
- y = y - topHeight;
86668
-
86669
- $topMenu.hide();
86670
- $topMenu.css({ position:"absolute",left: x + "px", top: y + "px" }).show();
86671
-
86672
- $("#topMenu_" + _self.ID).find("tr").show(); //把菜单列表显示
86673
-
86674
- this.isInit = true;
86675
- }
86676
- }
86677
-
86678
- //分钟数据右键菜单
86679
- function MinuteRightMenu(divElement)
86680
- {
86681
- this.newMethod=KLineRightMenu; //派生
86682
- this.newMethod(divElement);
86683
- delete this.newMethod;
86684
-
86685
- this.DoModal=function(event)
86686
- {
86687
- var chart=event.data.Chart;
86688
- var rightMenu=chart.RightMenu;
86689
- var x = event.offsetX;
86690
- var y = event.offsetY;
86691
-
86692
- var dataList=
86693
- [
86694
- {
86695
- text: "叠加品种",
86696
- children: this.GetOverlay(chart)
86697
- },
86698
- {
86699
- text: "多日分时图",
86700
- children: this.GetDayCount(chart)
86701
- },
86702
- {
86703
- text:'指标窗口个数',
86704
- children: this.GetIndexWindowCount(chart)
86705
- },
86706
- {
86707
- text: "副图指标切换",
86708
- children: this.GetIndex(chart)
86709
- },
86710
- {
86711
- text:"区间选择",
86712
- children:this.GetSelectRect(chart)
86713
- },
86714
-
86715
- ];
86716
-
86717
- var symbol=chart.Symbol;
86718
- if (MARKET_SUFFIX_NAME.IsSHSZStockA(symbol))
86719
- {
86720
- dataList.push({text:'集合竞价',children: this.GetShowBeforeData(chart)});
86721
- }
86722
-
86723
- dataList.push({text:"工具", children:this.GetTools(chart)});
86724
-
86725
- var identify=event.data.FrameID;
86726
- var overlayIndex=this.GetOverlayIndex(chart,identify);
86727
- if (overlayIndex && overlayIndex.length>0)
86728
- {
86729
- var delOverlayIndexMenu={ text:'删除叠加指标', children:this.GetDeleteOverlayIndex(chart,overlayIndex) }
86730
- dataList.splice(3,0,delOverlayIndexMenu);
86731
- }
86732
-
86733
- var identify=event.data.FrameID;
86734
- JSConsole.Chart.Log('[MinuteRightMenu::DoModal]',identify);
86735
- rightMenu.Show({
86736
- windowIndex :identify,
86737
- x:x+chart.UIElement.offsetLeft,
86738
- y:y+chart.UIElement.offsetTop,
86739
- position:chart.Frame.Position,
86740
- data:dataList
86741
- })
86742
-
86743
- $(document).click(function () {
86744
- rightMenu.Hide();
86745
- });
86746
- }
86747
-
86748
- this.GetDayCount=function(chart)
86749
- {
86750
- var data=
86751
- [
86752
- {
86753
- text: "当日分时图",
86754
- click: function () { chart.ChangeDayCount(1); },
86755
- isBorder:true
86756
- },
86757
- {
86758
- text: "最近2日",
86759
- click: function () { chart.ChangeDayCount(2); }
86760
- },
86761
- {
86762
- text: "最近3日",
86763
- click: function () { chart.ChangeDayCount(3); }
86764
- },
86765
- {
86766
- text: "最近4日",
86767
- click: function () { chart.ChangeDayCount(4); }
86768
- },
86769
- {
86770
- text: "最近5日",
86771
- click: function () { chart.ChangeDayCount(5); }
86772
- },
86773
- {
86774
- text: "最近6日",
86775
- click: function () { chart.ChangeDayCount(6); }
86776
- }
86777
- ];
86778
-
86779
- if ((chart.DayCount-1)>=0 && (chart.DayCount-1)<data.length) data[chart.DayCount-1].selected=true;
86780
-
86781
- return data;
86782
- }
86783
-
86784
- this.GetIndex=function (chart)
86785
- {
86786
- var data=
86787
- [
86788
- {
86789
- text: "MACD",
86790
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'MACD') }
86791
- },
86792
- {
86793
- text: "DMI",
86794
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'DMI') }
86795
- },
86796
- {
86797
- text: "DMA",
86798
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'DMA') }
86799
- },
86800
- {
86801
- text: "BRAR",
86802
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'BRAR') }
86803
- },
86804
- {
86805
- text: "KDJ",
86806
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'KDJ') }
86807
- },
86808
- {
86809
- text: "RSI",
86810
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'RSI') }
86811
- },
86812
- {
86813
- text: "WR",
86814
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'WR') }
86815
- },
86816
- {
86817
- text: "CCI",
86818
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'CCI') }
86819
- },
86820
- {
86821
- text: "TRIX",
86822
- click: function (windowIndex) { chart.ChangeIndex(windowIndex, 'TRIX') }
86823
- }
86824
- ];
86825
-
86826
- return data;
86827
- }
86828
-
86829
- this.GetShowBeforeData=function(chart) //是否显示集合竞价
86830
- {
86831
- if (chart.IsShowBeforeData)
86832
- {
86833
- var data=
86834
- [
86835
- {
86836
- text: "隐藏",
86837
- click: function () { chart.ShowCallAuctionData( { Left:false, MultiDay:{ Left:false }} ); },
86838
- }
86839
- ];
86840
-
86841
- return data;
86842
- }
86843
- else
86844
- {
86845
- var data=
86846
- [
86847
- {
86848
- text: "显示",
86849
- click: function () { chart.ShowCallAuctionData({Left:true, MultiDay:{ Left:true }}); },
86850
- }
86851
- ];
86852
-
86853
- return data;
86854
- }
86855
- }
86856
-
86857
- this.GetSelectRect=function(chart) //区间选择
86858
- {
86859
- if (chart.EnableSelectRect)
86860
- {
86861
- var data=
86862
- [
86863
- {
86864
- text: "禁用区间选择",
86865
- click: function () { chart.EnableSelectRect=false; },
86866
- }
86867
- ];
86868
-
86869
- return data;
86870
- }
86871
- else
86872
- {
86873
- var data=
86874
- [
86875
- {
86876
- text: "启动区间选择",
86877
- click: function () { chart.EnableSelectRect=true },
86878
- }
86879
- ];
86880
-
86881
- return data;
86882
- }
86883
- }
86884
-
86885
- //指标窗口个数
86886
- this.GetIndexWindowCount=function(chart)
86887
- {
86888
- var data=
86889
- [
86890
- {
86891
- text: "1个窗口",
86892
- click: function () { chart.ChangeIndexWindowCount(2); }
86893
- },
86894
- {
86895
- text: "2个窗口",
86896
- click: function () { chart.ChangeIndexWindowCount(3); }
86897
- },
86898
- {
86899
- text: "3个窗口",
86900
- click: function () { chart.ChangeIndexWindowCount(4); }
86901
- },
86902
- {
86903
- text: "4个窗口",
86904
- click: function () { chart.ChangeIndexWindowCount(5); }
86905
- },
86906
- {
86907
- text: "5个窗口",
86908
- click: function () { chart.ChangeIndexWindowCount(6); }
86909
- }
86910
- ];
86911
-
86912
- var count=chart.Frame.SubFrame.length-1;
86913
- if ((count-1)>=0 && (count-1)<data.length) data[count-1].selected=true; //选中
86914
-
86915
- return data;
86916
- }
86917
-
86918
- //工具
86919
- this.GetTools=function(chart)
86920
- {
86921
- var data=[];
86922
- var drawTools=chart.GetExtendChartByClassName('DrawToolsButton');
86923
- if (drawTools)
86924
- {
86925
- data.push(
86926
- {
86927
- text: "关闭画图工具",
86928
- click: function ()
86929
- {
86930
- var toolsWidth=drawTools.Chart.Width;
86931
- var toolsIndex=parseInt(drawTools.Index);
86932
- chart.DeleteExtendChart(drawTools);
86933
- chart.Frame.ChartBorder.Right-=toolsWidth;
86934
- chart.SetSizeChange(true);
86935
- chart.Draw();
86936
- }
86937
- }
86938
- );
86939
- }
86940
- else
86941
- {
86942
- data.push(
86943
- {
86944
- text: "画图工具",
86945
- click: function () {
86946
- var option={Name:'画图工具', Top:chart.Frame.ChartBorder.Top };
86947
- var extendChart=chart.CreateExtendChart(option.Name, option); //创建扩展图形
86948
- chart.SetSizeChange(true);
86949
- chart.Draw();
86950
- }
86951
- }
86952
- );
86953
- }
86954
-
86955
- return data;
86956
- }
86957
- }
86958
-
86959
86242
  //画图工具 单个图形设置
86960
86243
  function ChartPictureSettingMenu(divElement)
86961
86244
  {