퇴근5분전

WinApi.co.kr 에 존재하는 C언어에 테트리스를 분석해서 만들어낸 테트리스임. (버그 다수 존재 함)

프로그래밍을 하게 되면 반듯이 작성해야지 했던 게임이었는데
만들고 나니 어찌나 기쁘던지...

자료구조도 알고리즘도 프로그램 로직 자체도 서툴렀던 시절
C언어로 된 테트리스 로직을 분석하고 만들어내었을때 비약적인 발전을 할수 있었음.
GDI+라든가 배열사용이라든가, 게임시 동작을 처리 하는 부분에 대해서라든가.
이것도 역시 바둑판 그리기가 사용된다. 배경을 그리고 블럭을 그리는데 사용됨.

사용자 삽입 이미지

<< 테트리스 화면 >>

테트리스 소스임


 

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

메뉴] 즐겨찾기 읽어들이기  (0) 2009.05.08
그래픽스. 어디에 그려지는가?  (0) 2009.05.08
아날로그 시계  (0) 2009.05.02
HTML 자동 정렬 프로그램  (0) 2009.05.02
FND를 이용한 디지탈 시계  (0) 2009.05.02

사용자 삽입 이미지
<< 아날로그시계 >>


초단위로 똑딱 똑딱 흐르니 아날로그라고 하긴 그렇지만 ... 뭐 어쨌거나...

분,초는 360도를 60으로 나눠서 초당 6도씩 이동시키며
시는 360도를 12로 나눠서 30도씩 이동시킴. ㅡ.,ㅡ;;

시계 표시는 행렬 로테이션을 이용해서 표시함

초 각 : Convert.ToSingle(this.secPin.IdentityRadian(DateTime.Now.Second) * 6);
분 각 : Convert.ToSingle( this.minPin.IdentityRadian(DateTime.Now.Minute) * 6);
시 각 : Convert.ToSingle( (this.hourPin.IdentityRadian(DateTime.Now.Hour)%12)* 5 * 6);


'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

그래픽스. 어디에 그려지는가?  (0) 2009.05.08
테트리스  (0) 2009.05.02
HTML 자동 정렬 프로그램  (0) 2009.05.02
FND를 이용한 디지탈 시계  (0) 2009.05.02
FND( SevenSegment )  (0) 2009.05.02

 이 프로그램은 수성정보통신에 처음 입사했을 당시 계시던 부장님이 DB 프로시져에 HTML코드를 직접 넣어 뿌리다보니 HTML 태그가 안맞아서 오류가 많이 생겨서 그걸 정리하기 위해 만들어 드렸던 프로그램임.

 이때는 정규식도 모를때고 한참 알고리즘 공부할때라서..
HTML파싱을 좀 독특하게 했음. 그래프 알고리즘을 적용해서 만들었음. 참 특이했던 것임.

  에피소드 : DB만 하실줄 아시던 부장님이 웹프로그래머가 DB 데이타를 받아서 다시 그걸 테이블태그를 붙여서 플래이스홀더 컨트롤에 바인딩 하는것을 보고 DB에서 다 해줄테니 그냥 붙여넣으라고 했다는... 웹프로그래머는 asp.net 1년차 였음. 나역시 윈폼1년하고 웹폼을 배워보고자 들어가서 보았을때 첨엔 asp.net은 그렇게 작업하는줄 알았음...


사용자 삽입 이미지
* 정렬 후 긴 소스같은경우 해당 위치를 보기 위해 빨간선으로 위치를 알수 있도록 표시


ps : 다 구현하고 프로젝트 끝나갈 무렵 vs2005에 보니 정렬기능이 있더라눈... 쿨럭!

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

테트리스  (0) 2009.05.02
아날로그 시계  (0) 2009.05.02
FND를 이용한 디지탈 시계  (0) 2009.05.02
FND( SevenSegment )  (0) 2009.05.02
데이타베이스 브라우져 ver2  (0) 2009.05.02

앞서 설명한 FND를 컨트롤로 만들어두었던것을
이용해서 시계를 만들었음.

사용자 삽입 이미지

다시봐도 나름 잘 만들었넹...

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

아날로그 시계  (0) 2009.05.02
HTML 자동 정렬 프로그램  (0) 2009.05.02
FND( SevenSegment )  (0) 2009.05.02
데이타베이스 브라우져 ver2  (0) 2009.05.02
처음 만든 이미지 뷰어  (0) 2009.05.02

사용자 삽입 이미지

<< FND >>


FND는 LED를 위와같이 배열하여 하나의 디스플레이 소자로써 숫자나 영문 표시를 한다.

실제 부품 핀 번호를 위에 A~ G까지 써놓았고 여기에 Com 단자와 Dot표시 Led가 존재한다.

다만 프로그래밍에서 제외시켰음.


이 프로그래밍은 C#을 막 시작해서 5달째쯤 되어 시간이 좀 되던중에 디지탈 숫자 표시에 관련된
얘기를 듣고 마침 객체지향에 대해 막 궁금해 하던 시절에 이걸 만들었었다. 아 ~ 옛날이여~~

 내가 전자과라서 전자 부품은 거의 모두 알고 있었던 시절이었으니 부품에 대해 그리 사전조사가 필요없었고. 당시 객체 지향에 맞는 코드를 만들어보고자 위 FND를 설계후 디지탈 시계를 만들었었음.


    /// <summary>
    /// fillup: 채우다,
    /// BackColor : 바탕색,
    /// UserColor : 사용자 정의색
    /// </summary>
    enum FillUp {BacKColor,UserColor};
    enum SegmentArray {a,b,c,d,e,f,g};


//핀 번호와 Led 표시상태를 구분짓는 값이다. Led가 On, Off되면서 숫자가 표시되므로
이 값을 위처럼 구분짓는다.

        /// <summary>
        /// 모서리 옵셋값
        /// </summary>
        float angleoffsetvalue = 9f;
        public float AngleOffsetValue
        {
            get { return angleoffsetvalue;  }
            set { angleoffsetvalue = value;
            CVPointSegments.Calculat(this.Size, angleoffsetvalue, thinkness);
            }
        }

// 이것은 Led 하나의 다각형 그림을 그릴때 그 모서리를 뽀족하게 할것인지 말것인지를 결정하는 값이다.

  /// <summary>
        /// 세그먼트 두께 값.
        /// </summary>
        float thinkness = 7f;
        public float SegmentThinkness
        {
            get { return thinkness;  }
            set { thinkness = value;
            CVPointSegments.Calculat(this.Size, angleoffsetvalue, thinkness);
            }
        }

// 이것은 세그먼트 표시되는 Led표시부의 두께 값이다.

        /// <summary>
        /// 외곽선 유무 기본값 : true
        /// </summary>
        Boolean  displayouterwall = true;
        public Boolean DisplayOuterWall
        {
            get {return displayouterwall;  }
            set {displayouterwall = value; }
        }
// 이것은 표시될때 Led의 외곽선 표시임.

        /// <summary>
        /// 디스플레이~~!! 될 번호... 숫자 0~ 9 가운데...
        /// </summary>
        int displayIndex = 0;
        public int DisplayNumber
        {
            get { return displayIndex;  }
            set {
                    displayIndex = value % 10;
                }
        }
// 표시될 숫자

        /// <summary>
        /// Segment 컬러.
        /// </summary>
        Color   usercolor = Color.Red;
        public Color UserColor{
            get {return usercolor;}
            set {usercolor  = value;}
        }
// Led 색상이 되겠다.

        string[][] DisplayNumbers = new string[10][]
            {
                 new string[] {"a","b","c","d","e","f"}, // 0
                 new string[] {"b","c"}, // 1
                 new string[] {"a","b","g","d","e"}, // 2
                 new string[] {"a","b","c","d","g"}, // 3
                 new string[] {"b","c","g","f"}, // 4
                 new string[] {"a","f","g","c","d"}, // 5
                 new string[] {"a","f","g","c","d","e"}, // 6
                 new string[] {"a","b","c"}, // 7
                 new string[] {"a","b","c","d","e","f","g"}, // 8
                 new string[] {"a","b","c","d","g","f"} // 9
            };

위 표시는 숫자값에 따른 켜질 Led다!

위에만 봐도 FND의 실제 동작을 가늠할 수 있지 아니한가?

위에는 동작관련된것이고.

아래는 세그먼트 표시관련된 것.


            //                                                      |offset|
            //                  sp2******************sp3
            //         sp1******************************sp4         <== 세그먼트 1개
            //                  sp6******************sp5
            //    halfhinkness : 두께의 절반.
            //
이것이 기본 컨셉이었다!!
오~~ 그땐 그래도 머리가 잘 돌았나부다. 하하하!!

사용자 삽입 이미지

<< 외곽선 사용여부 >>


사용자 삽입 이미지

<< FND 색 변경 >>



사용자 삽입 이미지

<< AngleOffSet 값 변경 >>

실제 존재하는 부품 동작 그대로를 프로그래밍 해보았음.



 

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

HTML 자동 정렬 프로그램  (0) 2009.05.02
FND를 이용한 디지탈 시계  (0) 2009.05.02
데이타베이스 브라우져 ver2  (0) 2009.05.02
처음 만든 이미지 뷰어  (0) 2009.05.02
폼간 데이타 전달  (0) 2009.05.02

이건 데이타베이스 브라우져 버젼2 로써
앞에 블로깅 한 것에 이전버젼으로 초기에 만들어졌던 브라우져보다 조금 독특한 방식으로 동작됨.

사용자 삽입 이미지
<< 프로그램 설정 관련 화면 >>

사용자 삽입 이미지
<< Insert 관련 화면 >>
* 수정이나 삭제 역시 이화면으로 사용됨.

UI는 정말 어쩔수 없는듯 함.


제작의도!
 원래는 취업의도로 부족한 경력을 조금이라도 어필해보고자 만들었던 것이고
1년정도 C#을 했던 경험과 공부했던 지식들을 모아서 만들었었음.

 이 프로그램은 DB와 상호 작용시 프로시져를 이용하며, 그때 만들어져있던 프로시져생성기와 더블어 사용하게되며 프로시져를 제작 후 해당 프로시져를 프로그램에 등록하게 되면 자동으로 UI를 표출하고 데이타를 가져와서 뿌려주고 추가 수정 삭제 작업역시 동일하게 구현이 됨.

 이 기능들을 바탕으로 조금더 나은 UI를 그려내고자 작업하다가 이번에 새로운 브라우져가
만들어졌었다.

UI참... 거시기 하네~~


'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

FND를 이용한 디지탈 시계  (0) 2009.05.02
FND( SevenSegment )  (0) 2009.05.02
처음 만든 이미지 뷰어  (0) 2009.05.02
폼간 데이타 전달  (0) 2009.05.02
그리드뷰 컨트롤  (0) 2009.05.02

사용자 삽입 이미지

기능1 : 단순한 이미지 뷰어 기능
기능2 : 알집을 이용해서 압축된 이미지 파일 관리

지정된 폴더내에 알집을 이용해서 풀어놓고 볼수 있게되며
파일 관리 한곳에 몰아놓을수 있어서 쉬워짐.

다시만든다고 하면... 좀더 멋지게 나오겠지??????


'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

FND( SevenSegment )  (0) 2009.05.02
데이타베이스 브라우져 ver2  (0) 2009.05.02
폼간 데이타 전달  (0) 2009.05.02
그리드뷰 컨트롤  (0) 2009.05.02
SMS TextLength 비교  (0) 2009.05.01

훈스닷넷에서 폼간 데이타 전달 관련해서 질문글이 자주 올라와서
여러가지방법으로 전달방법을 구현해서 올렸던적이 있었음.


사용자 삽입 이미지

수정을 누르면 전달 받는 폼이 뜸
사용자 삽입 이미지

폼이 뜨면 적용하면 데이타값을 적용하고 그리드뷰를 다시 셋팅하게됨.




참 쉽죠잉..

인터페이스를 이용하거나, 생성자를 이용하거나. 데이타를 전달할 방법은 많음.

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

데이타베이스 브라우져 ver2  (0) 2009.05.02
처음 만든 이미지 뷰어  (0) 2009.05.02
그리드뷰 컨트롤  (0) 2009.05.02
SMS TextLength 비교  (0) 2009.05.01
Excel Export  (0) 2009.05.01


테이블형태의 데이타를 표시해주는 데이타 그리드뷰.
2년 내내 이것뿐이 써본게 없다. 

모든 그리드뷰를 동일한 설정을 주고자 한다면 UI디자인상에서 하는건
오마이갓!! 이될것이다.

이를 DataGridViewManager 라는것으로 만들어서 처리한다.
코드가 많아보인다라면.. 우리에겐 카피앤패스트가 있기 때문에 주저하지 않고 적용이 가능해진다.

  private void InitReportDestinationGrid()
        {
            try
            {
                #region  그리드 뷰 셋팅!
// 컬럼추가
                DataGridViewManager.ColumnAdd(ReportDestinationGrid, "NO", "전송타입", DataGridViewManager.ColumnType.TextBox, true);
                DataGridViewManager.ColumnAdd(ReportDestinationGrid, "USERYN0", "자연지진", DataGridViewManager.ColumnType.CheckBox, false);
                DataGridViewManager.ColumnAdd(ReportDestinationGrid, "TARGET", "전송매체", DataGridViewManager.ColumnType.TextBox, true);
                DataGridViewManager.ColumnAdd(ReportDestinationGrid, "MEMBER", "등록자수", DataGridViewManager.ColumnType.TextBox, true);
                DataGridViewManager.ColumnAdd(ReportDestinationGrid, "USERYN1", "인공지진", DataGridViewManager.ColumnType.CheckBox, false);

                Color columnBackGroundColor = Color.White; // 백그라운드컬러
// 컬럼셋팅
                DataGridViewManager.ColumnsConfig(ReportDestinationGrid, "NO", columnBackGroundColor, false,
                    null, 1, DataGridViewColumnSortMode.NotSortable,
                    new DataGridViewManager.DgvContentAlignment(DataGridViewContentAlignment.MiddleCenter));
                DataGridViewManager.ColumnsConfig(ReportDestinationGrid, "USERYN0", columnBackGroundColor, null,
                    null, 20, DataGridViewColumnSortMode.NotSortable,
                    new DataGridViewManager.DgvContentAlignment(DataGridViewContentAlignment.MiddleCenter));
                DataGridViewManager.ColumnsConfig(ReportDestinationGrid, "TARGET", columnBackGroundColor, null,
                    null, 40, DataGridViewColumnSortMode.NotSortable,
                    new DataGridViewManager.DgvContentAlignment(DataGridViewContentAlignment.MiddleLeft));
                DataGridViewManager.ColumnsConfig(ReportDestinationGrid, "MEMBER", columnBackGroundColor, null,
                    null, 40, DataGridViewColumnSortMode.NotSortable,
                    new DataGridViewManager.DgvContentAlignment(DataGridViewContentAlignment.MiddleCenter));
                DataGridViewManager.ColumnsConfig(ReportDestinationGrid, "USERYN1", columnBackGroundColor, null,
                    null, 20, DataGridViewColumnSortMode.NotSortable,
                    new DataGridViewManager.DgvContentAlignment(DataGridViewContentAlignment.MiddleCenter));
// 그리드뷰 셋팅
                DataGridViewManager.Config(ReportDestinationGrid, false, false, false, false, null, false,
                    new DataGridViewManager.DgvSelectionMode(DataGridViewSelectionMode.FullRowSelect),
                    new DataGridViewManager.DgvCellBorderStyle(DataGridViewCellBorderStyle.Sunken),
                    new DataGridViewManager.DgvAutoSizeColumnsMode(DataGridViewAutoSizeColumnsMode.Fill)
                    );
// 그리드뷰 컬러 설정
                DataGridViewManager.SetRowColor(ReportDestinationGrid, columnBackGroundColor, columnBackGroundColor);
                #endregion
                #region 그리드 뷰 데이타 바인딩
// 그리드뷰 데이타 바인딩
                StringBuilder sb = new StringBuilder();
                {
                    sb.AppendFormat(" Select SendType");
                    sb.AppendFormat("       ,Send_YN");
                    sb.AppendFormat("       ,SendList");
                    sb.AppendFormat("       ,User_Count");
                    sb.AppendFormat("       ,Send_YN1");
                    sb.AppendFormat(" From   {테이블명}");
                    sb.AppendFormat(" Order by SendList ASC");

                    DataSet ds = msDB.GetDataSet(sb.ToString());

                    if (DataSetCheck.HasTable(ds) && DataSetCheck.HasTableRow(ds, 0))
                    {
                        DataGridViewManager.RowsAdd(ReportDestinationGrid, ds.Tables[0], false);
                       //데이타 그리드를 선택하고 데이타를 바인딩 시킴

        }
         else
        {
             Alert("검색된 데이타가 없습니다.");
         }
     }
      sb = null; 
      #endregion
 }
 catch (Exception ex)
 {
         Alert(ex.Message);
 }

}

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

처음 만든 이미지 뷰어  (0) 2009.05.02
폼간 데이타 전달  (0) 2009.05.02
SMS TextLength 비교  (0) 2009.05.01
Excel Export  (0) 2009.05.01
판넬 슬라이드 애니메이션  (0) 2009.05.01



SMS 입력받고 데이타 길이 체크하는 처리부분.

 public partial class Form1 : Form
    {
        bool char_ASCIICODE = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {           
            int length = Encoding.Default.GetBytes(this.textBox1.Text).Length;

            if (length > 80)
            {
                this.textBox1.Text = this.textBox1.Text.Substring(0, this.textBox1.TextLength - (char_ASCIICODE ? 1 : 2));
                char_ASCIICODE = false;
                this.textBox1.Select(this.textBox1.TextLength, 0);
                return;
            }
            length = Encoding.Default.GetBytes(this.textBox1.Text).Length;
            this.label1.Text = string.Format("{0}/80", length);
        }
       
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar < 256)
                char_ASCIICODE = true;
            else
                char_ASCIICODE = true;
        }   
}

그리 어려운 코드가 아니라 주석도 없다!

'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글

폼간 데이타 전달  (0) 2009.05.02
그리드뷰 컨트롤  (0) 2009.05.02
Excel Export  (0) 2009.05.01
판넬 슬라이드 애니메이션  (0) 2009.05.01
데이타베이스 브라우져 ver3  (0) 2009.05.01