마우스 이벤트는 속성창에

이벤트 영역에 있지 않다.


직접 손으로 타이핑 해서 구현해야한다고 한다.

일단 이벤트핸들러를 등록한다.

폼 클래스 내에 넣으면 된다.

전 Form1_Load 이벤트 안에 넣었습니다.


this.MouseWheel += new MouseEventHandler(BaseForm_MouseWheel);



그리고 중요한 휠 이벤트 내용

휠은 e.Delta 변수로

휠이 위로 올라갔는지 아래로 내려갔는지 알 수 있습니다.

e.Delta 가 양수면 아래로

음수면 위로 올라간것이며

얼마나 올라갔는지를 알려면

e.Delta값을 나눠서 사용하면 됩니다.

ex) e.Delta/120


private void BaseForm_MouseWheel(object sender, MouseEventArgs e)
{
    bool IsReduce = true;

    // 휠을 아래로 내리면
    // 축소(Reduce)가 아닌 확대(Expand) 이므로 false 대입
    if (e.Delta < 0)
    {
        IsReduce = false;
    }

    /* 셀의 크기가 셀의 한계 범위 안에 든다면
    * ->  MinCellSize < 셀 사이즈 < MaxCellSize
    * ResizeCellSize함수는 셀의 크기를 1씩 증가 혹은 감소 하고
    * true를 리턴한다.
    * 하지만, 셀 사이즈가 한계 크기와 같다면
    * 셀 크기에는 변동이 없고 false를 리턴
    * 리턴값이 true라면 화면을 다시 그린다.
    */
    if (MainBoard.ResizeCellSize(IsReduce) == true)
    {
        // 가로, 세로 셀의 개수를 다시 계산
        MainBoard.CalcCellNum();
        // 메인보드 다시 그림
        this.Invalidate();
    }
}

Posted by 투명테잎

주제 : C#으로 구현하는 A Star Alogirhtm

개발환경 : Microsoft Visual Studio 2010

사용언어 : C#


2일차 요약 : 폼 위에 격자줄을 만들고 마우스 휠로 크기를 조정할 수 있게 했다.


2일차 작업 내용


- Board 클래스 완성

- Board 클래스는 폼 위에 보드를 생성하고

보드를 격자줄로 나누고 그리는 클래스이다.

- 격자줄은 검은 바탕위에 가장 우선적으로 그려야 할 선이다.

- 파일명 : Board.cs


- 폼 클래스에 Load, MouseWheel, Paint 이벤트 추가

- MouseWheel 이벤트는 이상하게도 속성창에 있지 않다.

MouseWheel 이벤트는 직접 타이핑해서 추가해야한다고 한다.

- Load 이벤트에는 프로그램이 시작되면 기본적으로 설정해줘야 할 것들이 들어간다.

이 이벤트에 추가할 것들이 많아보인다.


현재 Loade 이벤트 코드 상황

/*
* 화면이 로드되기 전에 프로그램에 필요한
* 기본적인 것들을 초기화한다.
*/
private void BaseForm_Load(object sender, EventArgs e)
{
    // esc 키를 누르면 프로그램 종료
    Application.AddMessageFilter(new ExitProgramClass());

    // 화면 바탕 색을 검은 색으로 바꿈
    this.BackColor = Color.Black;

    // 화면크기를 최대크기로 바꿈
    this.Width = Screen.PrimaryScreen.Bounds.Width;
    this.Height = Screen.PrimaryScreen.Bounds.Height;
    this.Location = new Point(0, 0);

    // 메인보드를 모니터 가로, 세로 길이를 매개변수로 넘겨 생성
    MainBoard = new Board(Width, Height);

    // 마우스 휠 이벤트
    this.MouseWheel += new MouseEventHandler(BaseForm_MouseWheel);
}



-Paint 이벤트는 폼을 그리는 이벤트이다.

일단은 Paint안에서 격자줄을 그리게 했지만

후에 격자줄을 그리고, AStar 알고리즘을 진행하며 Paint 이벤트가 발생할 때마다

전체를 그린다면 비용낭비가 발생할 수 있을 것 같다.

하지만, 추측컨데 Invalidate() 함수에 매개변수로 다시 그릴 부분을 잘 넘겨주면 효율적으로 그릴 수 있을 거 같다.

아니라면 다시 작성해야한다.


다음 할일

- 기본적인 준비는 끝났으며

이제 셀들을 어떤 자료 구조를 사용하여 저장한 후,

OpenNode와 CloseNode를 어떻게 만들것인가를 생각해야하며

마우스 클릭을 통한 시작점과 도착점, 장애물을 생성하고 위치를 변경하는 방법에 대해 생각해보자.



실행화면

- 마우스휠로 셀의 크기를 조정할 수 있다.

처음 - 최소사이즈 - 최대사이즈





Posted by 투명테잎

여기서는 특정 키를 누르면 프로그램이 종료되는 예제를 쓰겠습니다.


프로젝트 파일 안에

클래스 파일을 생성하고 아래의 코드를 붙여넣어 클래스 파일을 만듭니다.


/*
 * FileName : ExitProgramUsingESC.cs
 * esc 키를 누르면 프로그램이 종료됨
 * Application 레벨에서 메세지를 처리
 */

using System.Windows.Forms;

public class ExitProgramClass : IMessageFilter
{
    private const int WM_KEYDOWN = 0x0100; // 키보드 다운
    private const int VK_ESCAPE = 0x1B; // esc 키
    public bool PreFilterMessage(ref Message m)
    {
        // 키보드가 다운 되었고 esc가 눌렸다면
        if (m.Msg == WM_KEYDOWN
            && m.wParam.ToInt32() == VK_ESCAPE)
        {
            Application.Exit(); // 프로그램 종료
            return true;
        }
        return false;
    }
}


그리고 폼의 생성자 부분에 다음과 같이 코드를 집어넣으면 됩니다.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AStarAlgorithm
{
    public partial class BaseForm : Form
    {
        public BaseForm()
        {
            InitializeComponent();

            // esc 키를 누르면 프로그램 종료
            Application.AddMessageFilter(new ExitProgramClass());

        }
    }
}



C#에서는 WM_KEYDOWN, WM_MOUSEDOWN 과 같은

메세지에 대한 값이 정의 되있지 않으므로 사용자가 직접

정의해서 사용해야합니다.


위의 예제를 응용하면

프로그램 전체에 대해서

어플리케이션 레벨의

메세지 전체를 처리할 수 있습니다.


키보드 입력값은 m.Msg 의 wParam을 비교한다!

Posted by 투명테잎