본문 바로가기

프로젝트/아두이노 한글 폰트 Code 자동생성 프로그램

한글 폰트 메이커(2)

소스코드분석 ver 1.00


폰트 Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HangulFontFileMaker
{
    internal class HangulFont
    {
        public static string[,] hangulFont ={        // {  한글 EU-KC코드 , 폰트 }
        { "AC00", "000000083F08008800880088008E00880108010802080C087008000800080000" },
        { "AC01", "00003F0800880088008E010806087808000800001FF000080008000800080000" },
        { "AC02", "00003F0800880088010E020804081808600800003CF002080208020802080000" },


       { "D7A0", "00001F0800087FC800081F08208820881F0800001FF000081FF8000800080000" },
        { "D7A1", "00001F0800087FC800081F08208820881F0800000FF810001FF810000FF80000" },
        { "D7A2", "00001F0800087FC800081F08208820881F0800001FF80420042004201FF80000" },
        { "D7A3", "00001F0800087FC800081F08208820881F08000807E000003FFC081007E00000" },
       };                // 폰트 한문자( 1,A,F.등).는  4bit를 나타냄   그래서 총 64자 32byte임
    }


 

메인폼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;  /// 연구중 ///

namespace HangulFontFileMaker
{
    public partial class Form1 : Form
    {
        Label[,] la = new Label[16, 16];      // 폰트 만들기에서 만든 폰트를 모양으로 보여줄

                                                                 각 비트(포인터)별 라벨 1개 16X16         
        // Form관련
        public Form1() {  InitializeComponent(); }//func
        private void Form1_Load(object sender, EventArgs e)
        {
            DirectoryInfo di = new DirectoryInfo(Directory.GetCurrentDirectory() + "/font"); 

            // 출력 할 폰트파일  디렉토리 만들기                         
            if (di.Exists == false)  di.Create();// 폴더가 존재 안하면 만들기
            
            for (int x=0; x<16;x++)
                for(int y=0; y<16;y++)
                {
                    la[x,y] = new Label();           // 라벨생성
                    la[x, y].Text= "   ";                     
                    la[x, y].Margin= new Padding(0);    //공백이 없게
                    tableLayoutPanel1.Controls.Add(la[x,y],x,y);  //  레이아웃에 넣기
                    la[x, y].Dock = DockStyle.Fill;
                    la[x, y].BackColor = Color.White;                    
                }         

        }  //func font폴더 만들기
        
        //  버튼 & 메뉴 관련
        private void btMake_Click(object sender, EventArgs e)
        {
            string font;
            string code;                       

            for (int i = 0; i < HangulFont.hangulFont.Length/2 ;i++) 
            {            
                code = HangulFont.hangulFont[i, 0];  // 한글코드 읽기  EU-KC코드
                font = HangulFont.hangulFont[i, 1];    // 폰트string읽기

                if (code == laCode.Text)   //한글코드가 일치하나?
                {                  
                    StreamWriter sw = new StreamWriter("font//Font_" + txtHangul.Text + ".txt");
                    sw.WriteLine($"// '{txtHangul.Text}' BitMap Font ");
                    sw.Write("unsigned short font[16] ={ ");
                    int p=0;  // 0.5 byte(폰트의 한문자) 마다 1씩  증가 시킴    0xA3에서  A 와 3이 4bit=0.5byte임
                    // 2Byte씩 8개 출력  
                    for (int r = 0; r < 8; r++) sw.Write($"0x{font[p++]}{font[p++]}{font[p++]}{font[p++]}, ");
                    sw.WriteLine();

                    // 2Byte씩 7개 출력
                    sw.Write("                           ");
                    for (int r = 0; r < 7; r++) sw.Write($"0x{font[p++]}{font[p++]}{font[p++]}{font[p++]}, ");

                    // 마지막 1개 출력후 마무리
                    sw.Write($"0x{font[p++]}{font[p++]}{font[p++]}{font[p++]} ");
                    sw.Write("};");
                    sw.Close();
                    p = 0;       //   화면 출력을 위해 인덱스 초기화
                    for (int b = 0; b < 16; b++)                   
                        for (int a = 0; a < 4; a++)
                            showFont(font[p++], a,b);   4bit씩 함수에 전달( a,b는 bit 시작좌표)
                    break;
                }//if
            }//for

            laMsg.Text = "   폰트파일 작성완료  ";
        } //func 
        private void menuExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        } //func 
        private void menuAbout_Click(object sender, EventArgs e)
        {
            Form2 f=new Form2();
            f.ShowDialog(this);
        }//func

        // ETC......
        private void showFont(char font, int x, int y)
        {
            byte b = byte.Parse("" + font, System.Globalization.NumberStyles.HexNumber);

                                                                          // 문자를 16진수로 변환
            byte mask = 0b1000;                    //  4bit씩 데이타를 받기때문에

            for (int i = 0; i < 4; i++)    // 최상위bit부터 하위비트로 이동
            {                                      //  bit값이 1이면 라벨색은 SkyBlue 0이면 White
                la[x * 4 + i, y].BackColor = (b & mask) != 0 ? Color.SkyBlue : Color.White;
                mask >>= 1;                               
            }

        } //func
        private void txtHangul_TextChanged(object sender, EventArgs e)
        {
            laMsg.Text = "한글 한글자만 입력가능";

            if (txtHangul.Text == "")    //  입력이 없음
            {
                laCode.Text = "EU-KC";
                return;
            }

            if (txtHangul.Text[0] < 'ㄱ')  //  한글코드가 아님
            {
                txtHangul.Text = "";
                laMsg.Text = "   한글만 입력하세요. ";
                return;
            }

            if (txtHangul.TextLength > 1)  // 한글자 이상 입력
            {
                txtHangul.Text = txtHangul.Text.Substring(0, 1); // 뒤쪽은 잘라버림
                laMsg.Text = "   한글자만 입력가능  ";
                return;
            }
            laCode.Text = (Convert.ToString(txtHangul.Text[0], 16)).ToUpper();
        }//func                     //  문자코드를 16진수 문자열로  만듬     대문자로      

    }//Form1
}// namespace