퇴근5분전

훈스 닷넷에 질문글로 올라왔던 다각형 내부 클릭체크에 대한 답변으로 
C++로 된것을 찾아서 C#으로 변경함. 

사각형을 그렸을 때.( 일반 Rectangle이라면 Rectangle로도 충분히 체크가 가능하다. )

            pts[0] = new PointF();
            pts[0].X = 200;
            pts[0].Y = 100;

            pts[1] = new PointF();
            pts[1].X = 200;
            pts[1].Y = 200;

            pts[2] = new PointF();
            pts[2].X = 100;
            pts[2].Y = 200;

            pts[3] = new PointF();
            pts[3].X = 100;
            pts[3].Y = 100;

            pts[4] = new PointF();
            pts[4].X = 200;
            pts[4].Y = 100;

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
               //   0 To  mouse.X ;

            PointF orgin = new PointF(0, 0);
            int cnt = 0;
            PointF mDown = new PointF( Convert.ToSingle( e.X ), Convert.ToSingle( e.Y ));
            for (int i = 0; i < pts.Length - 1; i++)
                GetIntersectPoint(orgin, mDown, pts[i], pts[i + 1], ref cnt);

            if (cnt % 2 == 1)     this.Text = "내부";
            else                         this.Text = "외부";       
        }




        bool GetIntersectPoint(PointF AP1, PointF AP2,  PointF BP1,  PointF BP2,ref int Cnt)
        {
            float t;
            float s;
            float under = (BP2.Y - BP1.Y) * (AP2.X - AP1.X) - (BP2.X - BP1.X) * (AP2.Y - AP1.Y);
            if (under == 0)
            {
             //   Cnt = Cnt;
                return false;
            }

            float _t = (BP2.X - BP1.X) * (AP1.Y - BP1.Y) - (BP2.Y - BP1.Y) * (AP1.X - BP1.X);
            float _s = (AP2.X - AP1.X) * (AP1.Y - BP1.Y) - (AP2.Y - AP1.Y) * (AP1.X - BP1.X);    
            
            t = _t/under;
            s = _s/under;
            if (t < 0.0 || t > 1.0 || s < 0.0 || s > 1.0)
            {
            //    Cnt = Cnt;
                return false;
            }
            if (_t == 0 && _s == 0)
            {
             //   Cnt = Cnt;
                return false;
            }

            Cnt ++;
            
            return true;
        } 

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

판넬 슬라이드 애니메이션  (0) 2009.05.01
데이타베이스 브라우져 ver3  (0) 2009.05.01
프로시져 생성기  (0) 2009.05.01
유저컨트롤-[도구모음]  (0) 2009.05.01
이미지뷰어!  (0) 2009.05.01

페이징 컨트롤러를 만들었던것을 올림.

invalid-file

cs파일

invalid-file

ascx파일


개선 할점 : 흠 사용할때 좀 복잡했던것으로 기억함.( 디자인모드에서 이벤트 등록이 안됨 )

   protected void Page_Load(object sender, EventArgs e)
    {
        PageNavigator1.PageClick += new ClickEvent(PageNavigator1_PageClick);
       
    }

    void PageNavigator1_PageClick(PageEventArgs e)
    {
        throw new Exception("The method or operation is not implemented.");
    }

이렇게 페이지마다 등록해서 썼던걸로 기억함.

이 프로그램은 SBS 전자자막의뢰 웹사이트 구축시 만들어 사용하던 프로그램으로

DB와 연동시켜 DB프로시져를 자동생성하고 생성된 프로시져를 통해서

비지니스레이어부분을 자동생성처리 하는 프로그램임.

장점 : 반복되는 비지니스 레이어를 손쉽게 1분안에 만들어낼수 있는 것으로 작업시간을 줄일수 있음.


사용자 삽입 이미지
                              << 테이블 정보를 가져와 프로시져를 생성한 모습 >>

사용자 삽입 이미지
                                          << 프로시져 정보를 가져온 모습 >>

1. 캡슐화 할 클래스명과 기능명을 입력 후
2. 코드 만들기를 누르면 비지니스처리 코드와 비지니스 코드를 실제 이용하는 로직에 대한
코드까지 가져옴.

<< 만들어진 코드 >>
/* BSL 구현에서 반복작업을 줄이기 위해 만들어내는 코드임( 버그 주의 ) */
using FrameWork.DB.DAC;
using System.Data.SqlClient;

namespace FrameWork.DB.BSL
{
 public class _TempClassName_ : ValidateQuery, IDisposable
 {

  public bool _TempMethodName_(params object[] objParams)
  {
   bool returnValue  = false;

   try
   {
    using (DataAccess dac = new DataAccess())
    {
     SqlParameter[] sqlparams = new SqlParameter[objParams.Length];
     sqlparams[0] = new SqlParameter("@Num", SqlDbType.Int);
     sqlparams[1] = new SqlParameter("@T1", SqlDbType.NChar,10);
     sqlparams[2] = new SqlParameter("@T2", SqlDbType.NChar,10);
     sqlparams[3] = new SqlParameter("@T3", SqlDbType.NChar,10);
     sqlparams[4] = new SqlParameter("@T4", SqlDbType.NChar,10);

     for(int cnt  = 0; cnt < objParams.Length ; cnt++)
     {
      this.Validate(sqlparams[cnt].SqlDbType, objParams[cnt]);
      sqlparams[cnt].Value = (objParams[cnt] == null ? DBNull.Value : objParams[cnt]);
     }

     returnValue = dac.TransactionProcedure("UP_Table_1_REGISTER", sqlparams);
    }
   }
   catch(Exception exception)
   {
    throw exception;
   }
   return returnValue;
  }

  public void Dispose()
  {
   // throw new Exception("The method or operation is not implemented.");
  }
 }
}

<< cs 에서 Bsl을 사용하는 코드 >>

/* .cs내에 사용하는 메서드 내부에서 사용하는 코드임.*/
public void _TempMethodName_()
{
 try
 {
  using(FrameWork.DB.BSL._TempClassName_ _tempclassname_1 = new FrameWork.DB.BSL._TempClassName_())
  {
   object[] UserParam = new object[5];

   UserParam[0] = DBNull.Value;  //@Num
   UserParam[1] = DBNull.Value;  //@T1
   UserParam[2] = DBNull.Value;  //@T2
   UserParam[3] = DBNull.Value;  //@T3
   UserParam[4] = DBNull.Value;  //@T4

   if (_tempclassname_1._TempMethodName_(UserParam) == false)
   {
    ErrorMessage = "실패했습니다.";
   }
   else
   {
    //성공후 이뤄지는 처리
   }
  }
 }
 catch(Exception ex)
 {
  ErrorMessage = ex.Message;
 }
}

}

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

판넬 슬라이드 애니메이션  (0) 2009.05.01
데이타베이스 브라우져 ver3  (0) 2009.05.01
다각형 내부 클릭 체크.  (0) 2009.05.01
유저컨트롤-[도구모음]  (0) 2009.05.01
이미지뷰어!  (0) 2009.05.01