トップ回答者
Chart カスタムラベルが印刷プレビューに表示されない

質問
-
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); }
どちらのプレビューでも表示されません。
ですが、実際に印刷するとカスタムラベルは印刷されます。
印刷プレビューにカスタムラベルが表示されるようにするにはどうしたらよろしいでしょうか。
ご教示願います。
回答
-
時間が空いた返信ですいません
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); }
すべての返信
-
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
-
せれ様
返信誠に有難う御座います。
ご教示頂きましたサンプルでは確かに表示されました。
説明足らずで申し訳御座いません。
当初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); }
-
時間が空いた返信ですいません
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); }