①Env.csにライン種類の変数を作成
public enum Linemode { FreeLine, Horizontal, Fibonacci };
private static Linemode _linemode;
public static Linemode LineMode {
get { return _linemode; }
set { _linemode = value ; }
}
②command.csのCIDに追加
ToggleFreeline,
ToggleHorizontal,
ToggleFibonatti,
「internal class CommandExec {」にライン変更コマンドを追加
public static CommandResult ChangeLineMode( Env.Linemode mode) {
Env.LineMode = mode;
Env.Frame.Menu.MenuItems[1].MenuItems["LineMode"].MenuItems[ "FreeLine"].Checked = false ;
Env.Frame.Menu.MenuItems[1].MenuItems["LineMode"].MenuItems[ "Horizontal"].Checked = false ;
Env.Frame.Menu.MenuItems[1].MenuItems["LineMode"].MenuItems[ "Fibonatti"].Checked = false ;
switch (mode)
{
case Env .Linemode.Horizontal:
Env.Frame.SetStatusBarText("水平線の描画" , "Click Price");
Env.Frame.Menu.MenuItems[1].MenuItems["LineMode"].MenuItems[ "Horizontal"].Checked = true;
break;
case Env .Linemode.Fibonacci:
Env.Frame.SetStatusBarText("フィボナッチ リトレースメント" , "Click and Drag");
Env.Frame.Menu.MenuItems[1].MenuItems["LineMode"].MenuItems[ "Fibonatti"].Checked = true;
break;
default:
Env.Frame.SetStatusBarText("" , "");
Env.Frame.Menu.MenuItems[1].MenuItems["LineMode"].MenuItems[ "FreeLine"].Checked = true;
break;
}
RefreshChart();
return CommandResult .Succeeded;
}
さらに「public CommandResult Exec() {」に以下を追加
case CID .ToggleFreeline:
return CommandExec .ChangeLineMode(Env.Linemode.FreeLine);
case CID .ToggleHorizontal:
return CommandExec .ChangeLineMode(Env.Linemode.Horizontal);
case CID .ToggleFibonatti:
return CommandExec .ChangeLineMode(Env.Linemode.Fibonacci);
「internal class CommandCollection : ICloneable {」の「private void Init(StorageNode keys) {」に以下を追加
AddCommand( CID.ToggleFreeline, "Free Line" , keys, Keys.None);
AddCommand( CID.ToggleHorizontal, "Horizontal Line" , keys, Keys.None);
AddCommand( CID.ToggleFibonatti, "Fibonatti" , keys, Keys.None);
③ライン種類選択用のメニュー作成
MainFrame.cs
private ZMenuItem _menuLineMode;
private ZMenuItem _menuFreeLine;
private ZMenuItem _menuHorizontal;
private ZMenuItem _menuFibonatti;
さらに「InitializeComponent()」で各変数初期化を追加
this._menuLineMode = new ZMenuItem();
this._menuFreeLine = new ZMenuItem();
this._menuHorizontal = new ZMenuItem();
this._menuFibonatti = new ZMenuItem();
// _menuView のメニューにこれを追加
「this._menuView.MenuItems.AddRange(」の中に , this._menuLineMode を追加
追加した位置番号に以下を追加(以下は9[10番目]に追加した例)
this._menuLineMode.Index = 9;
this._menuLineMode.MenuItems.AddRange(new ZMenuItem[] {
this._menuFreeLine, this._menuHorizontal, this._menuFibonatti});
this._menuLineMode.Text = "Line Mode" ;
this._menuLineMode.Name = "LineMode" ;
this._menuFreeLine.Index = 0;
this._menuFreeLine.Text = "Free Line" ;
this._menuFreeLine.Name = "FreeLine" ;
this._menuFreeLine.Checked = true ;
this._menuFreeLine.Click += new System.EventHandler( this.OnMenu);
this._menuFreeLine.CID = CID .ToggleFreeline;
this._menuHorizontal.Index = 1;
this._menuHorizontal.Text = "Horizontal Line" ;
this._menuHorizontal.Name = "Horizontal" ;
this._menuHorizontal.Click += new System.EventHandler( this.OnMenu);
this._menuHorizontal.CID = CID .ToggleHorizontal;
this._menuFibonatti.Index = 2;
this._menuFibonatti.Text = "Fibonatti Retracement" ;
this._menuFibonatti.Name = "Fibonatti" ;
this._menuFibonatti.Click += new System.EventHandler( this.OnMenu);
this._menuFibonatti.CID = CID .ToggleFibonatti;
これ以降のIndexの番号(元の9以降)を変更しておく
④FreeLine.csの「internal class FreeLine {」に変数等追加
private bool _price;
public FreeLine(Point p1, Point p2, bool price) {
_pivot = p1;
_destination = p2;
_id = -1;
_price = price;
}
public bool Price {
get { return _price; }
}
public SolidFreeLine ToSolid(DataFarm farm, int firstdateindex, Trans value_to_y, bool showPrice){
SolidFreeLine fl = ToSolid(farm, firstdateindex, value_to_y);
fl.WithSpace = showPrice;
return fl;
}
「internal class SolidFreeLine {」に以下を追加
private bool _withprice = false;
public bool WithSpace {
get { return _withprice; }
set { _withprice = value ; }
}
⑤ChartDrawing.csの「internal class ChartDrawing」に以下を追加
public void FixFreeLine(FreeLine fl, bool showPrice){
Env.FreeLines.Add(_brand, Env .CurrentIndicators.Format, _pref.LogScale, fl.ToSolid(_brand.ReserveFarm(), _firstDateIndex, _priceTrans, showPrice));
_freeLines.Add(fl);
}
⑥ChartCanvas.cs
ローカル変数追加
private FreeLine _horizontalLine;
private FreeLine [] _fibonattiLine;
private int _posY;
private Point [] _pointFibo;
「protected override void OnMouseDown( MouseEventArgs e) {」の以下をコメントまたは削除
foreach (FreeLine line in _drawing.FreeLines)
{
if (line.DrawMode == FreeLine .LineDrawMode.Hilight && e.Button == MouseButtons.Left)
{
_diffX = line.Destination.X - line.Pivot.X;
_diffY = line.Destination.Y - line.Pivot.Y;
_destX = line.Destination.X;
_destY = line.Destination.Y;
_pivotX = line.Pivot.X;
_pivotY = line.Pivot.Y;
}
}
_currentFreeLine = new FreeLine (new Point(e.X, e.Y));
以下に変更
switch (Env .LineMode) {
case Env .Linemode.Horizontal:
_pointFibo = null;
_fibonattiLine = null;
_posY = e.Y;
Commands. CommandExec.ChangeLineMode(Env .Linemode.FreeLine);
_currentFreeLine = null;
break;
case Env .Linemode.Fibonacci:
_fibonattiLine = new FreeLine [5];
_pointFibo = new Point [2];
_pointFibo[0] = new Point (e.X, e.Y);
_currentFreeLine = null;
int priceWidth = 60;
_fibonattiLine[0] = new FreeLine (new Point(priceWidth, _pointFibo[0].Y), new Point(Env.Layout.ChartAreaWidth, _pointFibo[0].Y), true);
_drawing.FixFreeLine(_fibonattiLine[0], true);
break;
default:
_fibonattiLine = null;
_pointFibo = null;
_currentFreeLine = new FreeLine (new Point(e.X, e.Y));
break;
}
「protected override void OnMouseMove( MouseEventArgs ev) {」の
「//今引いている直線の再描画」の直後に以下を追加
if (_fibonattiLine != null && _pointFibo != null)
{
_pointFibo[1] = new Point (ev.X, ev.Y);
_fibonattiLine[4] = new FreeLine (_pointFibo[1]);
Invalidate(_fibonattiLine[4].GetInclusion( this.ClientRectangle), false );
_fibonattiLine[4].Destination = new Point (Env.Layout.ChartAreaWidth, _pointFibo[1].Y);
}
「private void OnMouseUp( object sender, MouseEventArgs args) {」を以下にすべて変更
private void OnMouseUp(object sender, MouseEventArgs args) {
if(args.Button==MouseButtons .Right) {
ContextMenu m = Env .Frame.CreateContextMenu();
m.Show( this, new Point(args.X, args.Y));
}
else if (args.Button==MouseButtons.Left) {
if(_currentFreeLine!=null ) {
if(_drawing.FreeLineCount==10) {
Util.Warning(Env .Frame, "線は1銘柄につき10本までしか引けません" );
Invalidate();
}
else if (Env.FreeLines.Count==1000) {
Util.Warning(Env .Frame, "線は全部で1000本までしか引けません" );
Invalidate();
}
else if (_currentFreeLine.PivotHasEnoughDistanceTo(_currentFreeLine.Destination))
{
switch (Env .LineMode)
{
case Env .Linemode.Fibonacci:
Commands. CommandExec.ChangeLineMode(Env .Linemode.FreeLine);
break;
default:
_drawing.FixFreeLine(_currentFreeLine);
break;
}
}
_currentFreeLine = null;
}
else
{
switch (Env .LineMode)
{
case Env .Linemode.Fibonacci:
if (_pointFibo != null )
{
_pointFibo[1] = new Point (args.X, args.Y);
int priceWidth = 60;
int[] y = new int[5];
y[0] = _pointFibo[0].Y;
y[4] = _pointFibo[1].Y;
y[1] = System.Convert.ToInt32(y[0] + (y[4] - y[0]) * 0.382);
y[2] = System.Convert.ToInt32(y[0] + (y[4] - y[0]) * 0.5);
y[3] = System.Convert.ToInt32(y[0] + (y[4] - y[0]) * 0.618);
for (int i = 1; i < 5; i++)
{
_fibonattiLine[i] = new FreeLine(new Point(priceWidth, y[i]), new Point (Env.Layout.ChartAreaWidth, y[i]), true);
_drawing.FixFreeLine(_fibonattiLine[i], true);
}
_pointFibo = null;
Commands. CommandExec.ChangeLineMode(Env .Linemode.FreeLine);
}
break;
}
}
if (_drawing.RemoveHighlitedFreeLines()) Invalidate(); //削除されたやつがあればInvalidate
}
}