2009년 7월 31일 금요일

[VS 2008] Visual C# KeyBinding

Visual C# KeyBinding



1. MSDN
   Visual C# 기본 바로 가기 키

cf) Visual C# 기본 바로 가기 키


2. Visual C# keybinding pdf 파일
    Visual Studio 2008 버전

cfile28.uf.15204B3450AEC2341DBAF7.pdf

2009년 7월 27일 월요일

사용자 정의 이벤트 만들기

사용자 정의 이벤트 만들기



 .NET Framework 이 발생시키는 시스템 이벤트와는 별도로 사용자가 직접 이벤트를 정의하여 사용할 수 있다. 사용 목적은 여러가지 있겠으나 데이터 교환의 목적으로 사용 되기도 한다.
즉, 두 폼간의 데이터 전달 또는 폼과 클래스 라이브러리(DLL)간 데이터 교환에 이벤트가 이용된다.

 form1 과 form2 간의 사용자 정의 이벤트 만들기를 예로 들어본다.
form2에서 이벤트를 발생 시키고 데이터를 form1으로 보내는 예이다.

 이벤트를 발생 시키는 form2 의 코드는 다음과 같다.

// 이벤트 정의
public delegate void EventHandler(object sender, EventArgs e);

public partial class form2 : Form
{
    // 이벤트 선언
    public event EventHandlerHandler eReceiveMsg;

    public form2()
    {
        InitialzeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // 이벤트 호출
        eReceiveMsg(this, e);
    }
}


1. delegate 를 이용하여 이벤트를 정의한다.
    정의할 이벤트가 사용할 이벤트 핸들러의 리턴값 및 인수를 정의해 준다.
2. 이벤트 선언
   사용할 이벤트를 선언해 준다.
3. 이벤트 호출
   이벤트를 호출 할 특정 위치에서 이벤트를 호출한다. 이벤트에 전달할 인수를 맞쳐준다.


 이벤트를 받는 쪽 즉, form1의 코드는 대략 다음과 같다.

Form frm2 = new Form2(this);
frm2.eReceiveMsg += new EventHandler(OnReceiveMsg);
frm2.Show();

private void OnReceiveMsg(object sender, EventArgs e)
{
    SetMsgTextBox("JJ");
}

public void SetMsgTextBox(string strSetText)
{
    MessageBox.Show(strSetText);
}
form1 에서 form2 의 객체를 참조 시키고
form2 의 객체를 생성한다.
form2 에서 선언한 이벤트에 이벤트 핸들러를 추가 시킨다.

이벤트 핸들러를 추가 시키는 함수는 (여기서 EventHandler) form2 에서 정의한 이벤트 선언이다.
원래대로 쓰자면 form2 의 네임스페이스.클래스이름.EventHandler 로 써줘야 한다.

여기서 OnReceiveMsg 메소드를 연결시켜 주었는데 메소드의 선언 형식이 form2 에서 정의한 이벤트 핸들러 형식과 일치해야한다.

2009년 7월 21일 화요일

이벤트 (Event)

이벤트 (Event)



 어떤 사건이 발생했을 때 호출되어야 하는 메서드의 목록이다.
어떤 사건 즉, 이벤트에 의해 호출되는 메서드를 특별히 이벤트 핸들러 라고 한다.
이벤트 핸들러는 리턴값을 갖지 않는다.
이벤트는 내부적으로 델리게이트(delegate; 위임자)로 구현된다.
메시지는 C언어 수준의 구조체이기 때문에 객체 지향 환경과 잘 맞지 않는다. 그래서 메시지를 객체 지향적으로 캡슐화 한 것이 이벤트 이다.


이벤트의 선언 형식




 지정자 event 델리게이트 이름;
ex) public event Notice OnComplete;


이벤트의 사용 예
C# 에서 이벤트는 내부적으로 델리게이트로 구현된다. 따라서 이벤트를 선언하기 전에 델리게이트를 먼저 선언해 두어야 한다.


using System;

namespace EventTest
{
    // 이벤트 형식 선언
    //   - 델리게이트는 클래스와 같은 레벨에 선언
    public delegate void Notice();

    class Printer
    {
        public void Print()
        {
            Console.WriteLine("수신된 데이터를 인쇄합니다.");
        }
    }

    class Receiver
    {
        // 이벤트 선언
        public event Notice OnComplete;

        public void Receive()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(i + "% 수신중");
                System.Threading.Thread.Sleep(200);
            }

            if (OnComplete != null)
                OnComplete();
        }
    }

    class CSTest
    {
        public static void Main()
        {
            Printer P = new Printer();
            Receiver R = new Receiver();

            R.OnComplete += P.Print;
            R.Receive();
        }
    }







이벤트와 델리게이트
이벤트와 델리게이트는 사용 목적이 동일한 장치이다.
이벤트는 델리게이트를 숨기고 최종 사용자가 편리하게 쓸 수 있는 좀 더 간단한 이벤트만 공개한다.
이벤트는 멀티스레드에 대해서도 안전하다는 장점이 있다.





cf) .NET 프로그래밍 정복 - 김상형

2009년 7월 19일 일요일

WinForm 시작과 종료 이벤트

WinForm 시작과 종료 이벤트



 Form 및 Control 클래스는 응용 프로그램 시작및 종료와 관련된 이벤트 집합을 노출합니다.


Form의 시작
Windows Forms 응용프로그램을 시작할 때 기본 폼의 시작 이벤트가 다음 순서로 발생 합니다.



● Form.Load- Form이 로드되어 메모리에 올라올 때, 화면에 표시되기 직전에 발생
- 프로퍼티를 변경한다거나, 리소스를 할당하는 등 Form의 동작에 필요한 초기화 수행
- Form의 생애 동안 딱 한 번만 발생하므로 일회적인 초기화에 적합
- Form.Load 이벤트 보다 Form 클래스의 생성자가 먼저 호출 된다.


Form의 종료
응용 프로그램이 닫히면 기본 폼의 종료 이벤트가 다음 순서로 발생 합니다.



● Form.Closing
- Form 이 닫히기 직전에 발생한다.
- 인수로 FormClosingEventArgs 객체가 전달되는데 이 객체의 Cancel 프로퍼티를 true로 설정하면
  종료를 취소 할 수 있다.

● Form.Closed
- Form이 닫힐 때, 즉 생애를 마치고 파괴될 때
- Form.Load 이벤트에 반대되는 이벤트로 Form의 생애 딱 한 번만 전달된다.
- Form.Load 에서 할당한 리소스를 이 이벤트에서 해제한다.
- .NET 2.0 이전에는 Closed 라는 이벤트를 사용했었는데 2.0 이후부터는 FormClosed로 바뀌었다.
- 별도의 인수는 전달되지 않는다.


※ Application 클래스의 ApplicationExit 이벤트는 기본 폼의 종료 이벤트 이후에 발생 합니다.

※ 생성자와 Load 이벤트
- 호출 순서는 생성자 → Load 이벤트
- 생성자는 언어 차원에서 컴파일러가 자동으로 호출하는 메서드
- Load 이벤트는 라이브러리 차원에서 프레임워크에 의해 호출되는 메서드
- 생성자는 객체를 초기화하는 시점을 제공하기 위해 호출되므로 초기화 작업만 진행 해야되며
  Form 을 닫아 버리는 동작을 하면 안된다.(예외발생)



cf)  http://msdn.microsoft.com/ko-kr/library/86faxx0d.aspx

2009년 7월 12일 일요일

Client 영역 크기 계산

Client 영역 크기 계산





위와 같은 윈도우 에서 Client영역은 회색 부분을 말한다.
Client 영역 위에 마우스 움직임(OnMouseMove) 이벤트를 잡아서 처리 하기 위해
Client 영역을 계산한다.
(그냥 Client 영역을 계산하는 메소드가 있을텐데... 없나??)

Source Code는 다음과 같다.

double width = ActualWidth - 2 * SystemParameters.ResizeFrameVerticalBorderWidth;
double height = ActualHeight - 2 * SystemParameters.ResizeFrameHorizontalBorderHeight
                      - SystemParameters.CaptionHeight;

ActualWidth, ActualHeight
namespace : System.Windows.FrameworkElement
응용프로그램의 전체 가로, 세로 길이를 리턴한다.

SystemParameters.ResizeFrameVerticalBorderWidthnamespace : System.Windows
응용프로그램의 Client 영역을 감싸고 있는 가로 방향 프레임의 크기를 말한다.
좌 우 각각 총 2개이다.

SystemParameters.ResizeFrameHorizontalBorderHeight
namespace : System.Windows
응용프로그램의 Client 영역을 감싸고 있는 세로 방향 프레임의 크기를 말한다.
좌 우 각각 총 2개 이다.

SystemParameters.CaptionHeight
namespace : System.Windows
응용프로그램의 타이틀바의 높이 크기를 말한다.




cf ) 찰스 페졸드의 WPF

2009년 7월 9일 목요일

[STAThread] Attribute

[STAThread] Attribute




WPF (Windows Presentation Foundation) 프로그램 에서는 [STAThread] Attribute 속성이
반드시 Main()함수 앞에 나와야 한다.

ex)




[STAThread] Attribute 를 지정해 주지 않으면 InvalidOperationException 예외 상황과 함께
프로그램이 종료 된다.




 최초 애플리케이션 스레드의 스레드 모델을 단일 스레드 아파트먼트(single-threaded apartment)로
지정하는 것을 의미한다. 이는 COM과 상호 운용하기 위해 필요하다.
애플리케이션이 다중 스레드를 사용하지 않는다는 것을 의미한다.



cf) Programming WPF - 사용자 경험(UX) 를 바꾸는 기술, 이안 그리피스, 크리스 셀즈
" STAThread 특성은 COM이 응용 프로그램의 주 스레드에서 초기화 되는 경우 WPF 응용프로그램의 요구에 따라 단일 스레드 UI 작업과 호환되도록 초기화도어야 함을 의미한다."






cf) 찰스 페졸드의 WPF

2009년 7월 8일 수요일

[이벤트] 윈도우즈(OS) 종료 및 로그오프시 발생 - SessionEnding

윈도우즈(OS) 종료 및 로그오프시 발생 - SessionEnding



■ SessionEnding

1. Application 클래스의 이벤트
2. 콘솔 어플리케이션이 아닌 윈도우즈 어플리케이션으로 컴파일 한 경우에만 SessionEnding 이벤트를
   받을 수 있다.
3. Application 클래스에는 SessionEnding 이벤트 발생시 OnSessionEnding 이벤트 핸들러가 동작하도록
  연결되어 있다.
4. Application 클래스를 상속하는 클래스를 정의하여 OnSessionEnding 가상함수를 재정의 하면
  윈도우즈가 종료되는 것을 방지하거나 특정 처리를 할 수 있다.
5. SessionEndingCancelEventArgs 객체의 Cancel 플래그를 true로 설정하면 윈도우즈 종료를 막는다.
6. ReasonSessionEnding 프로퍼티에 어떤 값을 지정하느냐에 따라 세부적인 동작 제어 가능
   - ReasonSessionEnding.Logoff
   - ReasonSessionEnding.Shutdown



■ 예제 소스

using System;
using System.Windows;
using System.Windows.Input;

namespace Petzold.InheritTheApp
{
    public class InheritTheApp : Application
    {
        [STAThread]
        public static void Main()
        {

            InheritTheApp app = new InheritTheApp();
            app.Run();
        }

        protected override void OnStartup(StartupEventArgs args)
        {
            base.OnStartup(args);

            Window win = new Window();
            win.Title = "Inherit the App";
            win.Show();
        }

        protected override void OnSessionEnding(SessionEndingCancelEventArgs args)
        {
            base.OnSessionEnding(args);

            MessageBoxResult result = MessageBox.Show("Do you want to save data?",
                                                      MainWindow.Title,
                                                      MessageBoxButton.YesNoCancel,
                                                      MessageBoxImage.Question,
                                                      MessageBoxResult.Yes);
            args.Cancel = (result == MessageBoxResult.Cancel);
        }
    }
}






출처 : 찰스 페졸드의 WPF