<

MFC의 트리메뉴 컨트롤의 아이템 선택 이벤트 후 해당 선택된 아이템의 인덱스를 리턴하는 메소드가 없다.


편법으로 아이템 이름으로 찾는 방법도 있지만 코드가 길어지고 추가/수정이 복잡해진다.


구글링 결과 index를 구하는 방법을 찾았다.


OnTvnSelchanged 이벤트 메소드에서 child 아이템을 루프 태우면서 현재 선택된 item인지 체크하면서 증가 시키는 것이다.


이생각을 왜 못했는지..


코드의 일부는 아래와 같다. 전체는 출처로 이동해서 확인하길 바란다.


 
    int index = 0;
    HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
    HTREEITEM hChild = m_treeCtrl.GetChildItem(NULL);
    while (hChild)
    {
        if (hChild == hItem) break;
        hChild = m_treeCtrl.GetNextItem(hChild, TVGN_NEXT);
        ++index;
    }
출처 : C++/(MFC)트리 컨트롤 몇 번째 아이템인지 조회


isalpha()

 함수형태 

 isalpha(int c)

 파라미터

 c − 확인할 문자(ASCII)

 리턴

 0 != c가 알파벳, 0 = c는 알파벳이 아님




isdigit()

 함수형태 

 isdigit(int c)

 파라미터

 c − 확인할 문자(ASCII)

 리턴

 0 != c가 숫자, 0 = c는 숫자가 아님




	CString strTest = _T("ABCDEFG01234");
	if (isalpha(strTest[2]))
	{
		// true
		// ...
	}
	else
	{
		// false
		// ...
	}
	if (isdigit(strTest[7]))
	{
		// true
		// ...
	}
	else
	{
		// false
		// ...
	}


알파벳 대소문자, 숫자를 포함한 랜덤한 문자열을 생성하는 함수



출처는 StackOverflow

void gen_random(char *s, const int len)
{
	static const char alphanum[] =
		"0123456789"
		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		"abcdefghijklmnopqrstuvwxyz";

	for (int i = 0; i < len; ++i) {
		s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
	}

	s[len] = 0;
}

여기에 문자 중복이 안되게끔 하거나, 특수문자를 추가하는 방법도 고려해봐야겠다.


C#에서는 FILE 핸들러로 바로 확인이 가능한데 C++는 한줄에 쓰기 번거러워 따로 함수를 만들어서 사용한다.


유니코드가 아닌 프로젝트도 있어 분기처리 해준다.



bool isExistFile(CString _strFile)
{
#ifdef _UNICODE
	return(_waccess_s(_strFile, 0) != -1);
#else
	return (_access_s(_strFile, 0) != -1);
#endif
	
}


  • a : 배열 (Array)
  • b : BOOL 형 변수 (Boolean)
  • by : BYTE 형 변수 (Byte, = unsigned char)
  • c : 카운터 변수 (Counter, = int)
  • cb : 바이트의 개수
  • ch : char형 변수 (Character, = char)
  • cx : X 좌표용 변수 (Coordinate X Value, = int)
  • cy : Y 좌표용 변수 (Coordinate Y Value, = int)
  • d : 날짜형 변수 (CDate)
  • dbl : double형 변수 (Double, = double)
  • dw : Unsined Long (DWORD)
  • f : BOOL 형 변수 (Flag)
  • h : 핸들형 변수 (Handle, = HANDLE)
  • n : 자연수형 변수 (Natural Number, = int)
  • i : 정수형 변수 (Integer, = int)
  • i : 인덱스 (Index)
  • l : long형 변수 (Long, = long)
  • m_ : 특정 클래스의 멤버 변수 (Member Variable)
  • p : 포인터 변수 (Pointer, = [type]*)
  • lp : long/far 포인터 변수 (Long/Far Pointer)
  • 32비트 프로그래밍에서는 일반 수준의 포인터로 취급함
  • 16비트 프로그래밍에서는 먼 거리의 포인터로 취급함
  • s : 문자열 (String)
  • sz : NULL (= \0)로 끝나는 문자열 (String)
  • u : 자연수 중 양수형 변수 (Unsigned Integer, = unsigned int)
  • w : WORD형 변수 (Word, = unsigned short)
  • dw : DWORD형 변수 (Double Word, = unsigned long)
  • str : CString형 변수 (String)
출처 : http://unidri.tistory.com/38


'Programming' 카테고리의 다른 글

[C++/MFC] Screen Capture  (0) 2016.06.13
fatal error C1004: unexpected end of file found 에러 뜰 때  (0) 2016.01.07
c/c++ 접두어  (0) 2016.01.06
CString Format함수 에러  (0) 2015.12.30
C++ String 정리 (C++ 문자열)  (0) 2015.12.28
[MFC] 그리드컨트롤 체크박스 사용  (0) 2015.10.28

아래와 같은 오류가 발생할때에는 프로젝트 환경이 유니코드환경일 경우이다.


'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t * ,...)' :

매개 변수 1을 'const char [6]'에서 'const wchar_t *'으로 변활할수 없습니다 


CString Format 멤버함수를 사용하기 위해서는

아래와 같이 수정하여 사용한다.


수정 전 :



CString strtest;
strtest.Format("%d",nIndex);


수정 후 :


CString strtest;
strtest.Format(_T("%d"),nIndex);


유니코드환경에서는 _T로 포맷스트링을 감쏴줘야한다.

+ Recent posts