본문 바로가기

프로젝트/LCD1602용 사용자문자 디자인 프로그램

LCD1602 User character design Program 소스코드 2

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