Api에서 MFC Dialog 활용하자!
2011. 7. 5. 13:38ㆍ언어/C++
오랜만에 포스팅 하는 것 같다!!
VS2008을 활용하여간단한 트레이 아이콘을 만들기 위해 Winapi를 활용하여 만들기 시작했는데 일이 커져버려서 Dialog
까지 생성하게 되었다.
Resource View에서 Add->Resource 클릭하고
다이얼로그 선택해주시고 New 해서 Dialog 생성!!
cpp파일에 #include "resource.h"를 넣어줘서 Dialog 불러올 준비 하시고
뭐 간단하구만~ 하면서 컴파일! 문제없이 컴파일 된다.
이 상태에서 Winapi명령어를 써서 프로그래밍 하면 끝이 나지만 내가 사용하고 싶은 방식은 MFC를 활용하는 방식이다.
다시 Resource View로 가서 메인 폼을 더블클릭 하면 다음과 같은 다이얼로그가 열린다.
따로 설명 안해도 되는 MFC Class Wizard이다 Class Name에 원하는 이름을 넣어주고 Finish를 누르면 다이얼로그
기반과 똑같이 dlg.h와 dlg.cpp가 생성된다.
이 상황에서 컴파일을 해보면
fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
위와 같은 에러가 나는데 이 것은 Property Page에서 Configuration Properties -> General -> Use of MFC를 Use
MFC in a Shared DLL로 변경 해주면 된다.
이제 컴파일을 해보자..
이제 본 Api 소스에 방금 만든 Dialog의 헤더파일을 선언해주고 컴파일을 해보면 에러가 주르륵!!
여러가지 에러가 있지만 제일 처음 에러를 보면 error C2504: 'CDialog' : base class undefined 이러한 에러가 있다.
기본 클래스가 정의되지 않았다고? 정의부분을 보면 afxwin.h에 들어있다고 되어있다. stdafx.h파일에 보면 afxwin.h는
정의되어 있다. 하지만 에러는 여전하다.
문제가 뭔지를 찾다가 다이얼로그 기반의 stdafx.h파일을 열어봤는데 꽤 많은 양의 코딩이 되어 있다. 하지만 내가 생성
한 다이얼로그의 stdafx.h파일을 보면 코딩 2줄..
여기까지 읽어오신분들이라면 다음 행동은 예상 하실듯..
똑같이 복사 해줬습니다. 컴파일 해보니 두둥.. 정상 동작 하는군요.. ㅎㅎ
아래는 stdafx.h헤더파일입니다.
// stdafx.h : 자주 사용하지만 자주 변경되지는 않는
// 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이
// 들어 있는 포함 파일입니다.
#pragma once
#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다.
// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 핵심 및 표준 구성 요소입니다.
#include <afxext.h> // MFC 확장입니다.
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다.
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // Windows 공용 컨트롤에 대한 MFC 지원입니다.
#endif // _AFX_NO_AFXCMN_SUPPORT
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
정확한 이유는 찾아봐야 알겠지만 아마도 afxcmn.h라던지 afxext.h등 MFC 지원함수들이 없어서인듯 싶다.. 어쨌건 이
렇게 하면 낙승!
VS2008을 활용하여간단한 트레이 아이콘을 만들기 위해 Winapi를 활용하여 만들기 시작했는데 일이 커져버려서 Dialog
까지 생성하게 되었다.
Resource View에서 Add->Resource 클릭하고
다이얼로그 선택해주시고 New 해서 Dialog 생성!!
cpp파일에 #include "resource.h"를 넣어줘서 Dialog 불러올 준비 하시고
뭐 간단하구만~ 하면서 컴파일! 문제없이 컴파일 된다.
이 상태에서 Winapi명령어를 써서 프로그래밍 하면 끝이 나지만 내가 사용하고 싶은 방식은 MFC를 활용하는 방식이다.
다시 Resource View로 가서 메인 폼을 더블클릭 하면 다음과 같은 다이얼로그가 열린다.
따로 설명 안해도 되는 MFC Class Wizard이다 Class Name에 원하는 이름을 넣어주고 Finish를 누르면 다이얼로그
기반과 똑같이 dlg.h와 dlg.cpp가 생성된다.
이 상황에서 컴파일을 해보면
fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
위와 같은 에러가 나는데 이 것은 Property Page에서 Configuration Properties -> General -> Use of MFC를 Use
MFC in a Shared DLL로 변경 해주면 된다.
이제 컴파일을 해보자..
이제 본 Api 소스에 방금 만든 Dialog의 헤더파일을 선언해주고 컴파일을 해보면 에러가 주르륵!!
여러가지 에러가 있지만 제일 처음 에러를 보면 error C2504: 'CDialog' : base class undefined 이러한 에러가 있다.
기본 클래스가 정의되지 않았다고? 정의부분을 보면 afxwin.h에 들어있다고 되어있다. stdafx.h파일에 보면 afxwin.h는
정의되어 있다. 하지만 에러는 여전하다.
문제가 뭔지를 찾다가 다이얼로그 기반의 stdafx.h파일을 열어봤는데 꽤 많은 양의 코딩이 되어 있다. 하지만 내가 생성
한 다이얼로그의 stdafx.h파일을 보면 코딩 2줄..
여기까지 읽어오신분들이라면 다음 행동은 예상 하실듯..
똑같이 복사 해줬습니다. 컴파일 해보니 두둥.. 정상 동작 하는군요.. ㅎㅎ
아래는 stdafx.h헤더파일입니다.
// stdafx.h : 자주 사용하지만 자주 변경되지는 않는
// 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이
// 들어 있는 포함 파일입니다.
#pragma once
#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다.
// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 핵심 및 표준 구성 요소입니다.
#include <afxext.h> // MFC 확장입니다.
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다.
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // Windows 공용 컨트롤에 대한 MFC 지원입니다.
#endif // _AFX_NO_AFXCMN_SUPPORT
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
정확한 이유는 찾아봐야 알겠지만 아마도 afxcmn.h라던지 afxext.h등 MFC 지원함수들이 없어서인듯 싶다.. 어쨌건 이
렇게 하면 낙승!
'언어 > C++' 카테고리의 다른 글
알고리즘 정리되어 있는 사이트 (0) | 2011.08.29 |
---|---|
[MFC/C++] Convert String to DateTime (0) | 2011.08.29 |
vs 프로젝트명 변경하기 (0) | 2011.01.26 |
C++(MFC) Bitmap Button 만들기 (0) | 2010.11.11 |
BHO desk bar (0) | 2010.11.08 |