본문 바로가기

프로그래밍/MFC

MFC

MFC - 시스템 키보드 메시지 MFC / 게임 프로그래밍

2010/05/11 15:44

복사 http://blog.naver.com/wlsspakss/105379642

윈도우 운영체에에서 alt 키와 f10 키는 조금 특별한 키로 분류 됩니다.

대부분의 윈도우 응용프로그램이 Alt 키나 f10 키를 누르면 메인 메뉴로 포커스가 이동합니다.

이와 같은 사용자 인터페이스의 일관성을 유지하려고,두 키에 대한 입력이 발생하면 WM_KEYDOWN

과 WM_KEYUP 메시지가 아니다 WM_SYSKEYDOWN 과 WM_SYSKEYUP 메시지가 발생합니다.

메시지의 이름이 달라졌을 뿐 개발자 입장에서 보면 크게 다를것은 없습니다.

그러나 메시지가 발생한 원인에서 차이가 있으므로 작성할 코드의 특징이 달라질 가능성이 큽니다.

 

다음은 WM_SYSKEYDOWN 메시지 핸들러 함수인 OnSysKeyDown()

함수를 뷰 클래스에 등록한 예제

 

void CWndProcView::OnKeyDown(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::OnKeyDown(nChar, nRepCnt, nFlags);
}

 

 

OnSysKeyDown() 함수의 인자는 OnKeyDown() 함수와 같습니다.

대부분의 키 입력에서 대해 OnKeyDown() 함수는 Alt키와 조합된 키 입력에 대해 호출됩니다.

 

HIBYTE() 와 LOBYTE() 매크로는 인자로 주어진 16비트 값에서

각각 상위/하위 바이트 를 잘라내는 매크로 입니다.

 

VK_SPACE는 토글 키가 아니므로 굳이 하위 바이트 정보를 확인할 이유가 없습니다.

그래서 상위 바이트 정보만 검사하는것이고 1번 비트가 1인지 비트 연산 하여 학인 합니다.

 

Caps Lock,Number Lock,Scroll Lock 키는 대표적인 토글 키로서

이들 키는 한 번씩 누를 때마다 상태가 On/Off 되는 특성이 잇습니다 .

 

이런 상태 정보는 GetKeyState()함수 가 반환한 결과의 하위 바이트에 들어 있습니다.

On/Off 상태는 앞서와 같이 1번 비트를 확인하면 됩니다. 사용이 빈번하므로 알아 두길 바랍니다.

 

WM_SYSCHAR 메시지는 Alt 키와 문자키 입력이 조합된 경우에 발생합니다.

이 포스트를..

덧글 쓰기 엮인글 쓰기

MFC- MFC 에서 WM_KEYDOWN(키보드 입력)을 이용한 윈도우 이동 및 설정 MFC / 게임 프로그래밍

2010/05/11 15:03

복사 http://blog.naver.com/wlsspakss/105377037

MFC 에서도 WM_KEYDOWN 을 사용 할수 있다.

 

 

소스를 통해서 알아보자

(SetWindowPos,SetWindowText 등은 기본 API 에서 와 역할이 같다 단지 CWnd 에서 사용하는것)

 

기초 MFC를 만든뒤에 클래스 뷰에서 View 클래스에 메시지 를 통해

WM_CREATE 인 OnCreate 와 WM_KEYDOWN인 OnKeyDown 을 만들어 두자

 

 

// WndProcView.h : CWndProcView 클래스의 인터페이스 부분 에서 CWnd 를 선언해두자

// 작업입니다.
public:
 CWnd m_wndChild;

 

 

그후 CWndProcView.cpp 의 OnCreate 에 윈도우를 생성하자

 

int CWndProcView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

 m_wndChild.Create(TEXT("STATIC"),TEXT("KeyMove"),
  WS_CHILD | WS_VISIBLE | WS_BORDER,CRect(100,100,200,200),this,1234);

 // TODO:  여기에 특수화된 작성 코드를 추가합니다.

 return 0;
}

 

 

그후 CWndProcView.cpp 안에 추가된 OnKeyDown 에서

키보드 입력을 통해서 윈도우를 조절할수 있다.

 

void CWndProcView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 CPoint ptChild;  //차일드 윈도우의 좌표.
 CRect Rect;   //차일드 윈도우의 좌표 및 크기

 m_wndChild.GetWindowRect(&Rect);

 ptChild.x = Rect.left;
 ptChild.y = Rect.top;

 //스크린 기준 좌표를 클라이언트 뷰 기준의 좌표로 환산한다.
 ScreenToClient(&ptChild);

 switch(nChar)
 {
 case VK_LEFT:
  ptChild.x -= 10;
 break;
 case VK_RIGHT:
  ptChild.x += 10;
 break;
 }


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

 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);
 }

 

 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

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

이 포스트를..

덧글 쓰기 엮인글 쓰기

MFC - MFC 에서의 WndProc(메세지 수동처리) 와 PreTranslateMessage(메세지 필터) MFC / 게임 프로그래밍

2010/05/11 12:54

복사 http://blog.naver.com/wlsspakss/105370780

MFC 에서도 WndProc 를 쓸수 있다.

메세지 맵이 있는 CMainFrame 클래스의 에서 WndProc 의 재정의인 WindowProc 가 그것이다.

 

 

 

 

 

 

 

또한 PreTranslateMessage 함수를 정의하면 윈도우 프로시저 함수나 메세지 핸들러 함수를

호춣기 전에 PreTranslateMessage 는 호출된다. WindowProc() 함수처럼

이 함수를 재정의하여 모든 왼도우 메시지를 처리하는 것도 가능하지만

굳이 이함수를 이용할 필요 없이 WindowProc() 를 이용하면 그만이다

 

만일 PreTranslateMessage 에서 WM_KEYDOWN 의 메시지를 처리하지 않도록 코드를 작성하면

WM_KEYDOWN은 호출되지 않는다. PreTranslateMessage()은

메시지 큐에서 메시지를 꺼낸직후

사용되기 떄문에 필터링이 가능한 메시지는 메시지 큐를 경유하는 메시지로 한정된다.

(SendMessage 함수는 바로 WindowProc() 를 호출하기 떄문에 메시지 큐를 경우 않한다)

 

PreTranslateMessage 함수의 주된 역할은 메시지 필터링이다.

즉 불필요한 메시지를 걸러 주는것이다.

 

 

 

MFC - MainFrm 에서 Message Map(메세지 처리등등) MFC / 게임 프로그래밍

2010/05/10 15:47

복사 http://blog.naver.com/wlsspakss/105317047

MFC 는 API 를 객체화 와 클래스,매크로 화를 해둔것이다

 

API 에서 switch,case 문등을 사용해서 WM_메시지를 이용한것을

MFC 에서는 MainFrm 에서 Message Map을 이용해서 사용한다.

 

 

1.MFC 솔루션 cpp중 Frame.cpp 에서 사용할 메시지를 이용한다.

 

 

클래스 뷰에서 frame 클래스를 선택하고 메시지 속성창을 선택한다.

그후 원하는 WM_메시지 에서 선택하면 된다.

 

 

만약 오른쪽 처럼 WM_CLOSE를 선택해 OnClose를선택하면

frame.cpp의 메시지 맵은 아래처럼 변한다.

 

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
 ON_WM_CREATE()
 ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
 ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
 ON_WM_CLOSE()  //ON_WM_CLOSE() 가 추가됬다.

 

 

또한 아래와 같은 함수가 생겨 그 안에다가 사용할 코드를 입력하면 된다.

void CMainFrame::OnClose()
{
 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

 CFrameWndEx::OnClose();
}

이 포스트를..

덧글 쓰기 엮인글 쓰기

MFC - CDocument 클래스 MFC / 게임 프로그래밍

2010/05/10 14:57

복사 http://blog.naver.com/wlsspakss/105314576

MFC가 제공하는 문서/뷰(Document/View) 를 만들어보자

아래 와 같이 설정으로 만들자

 

 

 

 

 

 

 

만들고 난뒤 CDocument 는 기본적으로 메모장 과 같은 역활을 한다

 

TIP -  시작할떄 실행되는 함수

DocumentDoc 의 OnNewDocumect() 함수는 만들어질때 반드시 한번씩 실행이 된다

 

(만약 AfxMessageBox(TEXT("새로운 빈 문서를 열었습니다.")); 를 입력해두면

CDocument  윈도우가 생성되면서 메시지 박스가 뜬다

 

 

 

TIP 2 - 정의되있는 함수

시작될때 실행되는 함수등이 정의되있는데 그것을 바꾸거나 볼수 있다

(클래스 뷰 ->Doc 클래스에서 재정의를 클릭하면 볼수 있다)

 

이 포스트를..

덧글 쓰기 엮인글 쓰기

MFC - Create로 자식윈도우 설정 MFC / 게임 프로그래밍

2010/05/10 14:39

복사 http://blog.naver.com/wlsspakss/105313822

1.기초 MFC 에서 m_wndChid.Create로 윈도우를 만들었던것을 이용하자

 

 

 

 

 

2. m_wndChid 처럼 CWnd m_button; 를 선언해주고

부모윈도우 설정 부분에 &m_wndChild 를 설정해두면 m_wndChild를 부모윈도우로 둔다

(좌표도 m_wndChild 윈도우창 기준을 한다)

 

virtual BOOL Create(

LPCTSTR lpszClassNmae,    //윈도우 클래스 이름

LPCTSTR lpszWindowNmae, //윈도우 텍스트

DWORD dwStyle,                 //윈도우 스타일

Const RECT& rect,              //윈도우 좌표

CWnd* pParentWnd,            //부모 윈도우

UINT nID,                           //윈도우 리소스 ID

CCreateContext* pContext = NULL  //생성 컨텍스트(Context)

 

 

Create

 

 

기초 MFC 와 Create(윈도우생성) MFC / 게임 프로그래밍

2010/05/10 14:25

복사 http://blog.naver.com/wlsspakss/105313119

열혈강의 MFC 책 참고

 

1.프로젝트를 생성할떄 MFC 응용 프로그램으로 생성한다.

 

 

 

2.여러가지 설정이 있지만 책에서 배우는 대로 설정을해두자

첫번재로 응용 프로그램 종류

 

 

2.두번쨰로 사용자 인터페이스 기능 설정

(확인메시지 상자가 뜨면 "예" 를 선택하자)

 

 

 

3.View 헤더 파일에 CWnd(윈도우)형 변수 m_wndChild 추가

 

 

 

4.클래스뷰 솔류션에서 View 헤더 파일에서 메시지를 선택한후 CREATE 를 OnCreate 로설정해두자

 

5.그후 View.cpp의 Create 부분에서 m_wndChild.Create로 자식윈도우를 생성해서 쓸수 있다.

 

 

 

Create 는 API 의 CreateWindow 와 비슷하다.

 

Create의 인자

 

virtual BOOL Create(

LPCTSTR lpszClassNmae,    //윈도우 클래스 이름

LPCTSTR lpszWindowNmae, //윈도우 텍스트

DWORD dwStyle,                 //윈도우 스타일

Const RECT& rect,              //윈도우 좌표

CWnd* pParentWnd,            //부모 윈도우

UINT nID,                           //윈도우 리소스 ID

CCreateContext* pContext = NULL  //생성 컨텍스트(Context)

[


'프로그래밍 > MFC' 카테고리의 다른 글

[MFC] CWinAppEx::CleanState()  (0) 2010.08.25
CView  (0) 2010.05.24
차일드 사용  (0) 2010.05.20
MFC에서 hWnd와 hinst 얻어오기  (0) 2010.05.20
마우스 이벤트  (0) 2010.05.20