본문 바로가기

mfc

Dialog 내부에 FormView 추가하기 Dialog를 생성하고 내부의 화면만 계속 변경하고 싶을 때가 있습니다.예를 들자면 Visual Studio에서 제공하는 환경설정 메뉴같은 경우입니다.좌측의 트리 형태의 메뉴를 선택하면 우측이 변경되는 모습을 확인할 수 있습니다. 이것을 구현하기 위해서 FormView 활용하는 방법을 고려할 수 있습니다.FormView는 Dialog과 유사하게 다른 컨트롤을 추가해서 사용할 수 있는 View입니다.필요에 따라 FormView를 작성하고 교체하는 방법을 사용하면 됩니다.먼저 MFC 프로젝트를 생성합니다.Dialog based로 변경하고 그 외에 필요한 설정을 합니다.나머지는 기본 설정으로 그냥 두고 생성하도록 하겠습니다.기본 Dialog에 버튼 2개를 추가합니다.이 버튼을 누르면 각각 다른 FormView.. 더보기
SDI(or MDI)에서 View를 포함하는 Dialog 띄울 때 문제점 SDI 형식에서 View를 포함하는 Dialog를 생성하면 문제점이 발생합니다.먼저 메뉴를 클릭하면 다이얼로그가 DoModal()을 통해서 생성이 됩니다.DoModal()로 생성된 다이얼로그 내부에서 CView나 CView를 상속한 뷰를 생성해서 포함시킵니다.다이얼로그 내부에서 뷰를 컨트롤처럼 추가하는 것입니다.이렇게 했을 때 다이얼로그의 내부 뷰 영역을 마우스로 클릭하면 문제가 발생합니다. ASSERT(pParentFrame == pDesktopWnd || pDesktopWnd->IsChild(pParentFrame)); 바로 위와같은 ASSERT문에 걸리게 됩니다.문제의 원인은 다음과 같습니다.SDI 형태는 MainFrame이 있고 그 안에 View가 들어갑니다.MainFrame에 바로 붙는 View.. 더보기
MFC 사용자 정의 메시지 처리 WM_CREATE, WM_PAINT 등의 메시지는 이미 정의되어 있는 윈도우 메시지입니다.WM_ 접두어는 윈도우 메시지를 위해서 사용됩니다.이런 기본적으로 정의된 메시지 외에 사용자가 정의한 메시지를 처리할 경우도 존재합니다.UI 스레드를 추가해서 스레드간 통신에도 사용할 수 있습니다.간단한 MFC 프로젝트를 생성합니다.Dialog based로 변경하고 Finish를 눌러서 생성합니다.Dlg.cpp(앞에 프로젝트명이 붙습니다.) 파일에 Message Map이 정의되어 있습니다. BEGIN_MESSAGE_MAP(CUMTestDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() END_MESSAGE_MAP() 메시지와 해당 메시지를 처.. 더보기
SDI Document/View 구조 제거하기 MFC의 SDI(Single Document Interface)는 기본적으로 Document/View 구조를 지원합니다.프로젝트를 생성할 때 몇 번의 클릭으로 간단하게 Document/View 기반으로 생성할 수 있습니다.자동으로 생성되는 Doc/View 구조가 필요하지 않을 경우도 발생합니다.SDI에서 Doc/View 구조를 제거하는 방법입니다.먼저 프로젝트를 생성합니다.일단 Document/View architecture support는 그대로 둡니다. Doc/View가 설정된 프로젝트에서 구조를 제거하기 위해서 입니다.Compound Document Support, Document Template Properties는 기본 설정을 사용합니다.그리고 Database Support도 기본 설정으로 둡니.. 더보기
CString 토큰(Token)으로 분리시키기(AfxExtractSubString) C/C++에는 기본적으로 C의 strtok을 통해서 토큰으로 문자열 분리가 가능합니다.토큰(Token)이라는 지정된 문자를 기준으로 문자열을 쪼개면서 추출이 가능합니다.만약 문자열이 "Hello#World"이고 토큰이 '#'이면 다음과 같이 결과를 얻을 수 있습니다.HelloWorldMFC에서도 동일한 기능의 함수가 제공됩니다.AfxExtractSubString() 함수를 통해서 동일한 기능을 제공합니다.먼저 strtok()은 몇 가지 문제점을 가지고 있습니다.원본이 훼손되며 thread-safe하지 않다는 점입니다.strtok()은 두 번째 호출부터는 NULL을 전달합니다.토큰의 위치를 식별하기 위해서 별도의 static 변수를 관리하고 있기 때문입니다.이 변수로 인해서 strtok()을 동시에 쓰면 .. 더보기
MFC 다이얼로그, SDI, MDI의 최소 크기(Size) 설정 MFC에서 프로젝트를 만들 때 SDI, MDI, 다이얼로그 중에 하나를 선택합니다.만들어진 창이 최소 크기나 최대 크기가 정해지면 좋을 때가 있습니다.버튼들이 배치가 되어있는데 창이 타이틀만 남겨놓고 줄어드는 것은 그리 좋아 보이지 않습니다.이 창들의 최소 크기를 정하는 방법을 알아보겠습니다.같은 방법으로 이 방법으로 최대 크기의 수정도 가능합니다.먼저 프로젝트를 생성하면 다음과 같이 MainFrm.h가 생깁니다.SDI, MDI에서는 MainFrm.h이지만 다이얼로그에서는 약간 다르게 생성이 됩니다.프로젝트명Dlg.h 라는 파일이 생기게 됩니다.각자 해당하는 파일을 엽니다.여기서는 SDI를 기준으로 설명하겠습니다.헤더 파일에 커서를 주면 좌측에 속성에 다음과 같이 나오게 됩니다.그럼 빨간색 네모 안의 아.. 더보기
MFC의 CFileFind를 이용한 파일명 열거 MFC에서는 파일을 찾고 나열하기 쉽도록 CFileFind라는 클래스가 존재합니다.이 클래스를 사용하면 굉장히 편리하게 파일을 나열할 수 있습니다.소스 코드는 다음과 같습니다.찾을 파일의 형식이나 파일명을 지정하고 검색을 하시면 됩니다.이것은 MSDN에 나온 예제입니다. CFileFind finder; BOOL bWorking = finder.FindFile("*.*"); while (bWorking) { bWorking = finder.FindNextFile(); cout 더보기
CRect의 DeflateRect() 메소드 CRect는 사각형의 좌표를 저장하고 이 좌표를 더 유용하게 쓸 수 있는 메소드를 갖고 있는 클래스입니다.이 클래스 중에는 DeflateRect()라는 메소드가 존재합니다.이 메소드는 Deflate의 의미(오므라들다, 수축시키다)와 같이 사각형 정보를 줄이는 역할을 합니다.DeflateRect()가 어떻게 찌그러뜨리는지 확인해 보도록 하겠습니다. 간단하게 다이얼로그 기반으로 만들고 OnPaint() 부분을 조금 수정해 줍니다. void CAlwaysOnTopDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetS.. 더보기