MFC 썸네일형 리스트형 [MFC] 부모 다이얼로그가 자식 다이얼로그 아래에만 위치하는 현상 ※ 요약 아래 이미지와 같이 자식 다이얼로그를 모달리스로 생성하고 띄울때, 부모 다이얼로그(윈도우)가 항상 자식 다이얼로그 밑에 위치하는 경우가 있다. 이는 자식 다이얼로그를 생성할때 부모 Wnd를 어떻게 지정하느냐에 따라 달라지는데 이번 포스트에서는 부모/자식 다이얼로그에 상관없이 활성화된 다이얼로그가 위로 올라오게 하는 방법을 알아보겠다. ※ 소스코드 먼저 소스코드부터 보겠다. Create함수의 두 번째 파라미터의 부모 Wnd를 this로 할 경우 부모 다이얼로그가 항상 자식 다이얼로그 밑에 위치하게 된다. 반대로 CWnd::GetDesktopWindow()로 지정하면 부모/자식 상관없이 활성화된 다이얼로그가 위로 올라오게 된다. ※ 적용 후 this 대신 CWnd::GetDesktopWindow로 .. 더보기 [MFC] OnGetMinMaxInfo - 윈도우 최소, 최대 사이즈 지정 ※ 요약 윈도우의 WM_GETMINMAXINFO 메시지에 대한 포스트다. 이 메시지는 윈도우의 크기나 위치가 변경되었을때 발생하며 보통 윈도우의 최소, 최대 크기를 지정하여 프로그램이 너무 작거나 너무 크게 변경할 수 없도록 해야할때 사용한다. 예제로 만든 프로젝트는 다이얼로그 기반이지만, SDI, MDI 등에서도 적용가능하다. ※ 설명 아래 MFC 프로젝트는 GetMinMaxInfo 설명을 위해 다이얼로그 기반으로 만든 순수 MFC 예제다. 먼저 "클래스 뷰"탭으로 이동하여 다이얼로그 클래스에 마우스 우클릭을 하여 팝업된 메뉴에서 "속성" 항목을 선택한다. (만약 SDI나 MDI 프로젝트일 경우엔 CMainFrame 클래스에 하면 된다.) 메시지 항목을 선택한 후 WM_GETMINMAXINFO 항목을 .. 더보기 [MFC] Alt키나 Ctrl키 눌렸는지 확인하기 ※ 요약 MFC로 개발하다 보면 Alt키나 Ctrl키가 눌렸는지 알아야 할 때가 있다. 이번 포스팅에서는 그 방법을 알아보도록 하겠다. 참고로 전역적으로 하려면 후킹을 통해서 하거나 드라이버 단에서 해야하며, 후킹을 통한 방법은 나중에 올리도록 하겠다. ※ 소스코드 BOOL CKeyDownDlg::PreTranslateMessage( MSG* pMsg ) { if( pMsg->message == WM_SYSKEYDOWN ) { AfxMessageBox( _T("Alt") ); } if( (GetAsyncKeyState(VK_CONTROL)&0x8000) ) { AfxMessageBox( _T("Ctrl") ); } return CDialogEx::PreTranslateMessage( pMsg ); } ※.. 더보기 [MFC] GetModuleFileName 이용하여 현재 실행 경로 얻기 ※ 요약 API함수 GetModuleFileName를 이용하여 현재 실행중인 실행 파일의 경로를 얻는 방법이다. 자주는 아니지만 실행 중인 파일의 경로가 필요할때가 있는데 그럴때 사용하면 되며, 필자는 보통 프로그램 시작시 실행 경로를 얻고, 필요할 때마다 사용하는 편이다. ※ 소스CString CAdoTestDlg::GetExecutedPath( ) { CString strResult; CString strPath; if( GetModuleFileName( nullptr, strPath.GetBuffer(_MAX_PATH + 1), MAX_PATH ) != FALSE ) { strPath.ReleaseBuffer( ); strResult = strPath.Left( strPath.ReverseFind(.. 더보기 [MFC] 다이얼로그 기반에 웹 브라우저 띄우기 ※ 요약 아래는 필자가 서비스 중인 다이얼로그 기반의 MFC 프로그램이다. 얼마 전 가가 채팅을 도입하기 위해 웹 브라우져 컨트롤을 추가하여 MFC에 웹 페이지를 띄운 화면인데, 그 방법을 정리하고자 포스팅한다. 또 Visual Studio 2013으로 만든 예제도 첨부하였으니 필요시 참고하기 바란다. ※ 사전 검점 프로젝트를 생성할 때 "Active 컨트롤" 옵션을 활성화 했는지 확인해야 한다. 만약 활성화 하지 않았다면 InitInstance( )함수에서 AfxEnableControlContainer( );라는 함수를 호출해주면 된다. 그렇지 않으면 프로그램 실행시 Debug Assertion Failed가 떴던걸로 기억난다. 예제 : ※ 방법 먼저 해당 프로젝트에 클래스를 추가한다. WebBrows.. 더보기 [MFC] CString 공백 및 지정 문자/문자열 제거 하는 함수 - TrimLeft, TrimRight ※요약 CString::TrimLeft : 문자열의 왼쪽에서 공백이나 탭, 개행 문자 또는 지정한 문자/문자열을 제거한다. CString::TrimRight : 문자열의 오른쪽에서 공백이나 탭, 개행 문자 또는 지정한 문자/문자열을 제거한다. ※특징 TrimLeft, TrimRight함수는 인자를 넘기지 않을 경우 각각 문자열 좌우측에서 공백, 탭('\t'), 개행 문자('\n')를 제거한다. 인자를 넘길 경우 넘겨진 문자나 문자열을 제거하는데, 이때는 인자로 넘겨진 것만 제거된다. TrimLeft, TrimRight함수는 문자열의 좌우측에서만 작업을 하므로, 문자열 중간에서 작업하려면 CString::Remove나 CString::Replace함수를 적절히 이용하면 된다. 보통 필자는 에디트 컨트롤 등.. 더보기 [MFC] CString 지정한 특정 문자를 모두 제거하는 함수 - Remove ※요약 CString::Remove : 지정한 특정 문자를 모두 제거한다. ※특징 문자열은 지정이 안되고 문자만 지정되므로 알아도 잘 사용하지 않는 함수다. 필자의 경우, 보통 CString::Replace를 더 많이 사용한다. ※함수 원형 및 설명 int Remove( TCHAR chRemove ); //chRemove : 제거할 문자 //반환값 : 제거한 문자의 수 ※예제#include //CString #define print( str ) printf( "%s\n", str ) int main( ) { CString strText = "+V+i+s+u+a+l St+u+d+i+o C++ 20+13"; print( strText ); strText.Remove( '+' ); print( strText .. 더보기 [MFC] CString 원하는 위치의 문자나 문자열을 삭제하는 함수 - Delete ※요약 CString::Delete : 문자나 문자열을 삭제한다. 삭제하려는 위치와, 삭제하고자 하는 길이를 지정할 수 있다. ※특징 고정 길이의 문자열에서 필요 없는 부분을 삭제할 때 좋다. 예를 들어 아래와 같이 날짜시간 형식의 고정 길이 문자열이 있다고 할 때 날짜만 없애거나, 시간만 없애는 등 특정 부분을 지울때 사용. 2014-09-29 07:05 2014-09-29 08:15 2014-09-29 09:42 2014-09-29 10:18 2014-09-29 11:23 필자는 Delete함수를 알기 전까지는 보통 CString::Mid를 많이 사용하였으며, 삭제 말고 삽입(CString::Insert)도 알아두면 좋음. ※함수 원형 및 설명 int Delete( int nIndex, int nCo.. 더보기 [MFC] CString 문자나 문자열을 원하는 위치에 삽입하는 함수 - Insert ※요약 CString::Insert : 문자 또는 문자열을 원하는 위치에 삽입한다. ※특징 문자나 문자 삽입 시, 맨 앞에 삽입하려면 0으로 하고 맨 뒤에 추가하려면 문자열의 길이로 하면 된다. 필자는 Insert함수를 알기 전까지는 보통 CString::Mid를 이용하였으며, 삽입 말고 삭제(CString::Delete)도 알아두면 좋음. ※함수 원형 및 설명 int Insert( int nIndex, TCHAR ch ); //nIndex : 문자가 삽입될 위치 첫 문자의 위치는 0 //ch : 삽입될 단일 문자 //반환값 : 문자열의 길이 int Insert( int nIndex, LPCTSTR pstr ); //nIndex : 문자가 삽입될 위치 첫 문자의 위치는 0 //pstr : NULL로 끝나.. 더보기 MFC 프로젝트 - Debug Assertion Failed : wincore.cpp ※요약 MFC 프로젝트의 속성 중 런타임 라이브러리의 속성이 위와 같이 다중 스레드 속성으로 된 프로젝트가 있을때, PreTranslateMessage( )에서 새로운 다이얼로그를 생성했다가 닫으면 아래와 같이 Debug Assertion Failed이 발생한다.Assert라 Release모드에서는 발생하지 않고, 디버그에서도 무시하면 아무런 문제가 없지만 매우 찜찜하다. ※해결 방법원인은 잊어버렸지만 해결방법은 기억에 있다.아래와 같이 return TRUE;를 해주면 더 이상 발생하지 않는다. 더보기 [MFC] CString 문자열 교체하는 함수 - Replace ※요약 CString::Replace : 문자 또는 문자열을 교체한다. ※특징문자나 문자열에 '\'가 있을 경우, '\'를 하나 더 붙여줘야 한다.이유는 '\'는 Escape문자이기 때문이다. ※함수 원형 및 설명 int Replace( TCHAR chOld, TCHAR chNew ); //chOld : 교체될 문자 //chNew : 교체할 문자 //반환값 : 교체한 문자 또는 문자열의 수 int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew ); //lpszOld : NULL로 종결되는 교체될 문자 //lpszNew : NULL로 종결되는 교체할 문자 //반환값 : 교체한 문자 또는 문자열의 수 ※예제 #include //CString #define print( str ) .. 더보기 [MFC] CString 문자열 비교하는 함수 - Compare, CompareNoCase ※요약 Compare : 대소문자를 구분하여 문자열을 비교한다.CompareNoCase : 대소문자를 구분하지 않고 문자열을 비교한다. ※특징operator ==, !=, , = 도 대소문자를 구분하여 CString의 문자열을 비교할 수 있으며C언어 함수 중 strcmp, strncmp, stricmp, strnicmp 등과 비슷하다.또 한 비교는 아스키코드를 기준으로 비교하므로 아스키코드표를 참고하면 된다. ※함수 원형 및 설명 int Compare( LPCTSTR lpsz ) const; int CompareNoCase( LPCTSTR lpsz ) const; //lpsz : NULL로 종결되는 비교할 문자열 //반환값 : 문자열이 lpsz보다 작을 경우 -1 // 문자열이 lpsz와 같을 경우 0 .. 더보기 [MFC] CString 문자열 비우기 및 비어있나 확인하는 함수 - Empty, IsEmpty ※요약 Empty : CString 개체의 문자열을 비운다.IsEmpty : CString 개체가 갖고 있는 문자열이 비어있는지 조사한다. ※특징Empty 함수는 CString 개체의 문자열을 비우며 내부적으로 할당된 메모리를 해제한다. ※함수 원형 및 설명void Empty( ); BOOL IsEmpty( ) const; //반환값 : 문자열이 비어있으면 TRUE, 비어 있지 않으면 FALSE를 반환 ※예제#include //CString #define print( str ) printf( "%s\n", str ) int main( ) { CString strText; strText = "abcd13579"; print( strText ); if( strText.IsEmpty( ) != TRUE )//.. 더보기 [MFC] 계층도 및 프로그램의 실행 흐름 요약 ※MFC 계층도 16년 01월 25일 기준 최신 계층도이다. 출처 - MSDN 아래 그림은 CObject로부터 파생된 MFC 클래스들을 나타낸다. 아래 그림은 CWnd 및 CCmdTarget로부터 파생된 MFC 클래스들을 나타낸다. 아래 그림은 CObject로부터 파생되지 않은 MFC 클래스들을 나타낸다. ※MFC 프로그램 실행 요약 프로젝트 이름이 Temp라고 했을 때, 각 추적점 및 TRACE를 추가하여 프로그램을 실행시킨 결과는 아래와 같다. CTempApp::CTempApp() ------ App 클래스 변수가 전역변수로 선언되어있으므로 제일 먼저 생성자가 호출된다 CTempApp::InitInstance() ------ MFC 코드에 숨겨진 AfxWinMain함수에서 호출된다. (프로그램의 설정.. 더보기 [Win32 API, MFC] VK_ 가상 키 코드 ( Virtual-Key Codes ) Win32 API 나 MFC에서 사용되는 가상 키 코드 ( VK_ ) 입니다.출처는 마이크로소프트 MSDN입니다. http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx VK_LBUTTON0x01Left mouse buttonVK_RBUTTON0x02Right mouse buttonVK_CANCEL0x03Control-break processingVK_MBUTTON0x04Middle mouse button (three-button mouse)VK_XBUTTON10x05X1 mouse buttonVK_XBUTTON20x06X2 mouse button-0x07UndefinedVK_BACK0x08BACKSPACE keyVK_.. 더보기 [MFC] CString 문자열 대소문자 변환 함수 - MakeUpper, MakeLower CString 문자열 대문자나 소문자로 변환하는 함수 MakeUpper() 와 MakeLower() 에 대한 내용이다. ※요약 MakeUpper : 모든 문자열을 대문자로 변환한다. MakeLower : 모든 문자열을 소문자로 변환한다. ※특징 C언어 중 strupr, strlwr 함수와 비슷하다. ※함수 원형 및 설명 void MakeUpper( ); void MakeLower( ); ※예제 #include //CString #define print(str)printf( "%s\n", str ) int main( ) { CString strText1 = "ABCDE"; CString strText2 = "abcde"; CString strText3 = "a1b2c3d4e"; strText1.MakeLo.. 더보기 [MFC] CString 문자셋 추출 함수 - SpanIncluding, SpanExcluding ※요약SpanIncluding : 필요한 문자들만 추출한다.SpanExcluding : 필요없는 문자들을 걸러낸다. ※특징SpanIncluding()는 필요한 문자들만 추출할 때 편리하며,SpanExcluding()는 필요없는 문자들을 걸러낼 때 편리하다. ※함수 원형 및 설명 CString SpanIncluding( LPCTSTR lpszCharSet ) const; //lpszCharSet : NULL로 종결되는 문자셋 //반환값 : 추출된 문자열을 포함하는 CString 개체. CString SpanExcluding( LPCTSTR lpszCharSet ) const; //lpszCharSet : NULL로 종결되는 문자셋 //반환값 : 추출된 문자열을 포함하는 CString 개체. ※예제 #inc.. 더보기 [MFC] CString 문자셋 검색 함수 - FindOneOf CString 문자셋 검색 함수 중 FindOneOf()에 관한 내용이다. ※요약 FindOneOf : CString 개체의 문자열에서 지정된 문자셋 중 일치하는 문자가 하나라도 있는지 검사한다. C언어에서는 strspn, strcspn과 대응된다. ※특징 다시 한 번 강조하지만 문자열이 아닌 문자 단위로 검사하는 함수다. 예를 들어 FindOneOf( "abc" ) 라면, Find( "a" ), Find( "b" ), Find( "c" )를 차례로 수행한 것과 같다. ※함수 원형 및 설명 int FindOneOf( LPCTSTR lpszCharSet ); //lpszCharSet : 검색할 문자셋 //반환값 : 처음으로 일치되는 문자가 검색된 위치 ※예제 #include //CString int mai.. 더보기 [MFC] CString 문자열 검색 함수 - Find, ReverseFind CString 문자열 검색 관련 함수 중 Find(), ReverseFind()에 관한 내용이다. ※요약 Find : CString 개체의 문자열 기준, 좌측에서부터 문자 혹은 문자열을 검색 ReverseFind : CString 개체의 문자열 기준, 우측(역순)에서부터 문자를 검색 ※특징 Find나 ReverseFind의 반환값은 0 ~ (문자열 길이 n-1)이다. 찾으려는 문자열이 없을 경우 -1을 리턴한다. ※함수 원형 및 설명 int Find( TCHAR ch ) const; //ch : 검색할 단일 문자 //반환값 : 검색된 위치, 실패 시 -1 int Find( TCHAR ch, int nStart ) const; //ch : 검색할 단일 문자 //nStart : 검색을 시작할 위치. 생략 시.. 더보기 [MFC] CString 문자열 추출 함수 - Left, Mid, Right ※요약 Left : CString 개체의 문자열에서 왼쪽을 기준으로 문자열 추출 Mid : CString 개체의 문자열에서 지정한 중간 부분의 문자열 추출 Right : CString 개체의 문자열에서 오른쪽을 기준으로 문자열 추출 ※함수 원형 및 설명 CString Left( int nCount ) const; //nCount : 왼쪽 기준 추출할 문자의 수 //반환값 : 추출된 문자열을 포함하는 CString 임시 개체 CString Right( int nCount ) const; //nCount : 오른쪽 기준 추출할 문자의 수 //반환값 : 추출된 문자열을 포함하는 CString 임시 개체 CString Mid( int nFirst ) const; CString Mid( int nFirst, in.. 더보기 MFC 모달리스 창 띄워져 있나 확인하는 방법 모달리스 창이 떠 있나 조사하려는 곳에 아래의 소스를 입력하면 확인할 수 있습니다. "m_ProgramStatDlg"만 자신에게 맞는 객체명으로 바꿔주면 됩니다. ※소스 if( m_ProgramStatDlg != NULL && m_ProgramStatDlg->IsWindowVisible() == TRUE ) { printf("모달리스 창이 떠 있습니다.\n"); } else { printf("모달리스 창이 안 떠 있습니다.\n"); } 저는 임시로 "오류 알림" 버튼에 위의 소스를 넣었습니다. 더보기 Win32 API, MFC에서 디버깅용 콘솔 창 띄우기 아래는 MFC 프로젝트에 디버깅을 위한 콘솔 창을 띄운 모습입니다. (아래 프로그램은 로또 프로그램) 사실 MFC의 경우는 아래 캡쳐와 같이 TRACE 매크로를 통해 로그(디버깅 메시지)를 확인할 수 있지만Win32 API의 경우는 TRACE 매크로가 없으며, 있어도 TRACE보다는 printf로 출력하는 게 더 편할 때도 있어서 가끔 콘솔창을 이용합니다. TRACE보다 printf로 출력하면 더 편한 몇 가지 이유로는 - printf의 경우 서식문자를 쓸수 있다. ex) printf( "에러 번호 : %d, 에러 내용 : %s", nErrorNum, GetLastError() ); - TRACE의 경우 출력 창에 내용이 표시되는데, TRACE 내용 말고도 잡다한 내용이 많다. - 콘솔 창의 경우는 내가.. 더보기 [MFC] Enter/ESC 키 방지 CDialog 클래스를 상속받아 만들어진 윈도우는 Enter와 ESC 키에 윈도우가 닫히는 특징이 있습니다. 이런 현상을 방지하려면 가상 함수인 PreTranslateMessage 함수에 WM_KEYDOWN 메시지를 검사해서 누른 키가 Enter나 ESC면 처리하지 않고 반환하게 하면 됩니다. BOOL TestDlg::PreTranslateMessage( MSG* pMsg ) { if( pMsg->message == WM_KEYDOWN && (pMsg -> wParam == VK_RETURN || pMsg -> wParam == VK_ESCAPE) ) { pMsg->wParam = NULL; } return CDialog::PreTranslateMessage( pMsg ); } 더보기 UpdateData함수, UpdateData(), DDX UpdateData( TRUE ) 는 컨트롤 -> 변수 UpdateData( FALSE ) 는 변수 -> 컨트롤 보통 함수 시작 부분에 UpdateData( TRUE )가 먼저 오고 함수 끝 부분에 UpdateData( FALSE )가 옵니다. 이것을 DDX( Dialog Data Exchange )라고 합니다 더보기 이전 1 다음