2012-10-17 1 views
1

저는 Button 컨트롤 래퍼 클래스를 가지고 있습니다.이 래퍼 클래스는 기존 핸들을 WC_BUTTON 클래스로 전달하면이를 전달할 수 있습니다. 이것을 결정하기 위해 GetClassName()을 사용합니다. 하지만 문제가있는 코드의 주석 도움이 그것을 설명한다 :이상한 부등식 - WC_BUTTONW가 L "Button"과 같지 않습니까?

// Initialize from existing handle 
Vivify::Button::Button(HWND handle) { 
    TCHAR cls[256]; 
    GetClassName(handle, cls, sizeof(cls)); 

    Alert(cls);  // MessageBox says "Button" 
    Alert(WC_BUTTON); // MessageBox says "Button" also 

    Str clsStr = cls; 
    Str wcStr = WC_BUTTON; 

    Alert(ToStr<int>(clsStr.length())); // says "6" 
    Alert(ToStr<int>(wcStr.length())); // says "6" also 

    // Problem HERE. Evaluates to false. How are they inequal?? 
    if (cls == WC_BUTTON) { 
     SetHandle(handle); // Never gets executed 
     m_id = GetDlgCtrlID(handle); 
    } 
} 

Str는 방법에 의한 std::wstring이며, 프로그램은 유니 코드입니다. 그러나 문자열 내가 GetClassName()에서 얻을 WC_BUTTON 모두 유니 코드 문자열 모두 6 자 길이이며, 모두 동일한 "Button", false을 돌려 줄 if (cls == WC_BUTTON) 어떻게 지구에 모두?

누군가 두 개의 겉으로보기에 정확히 똑같은 문자열이 어떻게 서로 같을 수 있는지 설명 할 수 있습니까? 또는 HWND이 버튼/편집/etc에 속하는지 어떻게 확인할 수 있습니까? 제어?

+4

C 문자열을 ==와 비교하지 마십시오. – chris

+0

@chris 그럼 어떻게 비교해야합니까? –

+2

여전히 C 문자열 인 경우 'strcmp'. 'vector '와'array '는 C 문자열처럼 행동 할 수 있기 때문에,'cls'를 그것들 중 하나에 만들고 다른 것을 만들고, 그것의'data()'를'WC_BUTTON'으로 설정하고 ==를 그것들에 사용할 수 있습니다. 나는'std :: string'이라고 말할 것입니다.하지만 버퍼를 직접 설정할 수는 없습니다. – chris

답변

4

문자열을 비교하지 않고 주소를 비교하고 있습니다. 주소가 다르므로 false을 반환합니다.

당신이 버퍼의 기능 채우기가 필요하기 때문에, 당신은 두 가지 옵션이 있습니다

A)를 사용하여 C 문자열과 _tcscmp (strcmp의 TCHAR 버전) :

if (_tcscmp(cls, WC_BUTTON) == 0) //0 means equal 

B) 컨테이너를 사용하십시오. std::vectorstd::arraystd::string과 달리 버퍼를 편집 할 수 있지만 후자를 표시합니다.

TCHAR clsTemp[256]; 
GetClassName(handle, clsTemp, sizeof clsTemp/sizeof(TCHAR)); 
std::basic_string<TCHAR> cls = clsTemp; 

if (cls == WC_BUTTON) //WC_BUTTON converted to `std::string` to compare 

cls의 정수 C 문자열 버전이어서 cls.c_str() 의해 액세스 될 수있다.

GetClassName 호출이 바이트 단위가 아닌 버퍼의 길이 (문자 수)를 반영하도록 변경되었습니다. TCHAR의 크기가 1이 아니므로이를 나누어야합니다.

+0

+1 내가하려는 일이 왜 효과가 없었는지 정확히 설명하고 2 가지 옵션을 제공합니다. 또한 내 코드의 다른 결함을 지적하고이를 수정합니다. 좋은 대답. –