소스코드분석 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
'프로젝트 > 아두이노 한글 폰트 Code 자동생성 프로그램' 카테고리의 다른 글
TFT LCD SD카드 한글 출력 Index 방법 (0) | 2022.08.13 |
---|---|
한글 폰트 메이커(1) (0) | 2022.07.30 |