다양한 형식의 파일을 직접 로드하는 것을 지원하며, 로드하거나 생성한 이미지에 대한 DC 를 구해 직접 그리기가 쉬우며, DC에 출력할 내용을 외부 파일(BMP, JPEG, ..) 로 저장하는 메서드도 제공하므로, GDI 를 이용하여 그린 결과를 다양한 형식의 파일로 저장할 수 있다. 또한 CImage 클래스는 MFC 가 제공하는 ATL 클래스 중 하나로서, 내부적으로  COM 객체로 구현되어 있다. C++ 의 클래스가 논리적인 코드를 객체화한 개념이라면, COM 은 실행 바이너리 파일 단위(모듈단위) 로 객체화한 것이라고 할 수 있으며, 메서드가 반환하는 값은 HRESULT 형이다. FAILED() 매크로나 SUCCEEDED() 매크로를 이용해 오류를 확인할 수 있다. CImage::Load() 메서드는 이미지 파일을 로드하여 DIB 이미지를 생성한다. 유사한 함수로 LoadFromResource() 메서드가 있으며, 이 함수는 첫번째 인자로 응용 프로그램의 인스턴스 핸들을 주는 게 다르다.


Load() 사용법

void CImgOutDemoView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 // TODO: 여기에 메시지 처리기 코드를 추가합니다.
 // 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
CImage Image;
HRESULT hResult = Image.Load(_T("image1.jpg"));
Image.BitBlt(dc.m_hDC, 0,0);

}

LoadFromResouce() 사용법
/*
 CImage Image;
 Image.LoadFromResource(AfxGetInstanceHandle(), IDB_image1);
 Image.BitBlt(dc.m_hDC, 0,0);
*/

void CImgOutDemoView::OnPaint()
{
 CPaintDC dc(this); // device context for painting

 CImage Image;
 Image.LoadFromResource(AfxGetInstanceHandle(), IDB_image1);
 //비트맵인것을 유념할것

 //비트맵 이미지에 대한 핸들을 가져와서 DC를 생성한다.
 CDC* pDC = CDC::FromHandle(Image.GetDC());
 // 이 이미지 DC에 문자열을 출력한다.
 pDC->SetBkMode(TRANSPARENT); //배경을 투명하게 한다.
 pDC->TextOut(200,30,_T("CImage Sample!"));
 Image.ReleaseDC(); //GetDC 와 쌍으로 붙어다님.

 Image.BitBlt(dc.m_hDC, 0,0);

}



'Windows > MFC' 카테고리의 다른 글

GDI 고급  (0) 2011.11.15
윈도우 화면 캡쳐하기  (0) 2011.11.14
고급 이미지 출력 함수 ( TransparentBlt() , AlphaBlend() )  (0) 2011.11.14
비트맵과 이미지 처리  (0) 2011.11.14
DrawText() 함수 예제 및 연습  (0) 2011.11.13
다음은 매우 중요한 TransparentBlt() , AlphaBlend()  함수들의 사용법이다.
투명처리를 해준다. 인터페이스 개발시에 자주 쓰인다.

TransparentBlt()  사용법

dc.TransparentBlt(20,100, bmpInfo.bmWidth * 2 , bmpInfo.bmHeight * 2, &MemDC, 0,0, bmpInfo.bmWidth, bmpInfo.bmHeight, RGB(0,0,0)); //마지막 인자는 투명 처리될 색상의 RGB 값이다.


AlphaBlend() 사용법

BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER; //원본이미지와 대상 이미지를 서로 섞는다는 의미.
bf.BlendFlags = 0; //항상 반드시 0 이어야 한다.
bf.SourceConstantAlpha = 50; //0은 투명 255는 불투명

bf.AlphaFormat = 0; //이 값은 항상 0이거나 AC_SRC_ALPHA 가 되어야 한다.

//AC_SRC_ALPHA 가 되는 경우는 원본 비트맵이 24비트 이하의 비트맵이 아닌 각 픽셀에 대한 알파 채널을 갖는 진정한 32비트 비트맵인 경우만 해당한다. 이런 경우 복잡한 연산 대신 알파 채널을 이용한 별도의 연산으로 이미지를 혼합하게 되며, 이미지 전체의 투명도를 적용하여 출력하지 않고 일부는 불투명하게,일부는 투명하게 출력할 수 있다.
보통 바탕화면에 아이콘이 이렇게 적용되어 있다. 배경화면과 아이콘이 섞여서 출력되어 있는..

//반투명 이미지를 출력한다.
dc.AlphaBlend(20,100, bmpInfo.bmWidth*2, bmpInfo.bmHeight*2, &MemDC, 0,0, bmpInfo.bmWidth, bmpInfo.bmHeight, bf);


블랜드연산에 대해서는 나중에 알아보자. 중요한 것은 AlphaBlend() 함수와 BitBlt 함수의 내부 연산 속도는 비교할 수 없을 만큼 차이가 난다는 것이며, AlphaBlend() 함수는 내부적으로 연산 공식에 의해 느려질 수 밖에 없다. 그래서 윈도우 비스타가 XP보다 상대적으로 느려질 수 밖에 없는 이유이다.

'Windows > MFC' 카테고리의 다른 글

윈도우 화면 캡쳐하기  (0) 2011.11.14
CImage 클래스  (0) 2011.11.14
비트맵과 이미지 처리  (0) 2011.11.14
DrawText() 함수 예제 및 연습  (0) 2011.11.13
직접 버튼 그리기  (0) 2011.11.13

다음은 비트맵 파일을 불러와서 비트맵을 확대해서 보여주는 예제다.


void CBmpDisplayView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 // TODO: 여기에 메시지 처리기 코드를 추가합니다.
 // 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.


 CDC MemDC;
 BITMAP bmpInfo;
 MemDC.CreateCompatibleDC(&dc); //화면 DC 와 호환되는 MemDC 를 생성한다.
 
 CBitmap bmp; //비트맵 이미지를 가져오기 위해 객체를 생성하고
 bmp.LoadBitmap(IDB_Test_Image); //IDB_Test_Image에 해당하는 비트맵을 가져온다.
 bmp.GetBitmap(&bmpInfo); //IDB_Test_Image 에 해당하는 비트맵에 대한 정보를 bmpInfo에다 넣는다. 
 
 CBitmap *pOldBmp = MemDC.SelectObject(&bmp); //메모리 DC 에다가 IDB_Test_Image에 해당하는 비트맵을 넣는다
 dc.BitBlt(100,100, 500, 500, &MemDC,300,300, SRCCOPY);//MemDC 에 있는 비트맵을 화면 DC로 전송한다.
 //메모리DC에 있는 비트맵의 300,300 위치에서 가져와서 화면 100,100 좌표에 500,500만큼 보여라.
 //레스터 연산에 자주 쓰이는 것에는 NOTSCRCOPY(반전), DSTINVERT(반전), SRCAND(원본과 대상을 AND연산)
 //원본 : dc.BitBlt(0,0,bmpInfo.bmWidth, bmpInfo.bmHeight, ~~); 나머지는 같다.


 dc.StretchBlt(100,100,250*4,300*4, &MemDC, 300,300, 300,300, SRCCOPY);
 //3,4번째가 확대를 지정하고 나머지는 위와 같다.
 MemDC.SelectObject(pOldBmp);

 //이것들은 비트맵 이미지를 다룬 것이다. 다른 이미지 포멧들은 CImage 클래스를 이용해야한다.
}

'Windows > MFC' 카테고리의 다른 글

CImage 클래스  (0) 2011.11.14
고급 이미지 출력 함수 ( TransparentBlt() , AlphaBlend() )  (0) 2011.11.14
DrawText() 함수 예제 및 연습  (0) 2011.11.13
직접 버튼 그리기  (0) 2011.11.13
글꼴과 문자열 다루기  (0) 2011.11.13


void CDrawTextDemoView::OnPaint()
{
 CPaintDC dc(this); // device context for painting

 CRect Rect(10,10,200,50);
 dc.FillSolidRect(&Rect, RGB(192,192,192));
//테투리없는 사각형을 그리고 RGB값으로 내부를 칠함.

 CFont Font;
 LOGFONT lf;
 ::ZeroMemory(&lf, sizeof(lf));

 lf.lfHeight = 20;
 wsprintf(lf.lfFaceName , _T("%s"), _T("Arial"));
 lf.lfItalic = true;
 lf.lfUnderline = true;
 Font.CreateFontIndirect(&lf);
 CFont* pOldFont = dc.SelectObject(&Font);
 
 //폰트 색깔 바꾸고 실제출력
 dc.SetTextColor(RGB(255,0,0));

 dc.DrawText(_T("Text Button"), &Rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER );

 dc.TextOut(50,100,_T("\t이것은 실습을 위한 \n문자열입니다."));

 int nTabStop = 100;

 dc.TabbedTextOut(50,150, _T("\t이것은 실습을 위한 \n문자열입니다."),1, &nTabStop,20);

 dc.DrawText( _T("\t이것은 실습을 위한 \n문자열입니다."), CRect(50,220,300,200), DT_SINGLELINE | DT_CENTER | DT_VCENTER  );
 
 dc.SelectObject(pOldFont);
}

'Windows > MFC' 카테고리의 다른 글

고급 이미지 출력 함수 ( TransparentBlt() , AlphaBlend() )  (0) 2011.11.14
비트맵과 이미지 처리  (0) 2011.11.14
직접 버튼 그리기  (0) 2011.11.13
글꼴과 문자열 다루기  (0) 2011.11.13
키보드 입력  (0) 2011.11.12


void CVirtualButtonView::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
 if(m_BtnRect.PtInRect(point)) //버튼이 위치한 영역을 클릭했는가?
 {
  m_bClicked = !m_bClicked; //flag 토글
  RedrawWindow(&m_BtnRect); //윈도우 지정된 범위만 다시그림, 즉 WM_PAINT 메세지 발생
 }
 CView::OnLButtonDown(nFlags, point);
}

void CVirtualButtonView::OnLButtonUp(UINT nFlags, CPoint point)
{
 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
 if(m_bClicked) //버튼이 위치한 영역인가?
 {
  m_bClicked=!m_bClicked;
  RedrawWindow(&m_BtnRect);

 }

 if(m_BtnRect.PtInRect(point))
 {
  AfxMessageBox(_T("버튼을 클릭했다."));
 }
 CView::OnLButtonUp(nFlags, point);
}


void CVirtualButtonView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 // TODO: 여기에 메시지 처리기 코드를 추가합니다.
 // 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.

 CRect Rect(m_BtnRect);
 Rect += CRect(1,1,1,1);
 dc.Rectangle(&Rect);
  // 주어진 좌표와 색상으로 테두리 없는 사각형을 그리고 내부를 칠한다. 자주쓰임
 dc.FillSolidRect(&m_BtnRect, ::GetSysColor(COLOR_BTNFACE));
 //GetSysColor() 함수는 인자에 해당하는 시스템 색상을 반환하며, 윈도우 운영체제에 설정된 값이다.

 if(m_bClicked)
 {
  //테두리가 잇는 사각형을 그리며, 왼쪽/위 선의 색상과 오른쪽/아래 선의 색상을 각기 다른 색으로 명시가 가능
  dc.Draw3dRect(m_BtnRect, ::GetSysColor(COLOR_3DSHADOW),
         ::GetSysColor(COLOR_3DLIGHT));
  
 
 }else
 {
  dc.Draw3dRect(m_BtnRect, ::GetSysColor(COLOR_3DLIGHT),
   ::GetSysColor(COLOR_3DSHADOW));
 }

 dc.SetBkColor(::GetSysColor(COLOR_BTNFACE));
 dc.SetTextColor(::GetSysColor(COLOR_BTNTEXT));

 if(m_bClicked)
 {
  CRect Rect = m_BtnRect;
  Rect += CRect(0,0,2,2);
  //DrawText() 함수는 다양한 옵션으로 문자열을 쓸 수 있다.
  dc.DrawText(_T("Test Button"), &Rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
 }else
 {
  dc.DrawText(_T("Test Button"), &m_BtnRect,  DT_CENTER | DT_SINGLELINE | DT_VCENTER);
 }
}

'Windows > MFC' 카테고리의 다른 글

비트맵과 이미지 처리  (0) 2011.11.14
DrawText() 함수 예제 및 연습  (0) 2011.11.13
글꼴과 문자열 다루기  (0) 2011.11.13
키보드 입력  (0) 2011.11.12
MFC 코드의 흐름  (1) 2011.11.12


void CFontDemoView::OnPaint()
{
 CPaintDC dc(this); // device context for painting

 CFont Font;
 CFont* pOldFont;

 LOGFONT lf;
 ::ZeroMemory(&lf , sizeof(lf));
 wsprintf(lf.lfFaceName, _T("%s"), _T("Arial")); //폰트이름은 Arial
 lf.lfHeight = 30; //사이즈는 20
 Font.CreateFontIndirect(&lf); //LOGFONT 구조체 정보를 기반으로 CFont 클래스 객체를 생성함.
//보통 이렇게 LOGFONT 구조체에 크기와 이름값만 명시하고 쓴다. 

 pOldFont = dc.SelectObject(&Font);
 dc.TextOut(10,10, _T("this is text test with logfont"));
 dc.SelectObject(pOldFont);
 Font.DeleteObject(); //폰트객체삭제
 
 // TODO: 여기에 메시지 처리기 코드를 추가합니다.
 // 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
}


경우에 따라 어떤 글골이 시스템에 설치되어있는지 확인할 때가 있는데, 이때는 ::EnumFonts() 함수나
::EnumFontFamiliesEx() 함수를 이용하면 된다.
보통 문자열 출력에는 TextOut () 함수를 많이 쓰는데, 치명적인 약점은 바로 탭 문자(\t) 가 안된다는 것이다.
이것은 텍스트 편집기를 개발하는 상황에는 굉장히 치명적이다. 이 경우에는 TabbedTextOut() 함수를 사용한다.

int nTabStop = 40; //탭 사이즈가 40임을 명시
dc.TabbedTextOut(20,70,_T("\tText String"), 1, &nTabStop, 20); //직접  \t 를 사용해서 탭출력, 반환값은 CSize, 주로 좌표보다는 폭과 높이를 명시하는 경우에 사용함. (cx,cy) , 이것은 에디트 컨트롤을 직접 구현할 때 중요하다. 아니면 신텍스 컬러링 편집기 구현할때나 쓰인다.
dc.SelectObject(pOldFont);

'Windows > MFC' 카테고리의 다른 글

DrawText() 함수 예제 및 연습  (0) 2011.11.13
직접 버튼 그리기  (0) 2011.11.13
키보드 입력  (0) 2011.11.12
MFC 코드의 흐름  (1) 2011.11.12
메시지맵 (MessageMap)  (0) 2011.11.12

대표적인 키보드 메시지로는 WM_KEYDOWN , WM_KEYUP , WM_CHAR 가 있으며,

Alt키와 f10 이 두키를 누르면 WM_KEYDOWN 이 발생하지 않고 WM_SYSKEYDOWN,UP 이 발생

만약 WM_KEYDOWN 메시지의 파라미터에 아스키 코드의 문자가 입력되면 메시지 루프의 TranslateMessage() 함수가
 
WM_KEYDOWN 메시지를 다시 WM_CHAR 메시지로 전환하여 전송하기도 한다.

다음은 키보드 방향키를 누르면 자식 윈도우가 움직이는 예제다.

void CKeyMoveView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//nChar : 어떤 키를 눌렀는지에 대한 정보가 들어잇다. WinUser.h 파일에 정의
//nRepCnt : 반복 횟수를 의미, 보통 한 번누루므로 1
//nFlags : 키보드에 대한 상세한 상태 정보를 담고 있다. 비트 단위로 살펴봐야 한다. 확장키값!

 CRect rect; //차일드 윈도우의 좌표 및 크기
 CPoint ptChild; //차일드 윈도우의 좌표
 m_wndChild.GetWindowRect(&rect); //자식 윈도우 크기를 가져와서 rect에 저장
 ptChild.x = rect.left; // 자식 윈도우 x좌표 대입
 ptChild.y = rect.top; // 자식 윈도우 y좌표 대입

 ScreenToClient(&ptChild);

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

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

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

다음은 엔터나 ESC, 백스페이스바를 제외한 문자열을 입력햇을 때 윈도우에 해당 문자열이 나오는 예제다.

//ESC,엔터,백스페이스바도 이상하게 문자열로 취급되므로 제외시켜준다.

void CKeyMoveView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 CString m_strText;
 m_strText.Format(_T("%c"), nChar);
 if(nChar != VK_BACK && nChar != VK_RETURN && VK_ESCAPE)
 {
  m_wndChild.SetWindowText(m_strText);
 }

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



시스템 키보드 메시지
Alt 키와 f10 키를 눌렀을 때에 WM_SYSKETDOWN , UP 메시지가 나온다.
다음은 alt 키를 누른 상태에서 스페이스바를 눌렀을 때를 테스트한다.
GetKeyState() 함수가 반환한 16비트 값에서 상위 바이트는 키를 누른 상태인지에 대한 정보가
들어잇으며 하위 바이트에는 토글에 대한 정보가 들어 있다.
스페이스바는 토글 키가 아니니 굳이 하위 바이트 정보를 확인할 필요가 없다.
밑에와 같은 토글키는 GetKeyState() 함수가 반환한 결과의 하위 바이트를 검사하며,
On/Off 상태는 1번 비트를 확인해서 1이면 누른 상태이다. 자주 사용하므로 꼭 알아두자.

void CKeyMoveView::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 CString m_StrMessage = _T("");

 WORD wResult = ::GetKeyState(VK_SPACE); //키의 상태를 저장한다
 
 BYTE byHigh = HIBYTE(wResult); //상위 바이트를 떼어내서 확인한다.

 if(byHigh & 0x01) // 상위 바이트의 1번 비트가 1이면 키가 눌린 상태
 {
  m_StrMessage += _T("Alt + space");
  
  //같은 방법으로 caps lock 키 조사
  wResult = ::GetKeyState(VK_CAPITAL);
  BYTE byLow = LOBYTE(wResult);
  if(byLow & 0x01 )
   m_StrMessage += _T(" + Caps Lock On");
  else
   m_StrMessage += _T(" + Caps Lock Off");
  
  AfxMessageBox(m_StrMessage);
}  

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


WM_CHAR 메시지와 마찬가지로 시스템 키보드 메시지에는 WM_SYSCHAR 메시지가 있으며,
이것 역시 translateMessage() 함수가 생성한다. 이 메시지는 alt 키와 문자키 입력이 조합된 경우에
발생한다. 즉 alt + s 와 같은 조합키를 눌렀을 때 발생하는 메시지이다.

'Windows > MFC' 카테고리의 다른 글

직접 버튼 그리기  (0) 2011.11.13
글꼴과 문자열 다루기  (0) 2011.11.13
MFC 코드의 흐름  (1) 2011.11.12
메시지맵 (MessageMap)  (0) 2011.11.12
CFrameWnd 클래스  (0) 2011.11.12
MFC 응용 프로그램의 시작

Function: CSdiSeqApp::CSdiSeqApp(void),
Function: CSdiSeqApp::InitInstance(void),
Function: CSdiSeqDoc::CSdiSeqDoc(void),
Function: CMainFrame::CMainFrame(void),
Function: CMainFrame::LoadFrame(unsigned int, unsigned long, CWnd *, CCreateContext *),
Function: CMainFrame::PreCreateWindow(tagCREATESTRUCTW &),
Function: CMainFrame::PreCreateWindow(tagCREATESTRUCTW &), //아직 메인프레임 윈도우 생성 안되었다. 
Function: CMainFrame::OnCreate()
Function: CMainFrame::OnCreateClient(tagCREATESTRUCTW *, CCreateContext *),
Function: CSdiSeqView::CSdiSeqView(void),
Function: CSdiSeqView::Create(const wchar_t *, const wchar_t *, unsigned long, const tagRECT &, CWnd *, unsigned int, CCreateContext *),
Function: CSdiSeqView::PreCreateWindow(tagCREATESTRUCTW &),
Function: CSdiSeqView::OnCreate(tagCREATESTRUCTW *),
Function: CSdiSeqView::OnShowWindow(int, unsigned int), //눈에 보이는 윈도우가 생성된다.
CFrameWnd::OnCreateClient() - Return
CMainFrame::OnCreate() - Return
Function: CSdiSeqDoc::OnNewDocument(void),
Function: CSdiSeqView::OnInitialUpdate(void), // 문서,뷰에서 매우 중요, 화면을 깨끗이 정리하고 적합한 내용을 출력
Function: CMainFrame::OnActivateApp(int, unsigned long),
Function: CMainFrame::OnActivate(unsigned int, CWnd *, int),
Function: CMainFrame::OnShowWindow(int, unsigned int),
Function: CSdiSeqApp::Run(void),

MFC 응용 프로그램의 종료


CWinApp::Run()
Function: CMainFrame::OnClose(void), // DestroyWindow() 함수를 호출 후 -> WM_DESTROY
Function: CMainFrame::OnShowWindow(int, unsigned int),
Function: CMainFrame::OnActivate(unsigned int, CWnd *, int),
Function: CMainFrame::OnActivateApp(int, unsigned long),
Function: CMainFrame::DestroyWindow(void), //자식 윈도우인 클라이언트 뷰윈도우를 먼저 파괴시킨다.
Function: CMainFrame::OnDestroy(void),
Function: CSdiSeqView::OnDestroy(void),
//자식 윈도우를 먼저 소멸한다.
Function: CSdiSeqView::PostNcDestroy(void), //PostNcDestroy() - 반환하면 윈도우 객체 메모리 소멸
Function: CSdiSeqView::~CSdiSeqView(void), //부모 윈도우도 소멸되기 시작한다.
Function: CMainFrame::OnNcDestroy(void), //모든 자식이 죽고 화면에 보이는 메인 프레임도 소멸
Function: CMainFrame::PostNcDestroy(void),
Function: CMainFrame::~CMainFrame(void),
CFrameWnd::OnNcDestroy() - Return
Function: CSdiSeqDoc::~CSdiSeqDoc(), // CView와 연결된 CDocument도 소멸
CMainFrame::OnClose() - Return // 메인 프레임 윈도우의 WM_CLOSE 메시지 처리 끝
Function: CSdiSeqApp::ExitInstance(void), // App객체가 소멸되기 전에 필요한 정리 수행
Function: CSdiSeqApp::Run(void) - Return, // 위 함수가 반환하면 메인 메시지 루프종료 -> 프로그램종료

'Windows > MFC' 카테고리의 다른 글

직접 버튼 그리기  (0) 2011.11.13
글꼴과 문자열 다루기  (0) 2011.11.13
키보드 입력  (0) 2011.11.12
메시지맵 (MessageMap)  (0) 2011.11.12
CFrameWnd 클래스  (0) 2011.11.12

메시지 맵은 Win32 APi 윈도우 프로시저 함수에서 볼 수 있는 switch case 문을 대체 하는 것이다.
메시지 맵이란 특정 메시지가 발생했을 때 어떤 함수를 호출해야 하는지 명시하는 매크로의 집합체이다.
다음은 CMainFrame 클래스에 대한 메시지 맵이다.

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
 ON_WM_CREATE()
END_MESSAGE_MAP()

MFC  메세지 맵은 BEGIN_MESSAGE_MAP 매크로와 END_MESSAGE_MAP() 매크로를 이용하여 시작과 끝을 명시한다.
ON_WM_CREATE() 는 WM_CREATE 메시지 핸들러 함수를 등록할 경우 추가되는 매크로이다.


'Windows > MFC' 카테고리의 다른 글

직접 버튼 그리기  (0) 2011.11.13
글꼴과 문자열 다루기  (0) 2011.11.13
키보드 입력  (0) 2011.11.12
MFC 코드의 흐름  (1) 2011.11.12
CFrameWnd 클래스  (0) 2011.11.12
SDI 문서 / 뷰 구조를 갖는 MFC 응용 프로그램을 개발할 때 최상위 프레임 윈도우에 해당하는 클래스는 CMainFrame 클래스이며 이 클래스는 CFrameWnd 클래스를 상속받아 만들어진다. 단 MDI 에서는 CMDIFrameWnd 클래스로 대체된다.
CObject -> CCmdTarget -> CWnd -> CFrameWnd

CFrameWnd 클래스는 프레임이 있는 윈도우가 가져야할 기본 기능을 정의한 클래스라 할 수 있고, 부모 윈도우가 없는 최상위가 될 수 있는 윈도우이며, 다양한 형식의 자식 윈도우를 가질 수 있다.

프레임 윈도우의 특징은 컨트롤 윈도우와의 상관관계인데, CToolBar 클래스같은 컨트롤 윈도우가 프레임 윈도우에 도킹이 되는 것을 말한다. 이것들은 CMainFrame 클래스의 OnCreate() 함수에서 생성하는 코드를 확인할 수 있다.

'Windows > MFC' 카테고리의 다른 글

직접 버튼 그리기  (0) 2011.11.13
글꼴과 문자열 다루기  (0) 2011.11.13
키보드 입력  (0) 2011.11.12
MFC 코드의 흐름  (1) 2011.11.12
메시지맵 (MessageMap)  (0) 2011.11.12

+ Recent posts