본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 5

파트 1 챕터 5 의 본문 내용 관련 코드에서의 부가적 주석.

키입력[화살표 좌우] 시 자식 윈도우 를 이동시키는 코드

void CKeyMoveView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
       //여기부터 입력한 코드

CPoint ptChild;// 차일드 윈도우의 좌표
CRect Rect; //차일드 윈도우의 좌표 및 크기

//차일드 윈도우의 두 좌표 정보(스크린 기준)을 알아온다.
        //(두번 말하는 듯 하지만...자식 윈도우의 현재 위치를 다시 구하는 함수)
m_wndChild.GetWindowRect(&Rect);
ptChild.x = Rect.left;
ptChild.y = Rect.top;
//스크린 기준 좌표를 클라이언트 뷰 기준의 좌표로 환산한다.
ScreenToClient(&ptChild);// 두번 말하는 듯 하지만 상세히 풀어서 주석을 달면.... (이 줄에 중단점을 설정하고 
//작동 전과 작동 후로 보면 어떻게 작업 결과가 나오는지 알 수 있다.
//ptChild의 값을 스크린 기준 좌표(위에서 getwindowrect로 구한것)에서 뷰 기준의 좌표로 바꾸는 것.
//이를 하지 않으면 스크린 기준과 뷰 간의 거리만큼 자식 윈도우가 이동해버리면서 작동한다.

switch(nChar)
{
case VK_LEFT: //좌측 화살표를 누른 경우 위치를 10만큼 왼쪽으로 이동[감소] 시킨다.
ptChild.x -= 10;
break;
case VK_RIGHT: //우측 화살표를 누른 경우 위치를 10만큼 오른쪽으로 이동[증가] 시킨다.
ptChild.x += 10;
break;
}

//변경된 새 좌표로 차일드 윈도우를 이동시킨다.(위치를 다시 정한다.)
m_wndChild.SetWindowPos(&CWnd::wndTop, ptChild.x, ptChild.y, 0, 0, SWP_SHOWWINDOW | SWP_NOZORDER |SWP_NOSIZE);


//이 위까지. 가 입력한 코드
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

||||||||||||||||||||||||||||||||||||||||||||||||||
위의 코드의 메시지 헨들러인 OnChar는 아래와 같습니다.

void CKeyMoveView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString strText = TEXT("");
strText.Format(TEXT("%c"), nChar);

//입력한 키가 Enter, Back space, ESC키가 아니면
//해당 ASCII 문자로 차일드 윈도우 텍스트를 변경한다.
if(nChar != VK_RETURN && nChar != VK_BACK && nChar != VK_ESCAPE)
{
m_wndChild.SetWindowText(strText);
}

CView::OnChar(nChar, nRepCnt, nFlags);
}



오른쪽을 꾹 누른 후 의 스크린샷.




/////////////////

m_wndChild.SetWindowPos(&CWnd::wndTop, ptChild.x, ptChild.y, 0, 0, SWP_SHOWWINDOW | SWP_NOZORDER |SWP_NOSIZE); 

에서 뒤의 속성에 대해 나열하면

show winddow 는 윈도우가 화면에서 보이도록 하는 속성.
nozorder 은 윈도우의 z-order를 변경하지 않는 속성.
마지막으로 nosize는 윈도우의 크기를 변경하지 않는 속성 입니다. 

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

다음은 문자열을 입력받아 차일드 윈도우 안의 텍스트를 바꾸어 출력하는 코드입니다.

void CKeyMoveView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
//여기부터 작업코드

CString strText = TEXT("");
strText.Format(TEXT("%c"), nChar);

//조건문 사용 : 입력한 키가 엔터 백스페이스 esc가 아니면
//해당 ASCII 문자로 차일드 윈도우 텍스트를 변경한다.

if(nChar!= VK_RETURN && nChar!= VK_BACK && nChar!= VK_ESCAPE)
{
m_wndChild.SetWindowText(strText);
}
//여기까지 작업코드

CView::OnChar(nChar, nRepCnt, nFlags);
}
 
////실행시 화면

 



쉬프트 + 문자 도 잘 작동함을 알 수 있다.

|||||||||||||||||||||||||||||||||||||||


알트키와  F10키의 특수성.

해당 키들은 누르면 메인 메뉴로 포커스가 이동합니다..[대부분의 윈도우 내에서 실행되는 프로그램에 해당함]

그래서 일관성을 위하여 이 두 키에 대한 입력이 발생하면 WM_KEYDOWN과 UP이 아닌

WM_SYSKEYDOWN과 UP으로 메시지가 발생합니다.

그나저나 이 자릴 빌어 이 책을 디스하고싶은데


욕은 했으니 계속하면

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

지금 이 글은 1. 키입력에 따른 윈도우 위치 변경 , 2. 키입력에 따른 윈도우 내부의 문자 변경, 3. 키입력에 따른 특수키 입력시 메시지 출력 입니다.


여하튼 코드는 이렇습니다.


\\\\\\\\\\\\\\\\\\\\\\\\\

void CKeyMoveView::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString strMessage = TEXT(""); //메시지를 저장할 문자열 객체

//Space키에 대한 상태정보를 수집.
WORD wResult = ::GetKeyState(VK_SPACE);
BYTE byHigh = HIBYTE(wResult);
//상위 바이트의 1번 비트가 1이면 키가 눌려진 상태.
if(byHigh & 0x01)
{
strMessage += TEXT("Alt + Space, ");

//같은 방법으로 Caps lock 키의 상태를 검사.
wResult = ::GetKeyState(VK_CAPITAL);
//하위 바이트의 1번 비트가 1이면 토글키가 켜진 상태.
BYTE byLow = LOBYTE(wResult);
if(byLow & 0x01) strMessage += TEXT("CAPS LOCK ON");
else strMessage += TEXT("CAPS LOCK OFF");

AfxMessageBox(strMessage);
}

CView::OnSysKeyDown(nChar, nRepCnt, nFlags);
}

void CKeyMoveView::OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_RETURN)
AfxMessageBox(TEXT("Alt + Enter"));
else if(nChar == 's' || nChar == 'S')
AfxMessageBox(TEXT("Alt + S"));
else if(nChar == 'x' || nChar == 'X')
AfxMessageBox(TEXT("Alt + X"));

CView::OnSysChar(nChar, nRepCnt, nFlags);
}


\\\\\\\\\\\\\\\\\\\\\\\




마찬가지로 클래스 뷰 로 들어가서 KeyMoveView 의 속성 -> 메시지 목록 클릭 -> OnSysKeyDown 을 찾아서 우측에 추가 클릭 을 하신 후 

위의 코드대로  넣어주시면 됩니다.

코드가 끝난 후 실행하고나서

alt + space 를 키입력 해주면  캡스룩이 눌려있는지 여부가 같이 포함되어 메시지가 출력되고,

alt + enter 나 alt + s  , alt + x의 입력에 따른 메시지박스가 나타나게 됩니다.(코드에 나와있는대로 대소문자는 가리지 않습니다.)

 

아래는 출력 화면.



마지막으로 주석이 포함된 파일 업로드.



 



**공부에 도움이 되었다면 손가락 버튼을 클릭해주심 좋겠습니다.**