'2013/03/27'에 해당되는 글 1건

  1. 2013.03.27 [펌]AfxMessageBox의 타이틀 변경
프로그래밍/C/C++2013. 3. 27. 10:17

MFC에서 보통 AfxMessageBox를 이용해서 팝업 메시지를 띄우면

exe파일의 이름을 타이틀로 사용합니다.

PopupTest.exe라는 파일에서 AfxMessageBox를 사용하면 다음과 같이 나옵니다.

AfxMessageBox(_T("Test!!!"));

PopupTest라는 타이틀로 화면에 표시가 됩니다.

이것을 변경하는 방법이 몇가지 존재합니다.

1. exe 파일명 변경

가장 간단한 방법은 exe 파일을 변경하는 방법입니다.

이 방법은 간단하지만 exe 파일을 변경할 수 없을 때는 사용할 수 없습니다.

2. Resource의 String Table에 AFX_IDS_APP_TITLE을 추가

간단하게 String Table에 AFX_IDS_APP_TITLE이라는 ID를 추가하고

문자열을 입력하면 해당 타이틀을 사용하게 됩니다.

3. CWinApp의 생성자에 NULL 종료 문자열을 전달

프로젝트를 생성하면 프로젝트명과 동일한 cpp와 h 파일이 생깁니다.

PopupTest라는 프로젝트를 생성하고 PopupTest.h 파일을 확인하시면

다음과 같이 CPopupTestApp이 CWinApp을 상속받았다는 것이 확인 가능합니다.

F12를 눌러서 실제 CWinApp 클래스의 모양을 살펴보면

위와 같이 CWinApp은 lpszAppName이라는 인자를 하나 갖는 생성자가 있습니다.

기본값으로 NULL이 되어 있습니다.

PopupTest.cpp 파일로 가서 이 생성자 부분에서

명시적으로 NULL 종료 문자열을 넣어서 CWinApp의 생성자를 호출해주면 됩니다.

이렇게 하면 타이틀을 변경할 수 있습니다.

4. CWinApp의 m_pszAppName 직접 수정

m_pszAppName이 바로 AppName 정보를 갖고 있는 CWinApp의 멤버 변수입니다.

이 값을 직접 바꿔주면 되는데, 그냥 바꾸면 종료될 때 에러가 발생할 수 있습니다.

m_pszAppName = _T("My Title");

이런 식으로 바꾸게 되면 나중에 Heap이 깨졌다는 에러를 보게 될 것입니다.

이유는 m_pszAppName은 malloc으로 할당된 메모리를 참조하고 있고

종료될 때, 소멸자에서 free(m_pszAppName)을 하기 때문입니다.

바꾸기 위해서는 다음과 같이 해줘야 합니다.

InitInstance()같은 곳에 다음 코드를 추가해주면 됩니다.

free((void*)m_pszAppName);
m_pszAppName = _tcsdup(_T("My Title"));

_tcsdup() 함수가 내부적으로 malloc으로 메모리를 할당하고 문자열을 복사한 다음에

주소를 리턴하기 때문에 이렇게 변경하면

CWinApp의 소멸자에서는 해당 주소를 갖고 free를 하게 됩니다.

위와 같은 방법 중에서 하나를 선택해서 AppName을 변경하면

AfxMessageBox의 타이틀을 변경할 수 있습니다.

추가로 Dialog 등에서 한시적으로 변경하기 위해서는 다음과 같이 하면 됩니다.

LPCTSTR pAppNameTemp = AfxGetApp()->m_pszAppName;
AfxGetApp()->m_pszAppName = _T("My Temporary Title");

AfxMessageBox(_T("Test!!!"));

AfxGetApp()->m_pszAppName = pAppNameTemp;

주소를 백업해둔 다음에 임시적으로 바꾸고 다시 원래데로 주소값을 변경해주면 됩니다.

Posted by 컴투