Win32 대화 상자와 Windows 폼이 다른 점은 폼이 자동으로 사용자가 Enter, Esc 키가 눌렀을때 키보드 입력을 라우팅 하지 않는 다는데 있다. MFC와 같은 Win32 작업을 할때는 폼을 하나 생성하게 되면 Ok, Cancel 버튼이 생성되게 된다. 하지만 Windows 폼의 경우는 아무것도 생성되지 않는 윈도우만 생성된다. 이때 폼에 OK, Cancel 버튼을 넣어 주고 싶다면, 어떻게 해야 하는가? 이때 위의 이미지에 나오듯이 해당 버튼을 만들고 DialogResult의 속성을 정의해 주면 된다. 더 펀한듯 보인다.
C# 프로그램을 하다 보면 int 또는 Int32 라는걸 사용해서 타입을 정해줄 때가 있다. 처음에는 int 형이 있는데 Int32, Int64, int16 과 같은 걸 볼 수 있다. 지금 생각 해보면 int 는 C# 의 미리 정의된 타입이고, Int32 와 같이 int가 대문자 Int로 되는 것은 System을 네임스페이스로 가지는 .Net 의 미리 정의된 타입인거 같다.
몇가지 예)
bool
System.Boolean
True 인지 false 인지 나타내는 논리 값
기본값은 false 이다.
byte
System.Byte
0 부터 255 까지의 값을 저장하는 부호 없는 바이트, 기본값은 0 이다.
sbyte
System.SByte
-128 ~ 127 까지 저장하는 바이트, 기본값은 0이다.
char
System.Char
부호없는 16비트 유니코드 문자, 기본값은 ‘\0’ 이다.
decimal
System.Decimal
128 비트 데이터 형식, 재무 및 통화 계산에 적합하다. 기본값은 0.0m 이다.
double
System.Double
64비트 부동 소수점, 기본값은 0.0d 이다.
float
System.Single
32비트 부동 소수점, 기본값은 0.0f 이다.
int
System.Int32
부호 있는 32비트 정수 타입, 기본값은 0 이다.
uint
System.UInt32
부로 없는 32비트 정수 타입, 기본값은 0이다.
나머지는.. -.- 귀찮네욤. ^^
여기서 중요한건 C#으로 개발하는 사람은 C#의 타입을 사용해서 프로그램을 작성하는게 보다 명확하며, 다른 언어를 사용하는 컴포넌트 개발자와 함께 작업하는 경우에는 언어 사이의 타입을 일치시키기 위해서 반드시 위의 표와 같은 타입을 알고 있어야 한다.
하나의 패널 속에 여러개의 패널을 삽입이 가능하다. 이걸 가지고 패널 속에 Visio 와 같은 에디팅 화면을 구현할 수 있을거 같다. 물론 Panel이 아닌 ScrollView 등 다양한 뷰에도 구현이 가능해 진다.
특정 이벤트에 따라서 Panel에 여러개의 Panel 자식 컨트롤을 추가 한 후에 자식 Panel의 이벤트를 사용해서 각각의 패널을 동작시킬 수 있다.
우선 이벤트에 따른 자식 Panel로 등록하는 코드 이다.
private void button2_Click(object sender, EventArgs e) { Panel childPanel = new Panel(); childPanel.BackColor = System.Drawing.Color.Gainsboro; childPanel.Location = new System.Drawing.Point(67, 44); childPanel.Name = "panel4"; childPanel.Size = new System.Drawing.Size(71, 78); childPanel.MouseDown += new MouseEventHandler(childPanel_MouseDown); childPanel.MouseMove += new MouseEventHandler(childPanel_MouseMove); childPanel.MouseUp += new MouseEventHandler(childPanel_MouseUp); panel2.Controls.Add(childPanel); } - 여러개의 패널이 등록 되지만 이벤트를 처리 하는 함수는 동일하게 가져 가게 되면 공통적으로 Panel을 처리할 수 있다. (childPanel_MouseDown, Move, Up)
이제 Drag a Panel을 구현하기 위한 코드이다.
private bool dragging = false; private Point offset;
기존의 다른 코드를 사용해서 처리 할때 Release 시 드로잉이 되지 않는 문제점이 발생하였다. 솔직히 이거 때문에 디버깅에 시간이 좀 걸렸다. 나머지 모듈을 다 제거 하고나서야 이 클래스를 사용하지 않고 디버깅을 해봐야 겠다. 생각이 들었고, 빼고 보니 제대로 되었다. 즉, CMemDC 클래스가 이상하다는 것을 알았고, 위의 주소에 있는 내용을 복사해서 처리 하니 되었다.
물론 생성자에 CRect 의 내용도 포함될 수 있는 코드도 있는걸로 봐서 ActiveX 와 같은 곳에서도 사용될 수 있을거 같다.