퇴근5분전

 

 플젝중에 난간함 상황이 생겼다.

금액과 관련된 TextBox Field에 TextBox를 넣었기에 숫자이외에 영어 한글 모두 입력이 되는 부분..

물론 개발프레임웍에 숫자관련 컨트롤이 사용자정의를 통해 만들어져 있다. 사용하지 않는 분위기...?

 

 기존 디자인에 거의 모두 Textbox가 되어 있기에 이것을 이용해서 숫자이외에 차단!!

이건 의외로 간단히 처리가 되었고...

  PreviewKeyDown을 이용해서 필터링을 거쳤다.

 

다만 문득 떠오르는게...

 

DB의 데이타 타입과 C#의 데이타 타입이 허용범위가 다르다는 것이었는데???

 

Numeric( 5, 3 ) 를 DB에 넣으면서... !!!!

 

C#에서 단순히 double로 처리해서 파라미터 넘겨주면??

 

Numeric( 18, 2 ) 에서 ... Decimal로 처리는 했는데...

 

단순 데이타 처리를 저렇게 한다고 해도... 그럼.. TextBox의 입력은???

 

음.. 그래서 생각한게 maxLength를 지정하고 scale이 있으면 소숫점 자리와 마이너스표시 자리수 까지 maxLength로 잡아주었다.

 

Numeric( 5, 3 )의 DB에 준비가 되었을때...

 

입력은 MaxLength = 7이 되었다.

 

그리고 계산해서 최대값을 보니 99.999 최소값은 -99.999 ,  MsSql에서 직접 테스트 해보니 100은 못넣더랑...

 

그래서 입력은 실제로 9999999 까지 입력을 받을 수 있다.

 

고럼... keydown할때 다음 값을? 계산해서 범위에 맞지 않으면 cancel 처리 하려고 했는데...

 

배보다 배꼽이 되겠다..

 

그래서 생각한게 그냥 저장전에 유효성체크를 범위를 포함해서 한번 더 하자... 였다.

 

 tb1.EventAttachedForNumericInputFormat((e) => { }, 5, 3); // Numeric( 5, 3 )을 범위로 입력가능 -99.999 ~ 99.999
 tb2.EventAttachedForNumericInputFormat((e) => { }, "N0", 0, 10); // 0~10 까지 범위를 가진 2자리 입력가능 0 ~ 10

 

이렇게 해당 텍스트박스에 확장메서드로 구현해두면... 숫자 포멧도 되고! 범위도 체크가 되고...

 

저장전 유효성 체크는

 

 // 0~100범위 내에 있으므로 pass

 if (TextBoxWPF_Ex.IsCheckNumberRange("99", 0m, 100m) == false) {
         MessageBox.Show("허용범위 밖입니다.");
 }

 

 //-99.999~99.999 범위 밖이므로 alert

 if (TextBoxWPF_Ex.IsCheckNumberRange("100", 5, 3) == false)
 {
        MessageBox.Show("허용범위 밖입니다.");
 }

 

 // pass

 if (TextBoxWPF_Ex.IsCheckNumberRange("99", (decimal)int.MinValue, (decimal)int.MaxValue) == false)
 {
        MessageBox.Show("허용범위 밖입니다.");
 }

 

 여기서 한가지 맹점.이...   int, int 타입으로 prev, scale을 받고, decimal , decimal로 min, max를 받아서

하나의 메서드를 오버로드 시켰더니...

 

 int.MinValue와 int.MaxValue가 사용되는 db에서의 int의 범위에 대하여 넣을땐! 위처럼 decimal로 치환을 해야된다..

 

 안그러면 prev가 int.minValue 만큼.. scale이 int.MaxValue 만큼 잡아서 OutOfMemory 메세지를 보게 된다.

 

너무 급조해서 앞으로 좀더 고쳐봐야지... 쉽게...  winform용도 하나 만들어놔야징.

 

##### 추가

 

입력 숫자 자체를 범위에서 제한 하도록 수정!!

 

                    string x = txt.Text;
                    string xx = x.Remove(txt.CaretIndex, txt.SelectionLength);
                    if (e.Key == Key.Back && txt.SelectionLength <= 0 && (txt.CaretIndex - 1 >= 0))
                    {
                        // 1 char 삭제
                        xx = x.Remove(txt.CaretIndex - 1, 1);
                    }
                    else if (e.Key == Key.Delete && (txt.CaretIndex) < txt.Text.Length)
                    {
                        // 1 char 삭제
                        xx = x.Remove(txt.CaretIndex, 1);
                    }
                    else
                        xx = xx.Insert(txt.CaretIndex, GetChar(e.Key));

                    e.Handled = !IsCheckNumberRange(xx, minValue, maxValue);

 

이렇게 하면 입력된 숫자를 포함해서 범위를 체크할수 있다.

 

key처리전에 N0 포멧일경우 소숫점(.) 에 대한 예외 처리를 해주면 깔끔해진다.

 

또 처리 할 것이 남았다. 입력범위 밖에 숫자를 입력했을 경우 어떻게 알려줄것인가???

 

툴팁? Alert? 색상?...     

 

이번 자바 작업중에 유니코드를 다루는게 있어서...

VS Express 설치해서 변환툴을 만들때 사용한 코드임!

 


## 한글 -> 유니코드
            string txt = UniCodeText.Text;
            string resultUniCode = "";
           
            foreach (char s in txt.ToCharArray())
            {
                if (char.IsLetter("" + s, 0))
                {
                    resultUniCode += "\\u";
                    byte[] bts = UnicodeEncoding.Unicode.GetBytes("" + s);
                    for (int loop = bts.Length - 1; loop >= 0; loop--)
                    {
                        resultUniCode += bts[loop].ToString("x2");
                    }
                }
                else
                {
                    resultUniCode += s;
                }
            } 
            UniCode.Text = resultUniCode;


## 유니코드 -> 한글!

            string Dir = Application.StartupPath + "\\UnicodeConvert\\";

            try
            {
                //unicode된 파일을 변환!!
                using (OpenFileDialog dlg = new OpenFileDialog())
                {
                    dlg.InitialDirectory = HomeDirectory.Text;
                    dlg.FileName = "";
                    if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK && dlg.FileName != "" &&

                        File.Exists(dlg.FileName))
                    {
                        string readFile = File.ReadAllText(dlg.FileName);

                        string writeFileContent = "";

                        char[] uniarray = readFile.ToCharArray();

                        for (int loop = 0; loop < uniarray.Length; )
                        {
                            char c = uniarray[loop];
                            char u = '\0';
                            if (loop + 1 < uniarray.Length) u = uniarray[loop + 1];
                            if (c == '\\' || u == 'u')
                            {
                                try
                                {
                                    byte unibyte00 = Convert.ToByte("" + uniarray[loop + 4] + uniarray[loop + 5], 16);
                                    byte unibyte01 = Convert.ToByte("" + uniarray[loop + 2] + uniarray[loop + 3], 16);
                                    writeFileContent += UnicodeEncoding.Unicode.GetString(new byte[] { unibyte00, unibyte01 });
                                }
                                catch
                                {
                                }
                                finally
                                {
                                    loop += "\\uaaaa".Length;
                                }
                            }
                            else
                            {
                                writeFileContent += c;
                                loop++;
                            }
                        }

                        if (!Directory.Exists(Dir))
                        {
                            Directory.CreateDirectory(Dir);
                        }

                        File.WriteAllText(Dir + Path.GetFileName(dlg.FileName), writeFileContent, UnicodeEncoding.Unicode);

                        UnicodeFilePath.Text = ( Dir + Path.GetFileName(dlg.FileName) ).Replace(HomeDirectory.Text, "")

                                                                                                                  .Replace("\\", "/");
                        if(MessageBox.Show("메모장에서 보시겠습니까?", "확인", 

                                               MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.OK )
                            System.Diagnostics.Process.Start("notepad.exe", Dir + Path.GetFileName(dlg.FileName));
                    }
                }
            }
            catch( Exception ex ){
                MessageBox.Show(ex.Message);
            }

 

이미지를 클립보드에서 복사해서 붙여넣기를 하면...

 

썸네일 화면과 큰이미지 화면으로 분리되어서 볼수 있음.

 

썸네일을 클릭시 해당 화면까지 순차적으로 이동! 

 

 

 

 

> 넘어가는것을 찍었는데 스샷이 이렇게 됨.

 

 

테마를 바꾸면 지정된 색상으로 변경하는 것을 만들어봄.

 

상용컨트롤 보면 각 색상스타일 값에 따라 화면 스타일이 바뀌는 것 처럼 구성해서 만들어봄.

 

각 컨트롤별 스타일 객체를 생성가능.

테마별 폴더 관리.

 

 

 

 

 

 

 

 

 

컨트롤의 사이즈를 애니메이션처럼 스르륵 커졌다가 작아졌다 를 적용해 주는 객체임.

 

컨트롤 두개를 배치해서 왼쪽 컨트롤을 클릭했을때 두번째 스샷처럼 줄어드는데 애니메이션처럼 작아지면서 흘러간다.

 

 

 

 

소스를 보면 슬라이드 적용할 컨트롤과 방향을 지정해서 등록한다.

 

슬라이드를 지정된 크기만큼 적용하는데 10 으로 지정했을때

 

10보다 큰 사이즈면 10만큼 줄어든다.

 

다시 클릭하면 10 에서 원래 사이즈만큼 늘어난다. 클릭할때마다 반복!

 

10보다 작은 사이즈면 10만큼 늘어났다가, 다시 클릭하면 원래사이즈로 작아짐!!

 

 

 

슬라이드 구현시...

 

 

page1을 선택시( 기준좌표 default )

 

page2을 선택시 계산을 통해 page2가 기준좌표가 될때까지 이동처리 ( 다른 페이지도 동일하게 offset ) 

 

page3선택시 page2 와 동일한 작용!

 

 

 

 

컨트롤 이동 효과 처리. 버튼 3개!!

 

 

 

적용 스샷 ] ( 제데로는 안찍혔네 ... )

버튼1 ) 대각선 좌상 -> 중심 이동으로 왔다 갔다.

버튼2 ) 제자리에서 사이즈만 변경

버튼3 ) 우상단 -> 중심으로 이동 및 사이즈 변경

 

 

 

 

도트 매트릭스를 구현해봤음.

 

 

7Segment(FND) 처럼 Cell 1개는 Led로 간주하고 코딩함.

 

  //TrunOn(1, 1);
  //WriteHex(3, 0, 0xF8);
     WriteString(2, 0, "ABC");

요렇게 사용.

 

폰트는   dic.Add("A", new int[] { 0x7C, 0x12, 0x12, 0x12, 0x7C });

 

 

 

 

최대한 실제 마이컴에 도트매트릭스를 다루는 것처럼 추상화 함.

 

 

 

 

화면에 300개의 효과를 뿌려서 스샷 찍었음.

 

 

 기존에 모니터링 프로그램 만들때 상태값에 따라 배경에 효과를 넣은적 있는데 뭔가 부족한 느낌에 효과였었고...

 

효과처리에 필요한 객체를 만들었음.

 

 

 

 

위 객체들을 이용하여 만든 프로그램 소스!!

/*

            300 개를 처음 뿌리고 클릭 할 때마다 효과를 하나씩 더 추가함!

*/

 

    public partial class Form1 : Form
    {
        List<JSFW_GraphicsEffect> EffectList = new List<JSFW_GraphicsEffect>();

        Timer tm = new Timer();
        public Form1()
        {
            InitializeComponent();
            DoubleBuffered = true;
           
            tm.Interval = 1000 / 24;
            tm.Tick += new EventHandler(tm_Tick);
            tm.Start();
            MouseClick += new MouseEventHandler(Form1_MouseClick);

            this.WindowState = FormWindowState.Maximized;
        }

        protected override void OnShown(EventArgs e)
        {
            base.OnShown(e);
            Random rd = new Random();
            for (int loop = 0; loop < 300; loop++)
            {
                EffectList.Add(new JSFW_GraphicsEffect(this, new Point(rd.Next(this.Width), rd.Next(this.Height)), (info) =>
                {
                    if (EffectList.Count % 2 == 0)
                    {
                        info.Steps = new EllipseEffectList(Point.Empty);
                    }
                    else
                    {
                        info.Steps = new RectangleEffectList(Point.Empty);
                    }
                }));
            }
        }

      
        void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            EffectList.Add(new JSFW_GraphicsEffect(this, e.Location, (info) =>
            { 
                if (EffectList.Count % 2 == 0)
                {
                    info.Steps = new EllipseEffectList(Point.Empty);
                }
                else
                {
                    info.Steps = new RectangleEffectList(Point.Empty);
                }
            }));
        }

        void tm_Tick(object sender, EventArgs e)
        {
            foreach (JSFW_GraphicsEffect item in EffectList)
            {
                item.Signal = !item.Signal;
            }
        }

        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            using (tm)
            {
                if( tm.Enabled ) tm.Stop();
            }
            base.OnFormClosing(e);
        }
    }

 

 

 

 

 

소스 변환과 관련된 글을 찾던 중  http://hilite.me/  요런걸 발견... 아래 api 가 있길래 연동시켜봤음.

 

HiliteMeApi.zip

 

 

 

 

 

 

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

Winform] DotMatrix  (0) 2013.08.27
Winform] Effect 효과 처리!  (0) 2013.08.23
IFormattable 와 ( IFormatProvider, ICustomFormatter )  (0) 2013.08.20
FlexGrid ] Cols[ 컬럼명 ].DataMap  (0) 2011.12.07
GlassForm  (1) 2011.11.15