티스토리 뷰
이번에는 키보드의 방향키로 사각형을 이동시키는 실습을 해보겠습니다~
먼저 Dlg.h파일에 들어가 CRect m_rect와 m_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, 15000, 0, VK_UP); // 위쪽 방향키
RegisterHotKey(m_hWnd, 15001, 0, VK_RIGHT); // 오른쪽 방향키
RegisterHotKey(m_hWnd, 15002, 0, VK_DOWN); // 아래쪽 방향키
RegisterHotKey(m_hWnd, 15003, 0, 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(0, 0, 500,500));
CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}
|
cs |
InvalidateRect 함수를 써주지 않으면 이전 사각형의 잔상이 남기 때문에
써주셔야 합니다~:)
'프로그래밍 > MFC 프로그래밍' 카테고리의 다른 글
MFC 이미지 회전 시키기 (0) | 2020.01.10 |
---|---|
MFC 히스토그램 그리기 (8) | 2020.01.07 |
MFC CImage로 이미지 출력하기 (1) | 2020.01.02 |
MFC 마우스 드래그로 사각형,원 그리기 (1) | 2019.12.29 |
C++ MFC 프로그래밍 시작하기 (0) | 2019.12.29 |