btFont클릭시 호출
전체 소스
using System;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms; /// 연구중 ///
namespace Lcd1602BitmapDesign
{
public partial class Form1 : Form
{
bool No_Edit = true; // 변경내용이 있다.
byte[] chFont = { 0, 0, 0, 0, 0, 0, 0, 0 }; // 폰트저장 8byte
Button[,] btFont = new Button[5, 8]; // 버튼 , 텍스트를 배열로
TextBox[] txtHex = new TextBox[8]; // 관리하기 위하여( 반복문등에 유용)
// Form 관련
public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e)
{
for (int y = 0; y < 8; y++)
for (int x = 0; x < 5; x++)
{
btFont[x, y] = new Button(); //버튼생성
btFont[x,y].Name=x.ToString()+y.ToString(); //버튼이름은 xy좌표로
tLayoutFont.Controls.Add(btFont[x, y], x, y); // 레이아웃에 좌표대로 넣기
btFont[x, y].Dock = DockStyle.Fill;
btFont[x, y].MouseClick += new MouseEventHandler(Font_Button_Click);
} // 모든 버튼은 하나의 이벤트 함수로 처리
for (int i = 0; i < 8; i++)
{
txtHex[i] = new TextBox(); // 각 행마다 16진수 출력용 텍스터박스 생성
tLayoutFont.Controls.Add(txtHex[i], 6, i);
txtHex[i].TextAlign = HorizontalAlignment.Center;
txtHex[i].Font = new Font("돋음체", 16, FontStyle.Regular);
txtHex[i].Dock = DockStyle.Fill;
} // 텍스트 배열 초기화
Clear();
ControlEnabled(); // No_Edit 에 따라 각버튼 메뉴 Enabled속성 설정
} //func
// Button 관련
privatevoid Font_Button_Click(object sender, EventArgs e)
Control eventBt = this.ActiveControl; // Cliked 버튼 객체 구하기
if (eventBt.BackColor == System.Drawing.SystemColors.Control) // 버튼색을 토글시킴 eventBt.BackColor = System.Drawing.SystemColors.Highlight; // Clicked
else eventBt.BackColor = System.Drawing.SystemColors.Control; // UnClicked
// 버튼이름에서 x,y좌표값을 가져옴 : 예) 버튼이름 34 면 x=3 y=4
int x = int.Parse(eventBt.Name.Substring(0, 1));
int y = int.Parse(eventBt.Name.Substring(1, 1));
if ((chFont[y] & 0b10000 >> x) == 0) chFont[y] += (byte)(0b10000 >> x);
// 특정비트를 +-토글시킴 설명은 여기클릭
else chFont[y] -= (byte)(0b10000 >> x);
txtHex[y].Text = chFont[y].ToString("X2"); // 16진수를 행 텍스트박스에 표시
No_Edit=false; // 변경 내용이 있음으로 세팅
ControlEnabled();
}//func
private void btClear_Click(object sender, EventArgs e)
{
if (!No_Edit) // 변경내용이 있다면 저장유무 묻기
{
FormYesNo frm = new FormYesNo();
DialogResult result = frm.ShowDialog();
if (result == DialogResult.Cancel) return;
if (result == DialogResult.Yes) btSave_Click(null, null);
}
Clear();
} //func
private void btLoad_Click(object sender, EventArgs e)
{
if (!No_Edit) // 변경내용이 있다면 저장유무 묻기
{
FormYesNo frm = new FormYesNo();
DialogResult result = frm.ShowDialog();
if (result == DialogResult.Cancel) return;
if (result == DialogResult.Yes) btSave_Click(null, null);
}
string filePath ;
openFileDialog.InitialDirectory = Application.StartupPath; //프로그램 실행 파일 위치
openFileDialog.FileName = "*.txt";
openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
Clear();
filePath = openFileDialog.FileName;
StreamReader sr = new StreamReader(filePath, Encoding.UTF8, true);
for (int y = 0; y < 8; y++) // 화면에 나타나기
{
txtHex[y].Text = sr.ReadLine(); // 문자열을 16진수 Byte로 형변환
chFont[y] = byte.Parse(txtHex[y].Text, System.Globalization.NumberStyles.HexNumber);
for (int x = 0; x < 5; x++) // 비트별로 버튼 색 변경
if ( ( chFont[y] & (0b10000 >> x) ) != 0 ) btFont[x, y].BackColor
= System.Drawing.SystemColors.Highlight;
}
}
No_Edit = true;
ControlEnabled();
}//func
private void btSave_Click(object sender, EventArgs e)
{
string filePath;
saveFileDialog.InitialDirectory = Application.StartupPath; //프로그램 실행 파일 위치
saveFileDialog.FileName = "*.txt";
saveFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = saveFileDialog.FileName;
StreamWriter sw = new StreamWriter(filePath);
foreach (byte f in chFont)
sw.WriteLine("{0:X2}", f);
sw.Close();
}
}//func
// Menu관련
private void menuExit_Click(object sender, EventArgs e)
{
if (!No_Edit) //변경내용이 있다면 저장유무 물어보기
{
FormYesNo frm = new FormYesNo();
DialogResult result = frm.ShowDialog();
if (result == DialogResult.Cancel) return;
if (result == DialogResult.Yes) btSave_Click(null, null);
}
Application.Exit();
}//func
private void menuAbout_Click(object sender, EventArgs e)
{
FormAbout frm = new FormAbout();
frm.ShowDialog(this);
}//func
private void menuMakeDataFile_Click(object sender, EventArgs e)
{
string filePath = string.Empty;
saveFileDialog.InitialDirectory = Application.StartupPath; //프로그램 실행 파일 위치
saveFileDialog.FileName = "*.h";
saveFileDialog.Filter = "header files (*.h)|*.h|All files (*.*)|*.*";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = saveFileDialog.FileName;
StreamWriter sw = new StreamWriter(filePath);
sw.Write("byte Ch_Name[8] = { ");
for (int i = 0; i < 7; i++)
sw.Write("0x{0:X2}, ", chFont[i]);
sw.Write($"0x{chFont[7]:X2}");
sw.Write(" };");
sw.Close();
}
}//func
private void menuMakeInoFile_Click(object sender, EventArgs e)
{
string filePath = string.Empty;
saveFileDialog.InitialDirectory = Application.StartupPath; //프로그램 실행 파일 위치
saveFileDialog.FileName = "*.ino";
saveFileDialog.Filter = "Arduino files (*.ino)|*.h|All files (*.*)|*.*";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = saveFileDialog.FileName;
StreamWriter sw = new StreamWriter(filePath);
sw.WriteLine("#include ");
sw.WriteLine("#include ");
sw.WriteLine();
sw.Write("byte Ch_Name[8] = { ");
for (int i = 0; i < 7; i++)
sw.Write("0x{0:X2}, ", chFont[i]);
sw.Write($"0x{chFont[7]:X2}");
sw.WriteLine(" };");
sw.WriteLine();
sw.WriteLine("LiquidCrystal_I2C lcd(0x27, 20, 4);");
sw.WriteLine("");
sw.WriteLine("void setup()");
sw.WriteLine("{");
sw.WriteLine(" lcd.init();");
sw.WriteLine(" lcd.backlight();");
sw.WriteLine("");
sw.WriteLine(" lcd.createChar(0, Ch_Name); // 0~7에 배당");
sw.WriteLine("");
sw.WriteLine(" lcd.clear();");
sw.WriteLine(" lcd.write(0); // 화면에 출력");
sw.WriteLine("}");
sw.WriteLine("");
sw.WriteLine("void loop()");
sw.WriteLine("{");
sw.WriteLine("");
sw.WriteLine("}");
sw.WriteLine("");
sw.Close();
}
}//func
// ETC.
private void Clear()
{
for (int i = 0; i < 8; i++)
{
chFont[i] = 0;
txtHex[i].Text = "00";
}
for (int y = 0; y < 8; y++)
for (int x = 0; x < 5; x++) btFont[x, y].BackColor = System.Drawing.SystemColors.Control;
No_Edit = true;
ControlEnabled();
}//func
private void ControlEnabled() // 버튼 , 메뉴 Enabled 설정
{
btSave.Enabled = !No_Edit;
btClear.Enabled = !No_Edit;
menuSave.Enabled = !No_Edit;
topMenuMake.Enabled = !No_Edit;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{ // 폼의 X버튼 눌러 종료 시도시 실행되는 이벤트 함수
if (!No_Edit)
{
FormYesNo frm = new FormYesNo();
DialogResult result = frm.ShowDialog();
if (result == DialogResult.Cancel) e.Cancel=true; //종료취소하고 여기서 바로 return
if (result == DialogResult.Yes) btSave_Click(null, null);
}
}
} //end class Form1
} // end namespace Lcd1602ChEdit
'프로젝트 > LCD1602용 사용자문자 디자인 프로그램' 카테고리의 다른 글
LCD1602 User character design Program 소스코드 (0) | 2022.07.25 |
---|---|
LCD1602 User character design Program ver 1.0 (0) | 2022.07.25 |