퇴근5분전

 

크리스탈 리포트에서 필드에 고정된 폰트를 글자수에 맞춰 폰트사이즈를 줄여 꽉 차도록 만드는 소스!

 

## 크리스탈 리포트 TextBoxObject 의 꽉 채우기 : 글자수에 따라 FontSize조정하는 방법

-- 바인딩 될 데이타 중 FontSize조정 할 대상 목록을 만듬.
Dictionary<string, string> KeyValues = new Dictionary<string, string>();

 

-- 데이타 바인딩
                        KeyValues.Add("{필드오브젝트ID}", "{필드오브젝트에 바인딩 될 때의 값}" );
                        ...

 

-- 로드 이벤트!
        bool IsContentLoaded = false;
        void Form_Loaded(object sender, RoutedEventArgs e)
        {
            if (IsContentLoaded == false)
            {
                if (CrystalReportViewer1.Created)
                {
                    IsContentLoaded = true;
                    foreach (var tar in KeyValues)
                    {
                        var fieldObject = crRpt.ReportDefinition.ReportObjects[tar.Key];
                        var field = ((CrystalDecisions.CrystalReports.Engine.FieldObject)(fieldObject));
                        Font font = CalcFont(tar.Value, field.Width, field.Font);
                        field.ApplyFont(font);
                    }

                    CrystalReportViewer1.Refresh();
                }
            }
        }


-- 폰트사이즈 조정.

       private Font CalcFont(string txt, double limitTwipsWidth, Font font)
        {
            const double TwipsPerInch = 1440d;

            // todo : 박스안에 들어갈 폰트사이즈 구하기
            // Font.Size 에서 8pt까지 줄여가면서 계산.
            // 1 inch = 1440 twip
            // 1 cm   =  567 twip
            Font newFont = font;
         
            using (var g = CrystalReportViewer1.CreateGraphics())
            {
                //http://stackoverflow.com/questions/1918877/how-can-i-get-the-dpi-in-wpf
                //http://stackoverflow.com/questions/4044397/how-do-i-convert-twips-to-pixels-in-net
                int limitWidth = (int)((limitTwipsWidth / TwipsPerInch) * (g.DpiX));

                for (float size = font.Size; size >= 3f; )
                {
                    SizeF szf = g.MeasureString(txt, newFont);

                    if (szf.Width <= limitWidth)
                    {
                        break;
                    }
                    newFont = new Font(newFont.FontFamily, size, System.Drawing.FontStyle.Bold);
                    size -= 0.1f;
                }
            }

            return newFont;
        }
        

'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글

Flow 상세내용 입력하기...  (0) 2018.05.01
지연자동 조회 처리  (0) 2016.03.10
Excel 만들기, 엑셀 닫기  (0) 2016.02.17
변환] Unicode <--> 한글  (0) 2013.10.24
ppt 처럼 썸네일과 본화면이 있는 컨트롤!  (0) 2013.09.26