티스토리 뷰

이번에는 키보드의 방향키로 사각형을 이동시키는 실습을 해보겠습니다~

 

먼저 Dlg.h파일에 들어가 CRect m_rectm_x_pos,m_y_pos 추가해줍니다.

m_x_pos,와 m_y_pos는 0으로 초기화 시켜줍니다.

 

1
2
3
4
5
6
7
8
9
// CKeyMoveDlg 대화 상자
class CKeyMoveDlg : public CDialogEx
{
private:
    CRect m_rect;
    int m_x_pos=0,m_y_pos=0;
public:
    CKeyMoveDlg(CWnd* pParent = nullptr);
    //생략..
cs

 

 

다음 Dlg.cpp파일로 가서

OnInitDialog() 부분에 RegisterHotKey를 이용해

아래와 같이 각 키에 임의의 메시지 번호를 재정의 해줍니다~!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BOOL CKeyMoveDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
 
    SetIcon(m_hIcon, TRUE);            
    SetIcon(m_hIcon, FALSE);        
 
    RegisterHotKey(m_hWnd, 150000, VK_UP); // 위쪽 방향키 
    RegisterHotKey(m_hWnd, 150010, VK_RIGHT); // 오른쪽 방향키
    RegisterHotKey(m_hWnd, 150020, VK_DOWN); // 아래쪽 방향키
    RegisterHotKey(m_hWnd, 150030, VK_LEFT); // 왼쪽 방향키
 
    return TRUE; 
}
cs

 

 

다음은 OnPaint로 가서 m_rect 점을 아래와 같이 설정해주고

사각형을 그립니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void CKeyMoveDlg::OnPaint()
{
 
    CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
    if (IsIconic())
    {
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
        // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1/ 2;
        int y = (rect.Height() - cyIcon + 1/ 2;
 
        // 아이콘을 그립니다.
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        m_rect.SetRect(50+m_x_pos, 50 + m_y_pos, 100+m_x_pos, 100 + m_y_pos);
        dc.Rectangle(m_rect);
        //CDialogEx::OnPaint();
    }
}
cs

 

 

그리고 클래스 마법사에 들어가

OnHotKey 함수를 추가해 주시고

아래와 같이 코드를 주가해줍니다~!

오른쪽 키를 누르면 15000메시지가 들어와 m_y_pos가 한번 누를때마다 1씩 감소하게 됩니다.

그러면 OnPaint에 정의 해주었던 m_rect좌표의 y좌표가 1씩 감소하게 되면서 사각형이 왼쪽으로 이동하게 됩니다.

나머지 3개의 방향키도 같은 원리로 사각형을 이동시킵니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void CKeyMoveDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
    CClientDC dc(this);
 
    if (nHotKeyId == 15000) {
        m_y_pos--;
    }
    else if (nHotKeyId == 15001) {
        m_x_pos++;
    }
    else if (nHotKeyId == 15002) {
        m_y_pos++;
    }
    else if (nHotKeyId == 15003) {
        m_x_pos--;
    }
        InvalidateRect(CRect(00500,500));
    CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}
cs

InvalidateRect 함수를 써주지 않으면 이전 사각형의 잔상이 남기 때문에

써주셔야 합니다~:)