none
チャートコントロールのマーカー凡例の表示サイズ調整 RRS feed

  • 質問


  •  チャートコントロールのマーカー凡例の印刷成果物のサイズが小さいので拡大したいという質問です。

     標準部品のチャート[チャートコントロール]に対して
     Systtem.Windows.Forms.DataVisualization.Charting.Chart

     Series オブジェクトを追加して凡例を設定します。

     Series seriesPoint = new Series();

            seriesPoint.ChartType = SeriesChartType.Point;
            seriesPoint.BorderWidth = 2;
            seriesPoint.LegendText = "AAAAAA";
            seriesPoint.MarkerStyle = MarkerStyle.Diamond;
            seriesPoint.MarkerSize = 16;
           seriesPoint.IsVisibleInLegend = true;

           [チャートコントロール].Series.Add(seriesPoint);

     それに対して標準のPrintout をかけた場合に

          [チャートコントロール].Printing.Print(false)

     凡例のマーカ表示が画面表示と印刷物を比較した場合、印刷物では非常に小さくなります。

     標準のマーカー種類(MarkerStyle = MarkerStyle.Diamondなど)を指定した場合、
     Series オブジェクトのマーカーサイズ(MarkerSize)に対して変更をかけた場合にはグラフ側のマーカ表示サイズには反映されますが、
     凡例のマーカ表示領域(固定?)に対して強制的にAutoSizeがかかっている感じで凡例のマーカ表示は大きくなりません。

     またマーカとして画像を指定して(MarkerImage)画像上でサイズと余白をコントロールしてある程度凡例を大きく表示する事は可能でしたが、
     その場合グラフのマーカーも連動してしまう為、グラフのマーカー表示が意図しないサイズになってしまう為現実的ではありませんでした。

     グラフ用のSeriesオブジェクトと凡例表示用のSeriesオブジェクトを別個に作るという解決策もあるかと思いますが、
     もっとシンプルな解決策はありますでしょうか。

    2018年5月16日 9:46

すべての返信

  • 回答ではなくて質問ですみません。

    > チャートコントロールのマーカー凡例の印刷成果物のサイズが小さいので拡大したいという質問です。

    質問者さんの言う「マーカー」とは ↓ これ(3 つ目のポイントの緑色のマーク)のことでしょうか?

    2018年5月17日 2:14
  • マーカー自体はそれですが、データ系列の説明用に表の外側に表示されるモノです。
    2018年5月17日 2:31
  • バグっぽいので補正してみるとか

    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                
                this.chart1.PrePaint += chart1_PrePaint_GetDisplay;
                this.chart1.Refresh();
                this.chart1.PrePaint -= chart1_PrePaint_GetDisplay;
    
                this.chart1.PrePaint += chart1_PrePaint;
                this.chart1.Printing.Print(false);
                this.chart1.PrePaint -= chart1_PrePaint;
            }
    
            float displayDPI = 96;
            float printDPI = 96;
    
            void chart1_PrePaint_GetDisplay(object sender, System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs e)
            {
                if (e.ChartElement is System.Windows.Forms.DataVisualization.Charting.Legend)
                {
                    displayDPI = e.ChartGraphics.Graphics.DpiX;
                }
            }
            void chart1_PrePaint(object sender, System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs e)
            {
                if (e.ChartElement is System.Windows.Forms.DataVisualization.Charting.LegendCell)
                {
                    System.Windows.Forms.DataVisualization.Charting.LegendCell leg = (System.Windows.Forms.DataVisualization.Charting.LegendCell)e.ChartElement;
                    printDPI = e.ChartGraphics.Graphics.DpiX;
                    if (printDPI != displayDPI)
                    {
                        leg.LegendItem.MarkerSize = (int)(leg.LegendItem.MarkerSize * printDPI / displayDPI);
                    }
                }
            }
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2018年5月17日 3:36