본문 바로가기

Programming/Win32&MFC&COM

AfxMessageBox의 타이틀 변경 MFC에서 AfxMessageBox를 이용해서 팝업 메시지를 띄우면 exe파일의 이름을 타이틀로 사용합니다.MFCTest.exe에서 AfxMessageBox를 사용하면 다음과 같이 타이틀이 표시됩니다. AfxMessageBox(_T("Popup Test")); 화면에 다음과 같이 표시가 됩니다.MFCTest라는 타이틀로 표시가 됩니다.기본적인 타이틀 대신 새로운 타이틀로 사용하는 방법은 다음과 같습니다.1. exe 파일명 변경가장 간단한 방법은 exe 파일명을 변경하는 방법입니다.이 방법은 간단하지만 exe 파일명과 다른 타이틀을 사용하고 싶을 때는 사용할 수 없습니다.2. Resource의 String Table에 AFX_IDS_APP_TITLE을 추가String Table에 AFX_IDS_APP_TI.. 더보기
IAutoComplete를 이용한 자동 완성(Auto Complete) 기능 구현 웹 브라우저나 탐색기의 주소창에서 글자가 입력될 때마다 하단의 리스트가 갱신되는 것을 볼 수 있습니다. 이 기능은 자동 완성(Auto Complete)라는 기능입니다. 자동 완성은 SHAutoComplete()라는 API를 사용해서 간단하게 구현이 가능합니다. 이 함수를 사용하면 URL이나 폴더 경로를 간단하게 자동 완성이 가능하게 할 수 있습니다. 웹 브라우저나 탐색기의 주소창과 동일한 기능을 하는 텍스트 박스를 만들 수 있습니다. SHAutoComplete() 함수는 에디트 컨트롤의 핸들(HWND)과 플래그를 전달 받습니다. 함수의 원형은 다음과 같습니다. HRESULT SHAutoComplete(HWND hwndEdit, DWORD dwFlags); 이 방법으로 주소를 쉽게 적용하는 것이 가능합니다.. 더보기
라디오 버튼의 Warning: skipping non-radio button in group. 경고 제거 MFC에서 라디오 버튼을 추가해서 사용하다보면 간혹 이런 경고를 보게 됩니다.Warning: skipping non-radio button in group.에러가 아니기 때문에 실행에는 문제가 발생하지 않습니다.라디오 버튼을 추가할 때 처음 라디오 버튼의 Properties의 Group 속성을 True로 합니다.그리고 그 이후의 라디오 버튼들은 False로 설정합니다.처음 Group 속성이 True인 컨트롤부터 다음 Group 속성이 True인 컨트롤이 나오기 전까지가 그룹이 됩니다.첫 번째 라디오 버튼이 Group 속성이 True이고 그 이후의 라디오 버튼은 False입니다.그리고 그 다음에 다른 컨트롤이 Group 속성이 True이면 라디오 버튼이 정상적으로 그룹이 되는 것입니다.이 경고가 발생했을 .. 더보기
DLL을 dumpbin으로 볼 때 함수명 = _함수명 형태로 나올 때 dumpbin이라는 명령어를 사용해서 DLL이 노출하는 함수들을 확인할 수 있습니다.dumpbin은 일반 cmd에서는 실행되지 않습니다.Visual Studio를 설치한 이후에 Tools 메뉴의 Visual Studio Command Prompt에서 실행합니다.실행 방식은 다음과 같습니다. dumpbin /exports Mydll.dll 실행했을 때 다음과 같이 숫자(서수 정보)와 함께 함수명이 출력되는 것이 정상입니다.이렇게 표시되지 않고 함수명이 함수명 = _함수명의 형태로 출력되는 경우가 있습니다.다음과 같이 출력되는 경우입니다.AddFloat와 AddInteger만 표시되어야 하는데 다른 형태로 표시되고 있습니다.이 문제의 해결 방법은 다음과 같습니다.먼저 프로젝트 속성(Alt + F7)의 좌측 .. 더보기
MFC에 Flash ActiveX 올리고 에러 발생 FormView에 Flash ActiveX 컨트롤을 올렸을 때 실행이 되지 않는 문제가 있었습니다.이전 버전의 Visual Studio에서는 디버그 모드에서 ASSERT에서 문제가 생겼습니다.Visual Studio 2015에서는 다음과 같은 문제가 발생했습니다.문제가 생기는 부분이 이상한 곳이기 때문에 찾기가 어려웠습니다. AfxOleInit() 함수를 호출하는 부분에서 에러가 발생합니다.MSDN을 통해서 관련 내용을 확인할 수 있었습니다.CoInitializeEx()를 호출할 경우에 COINIT_APARTMENTTHREADED를 사용하라는 것이었습니다.호출할 때 COINIT_MULTITHREADED로 호출했기 때문에 발생한 문제였습니다.CoInitializeEx()를 호출할 때 COINIT_APART.. 더보기
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() 메시지와 해당 메시지를 처.. 더보기