none
Chart カスタムラベルが印刷プレビューに表示されない RRS feed

  • 質問

  • Visual Studio 2010 C# Windows フォームアプリケーション

    Microsoft Chart コントロールでY軸にカスタムラベルを使用しているがそのカスタムラベルが印刷プレビューに表示されない

    カスタムラベルのコード

    CustomLabel chrLbl;
    chrLbl = new CustomLabel(4, 6, "5", 0, LabelMarkStyle.None);
    chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl);
    

    印刷プレビューのコード

    chart1.Printing.PrintPreview();

    印刷プレビューのコードその2

    private void pd_PrintPage(object sender, PrintPageEventArgs ev)
    {
        Rectangle recChart = new Rectangle(0, 0, 100, 50);
        chart1.Printing.PrintPaint(ev.Graphics, recChart);
    }

    どちらのプレビューでも表示されません。

    ですが、実際に印刷するとカスタムラベルは印刷されます。

    印刷プレビューにカスタムラベルが表示されるようにするにはどうしたらよろしいでしょうか。

    ご教示願います。

    2016年1月5日 5:02

回答

  • 時間が空いた返信ですいません

    ChartのHeightのサイズとラベルのフォントサイズ、CustomLabelに設定したFromPositionとToPositionの兼ね合いによって印刷プレビュー時だけCustomLabelが表示されないことがある、という現象のように見受けられます

    今回の場合ですと以下のようにFromPositionとToPositionに適切な値を設定してやることでプレビュー上でも表示されると思います

    public Form1()
            {
                InitializeComponent();
    
                const double rMag = 100;
                double rMin = -1 * rMag;
                double rMax = 1 * rMag;
                double rCenter = 0;
    
                // チャートのサイズを変更
                chart1.Width = 300;
                chart1.Height = 100;
    
                //軸ラベルの設定
                chart1.ChartAreas[0].AxisX.Title = "angle(rad)";
                chart1.ChartAreas[0].AxisY.Title = "sin";
    
                //X軸最小値、最大値、目盛間隔の設定
                chart1.ChartAreas[0].AxisX.Minimum = 0;
                chart1.ChartAreas[0].AxisX.Maximum = 360;
                chart1.ChartAreas[0].AxisX.Interval = 60;
    
                //Y軸最小値、最大値、目盛間隔の設定
                chart1.ChartAreas[0].AxisY.Minimum = rMin;
                chart1.ChartAreas[0].AxisY.Maximum = rMax;
                chart1.ChartAreas[0].AxisY.Interval = 0.2 * rMag;
                double interval = chart1.ChartAreas[0].AxisY.Interval;
    
                // カスタムラベルの作成
                CustomLabel chrLbl1 = new CustomLabel(rCenter - interval, rCenter + interval, "0", 0, LabelMarkStyle.None);
                CustomLabel chrLbl2 = new CustomLabel(rMin - interval, rMin + interval, "-1", 0, LabelMarkStyle.None);
                CustomLabel chrLbl3 = new CustomLabel(rMax - interval, rMax + interval, "1", 0, LabelMarkStyle.None);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl1);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl2);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl3);
    
                //Seriesの作成
                Series test = new Series();
    
                //グラフのタイプを指定
                test.ChartType = SeriesChartType.Line;
    
                //グラフのデータを追加
                for (int i = 0; i < 360; i++)
                {
                    test.Points.AddXY(i, Math.Sin(i * Math.PI / 180.0) * rMag);
                }
    
                chart1.Series.Add(test);
            }





    • 編集済み せれ 2016年1月12日 4:40
    • 回答としてマーク 悩めるネコ 2016年1月22日 5:53
    2016年1月12日 3:59

すべての返信

  • VS2010 C#で試した所、こちらでは印刷プレビューにカスタムラベルが表示されました。
    記述したコードは以下になります。
    デザイナにはChart chart1、Button button1を配置しています。

    そちらの環境では、以下のコードで印刷プレビューにカスタムラベルが表示されますか。
    表示されるのであれば、動作確認可能な最小コードを投稿してもらえると
    より詳しいアドバイスが得られる可能性があります。

    public Form1()
            {
                InitializeComponent();
    
                //軸ラベルの設定
                chart1.ChartAreas[0].AxisX.Title = "angle(rad)";
                chart1.ChartAreas[0].AxisY.Title = "sin";
    
                //X軸最小値、最大値、目盛間隔の設定
                chart1.ChartAreas[0].AxisX.Minimum = 0;
                chart1.ChartAreas[0].AxisX.Maximum = 360;
                chart1.ChartAreas[0].AxisX.Interval = 60;
    
                //Y軸最小値、最大値、目盛間隔の設定
                chart1.ChartAreas[0].AxisY.Minimum = -1;
                chart1.ChartAreas[0].AxisY.Maximum = 1;
                chart1.ChartAreas[0].AxisY.Interval = 0.2;
    
                // カスタムラベルの作成
                CustomLabel chrLbl1 = new CustomLabel(-1, 1, "0", 0, LabelMarkStyle.None);
                CustomLabel chrLbl2 = new CustomLabel(-1.5, -0.5, "-1", 0, LabelMarkStyle.None);
                CustomLabel chrLbl3 = new CustomLabel(0.5, 1.5, "1", 0, LabelMarkStyle.None);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl1);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl2);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl3);
    
                //Seriesの作成
                Series test = new Series();
    
                //グラフのタイプを指定
                test.ChartType = SeriesChartType.Line;
    
                //グラフのデータを追加
                for (int i = 0; i < 360; i++)
                {
                    test.Points.AddXY(i, Math.Sin(i * Math.PI / 180.0));
                }
    
                chart1.Series.Add(test);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                chart1.Printing.PrintPreview();
            }




    • 編集済み せれ 2016年1月5日 8:26
    2016年1月5日 8:18
  • せれ様
    返信誠に有難う御座います。
    ご教示頂きましたサンプルでは確かに表示されました。
    説明足らずで申し訳御座いません。
    当初Y軸のラベルは、chart1.ChartAreas[0].AxisY.LabelStyle.Interval
    を使用していたのですが、Y軸の有効数字が小数点第2位までで、
    Y軸のMin/Maxの値によっては思うようにラベルが表示されなかったもので、
    Y軸の実際の値に100を掛けてカスタムラベルを表示しております。
    ご教示頂きましたサンプルより気づいたのですが、 chart1 のWidth/Heightの
    割合によっては印刷プレビューには表示されないようです。
    ご教示頂きましたサンプルを少し加工してみた所再現いたしましたので、
    コードを貼らせて頂きます。Width:300/Height:100で再現いたしました。
            public Form1()
            {
                InitializeComponent();
    
                const double rMag = 100;
                double rMin = -1 * rMag;
                double rMax = 1 * rMag;
                double rCenter = 0;
    
                // チャートのサイズを変更
                chart1.Width = 300;
                chart1.Height = 100;
    
                //軸ラベルの設定
                chart1.ChartAreas[0].AxisX.Title = "angle(rad)";
                chart1.ChartAreas[0].AxisY.Title = "sin";
    
                //X軸最小値、最大値、目盛間隔の設定
                chart1.ChartAreas[0].AxisX.Minimum = 0;
                chart1.ChartAreas[0].AxisX.Maximum = 360;
                chart1.ChartAreas[0].AxisX.Interval = 60;
    
                //Y軸最小値、最大値、目盛間隔の設定
                chart1.ChartAreas[0].AxisY.Minimum = rMin;
                chart1.ChartAreas[0].AxisY.Maximum = rMax;
                chart1.ChartAreas[0].AxisY.Interval = 0.2 * rMag;
    
                // カスタムラベルの作成
                CustomLabel chrLbl1 = new CustomLabel(rCenter - 1, rCenter+1, "0", 0, LabelMarkStyle.None);
                CustomLabel chrLbl2 = new CustomLabel(rMin-1, rMin+1, "-1", 0, LabelMarkStyle.None);
                CustomLabel chrLbl3 = new CustomLabel(rMax - 1, rMax+1, "1", 0, LabelMarkStyle.None);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl1);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl2);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl3);
    
                //Seriesの作成
                Series test = new Series();
    
                //グラフのタイプを指定
                test.ChartType = SeriesChartType.Line;
    
                //グラフのデータを追加
                for (int i = 0; i < 360; i++)
                {
                    test.Points.AddXY(i, Math.Sin(i * Math.PI / 180.0) * rMag);
                }
    
                chart1.Series.Add(test);
            }

    2016年1月5日 11:00
  • 時間が空いた返信ですいません

    ChartのHeightのサイズとラベルのフォントサイズ、CustomLabelに設定したFromPositionとToPositionの兼ね合いによって印刷プレビュー時だけCustomLabelが表示されないことがある、という現象のように見受けられます

    今回の場合ですと以下のようにFromPositionとToPositionに適切な値を設定してやることでプレビュー上でも表示されると思います

    public Form1()
            {
                InitializeComponent();
    
                const double rMag = 100;
                double rMin = -1 * rMag;
                double rMax = 1 * rMag;
                double rCenter = 0;
    
                // チャートのサイズを変更
                chart1.Width = 300;
                chart1.Height = 100;
    
                //軸ラベルの設定
                chart1.ChartAreas[0].AxisX.Title = "angle(rad)";
                chart1.ChartAreas[0].AxisY.Title = "sin";
    
                //X軸最小値、最大値、目盛間隔の設定
                chart1.ChartAreas[0].AxisX.Minimum = 0;
                chart1.ChartAreas[0].AxisX.Maximum = 360;
                chart1.ChartAreas[0].AxisX.Interval = 60;
    
                //Y軸最小値、最大値、目盛間隔の設定
                chart1.ChartAreas[0].AxisY.Minimum = rMin;
                chart1.ChartAreas[0].AxisY.Maximum = rMax;
                chart1.ChartAreas[0].AxisY.Interval = 0.2 * rMag;
                double interval = chart1.ChartAreas[0].AxisY.Interval;
    
                // カスタムラベルの作成
                CustomLabel chrLbl1 = new CustomLabel(rCenter - interval, rCenter + interval, "0", 0, LabelMarkStyle.None);
                CustomLabel chrLbl2 = new CustomLabel(rMin - interval, rMin + interval, "-1", 0, LabelMarkStyle.None);
                CustomLabel chrLbl3 = new CustomLabel(rMax - interval, rMax + interval, "1", 0, LabelMarkStyle.None);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl1);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl2);
                chart1.ChartAreas[0].AxisY.CustomLabels.Add(chrLbl3);
    
                //Seriesの作成
                Series test = new Series();
    
                //グラフのタイプを指定
                test.ChartType = SeriesChartType.Line;
    
                //グラフのデータを追加
                for (int i = 0; i < 360; i++)
                {
                    test.Points.AddXY(i, Math.Sin(i * Math.PI / 180.0) * rMag);
                }
    
                chart1.Series.Add(test);
            }





    • 編集済み せれ 2016年1月12日 4:40
    • 回答としてマーク 悩めるネコ 2016年1月22日 5:53
    2016年1月12日 3:59
  • 返信が遅くなりまして申し訳御座いません。ご教示頂いた内容でうまくいきました。大変有難う御座いました。
    2016年1月22日 5:52