1

ボタン コントロール ラッパー クラスがあります。これにより、クラスの既存のハンドルを渡すことができますWC_BUTTON。私はGetClassName()これを決定するために使用します。しかし、私には問題があります。コード内のコメントはそれを説明するのに役立ちます:

// 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);
    }
}

Strstd::wstringちなみに、プログラムはUnicodeです。しかし、私が取得した文字列と両方の文字列GetClassName()WC_BUTTON両方ともユニコード文字列であり、両方の6文字が長く、両方とも等しい"Button"です.行は一体どのようにif (cls == WC_BUTTON)返されますfalseか??

一見まったく同じように見える 2 つの文字列がどのように互いに等しくないのか、誰か説明できますか? HWNDまたは、がボタン/編集/などに属しているかどうかを判断するにはどうすればよいですか。コントロール?

4

1 に答える 1

4

文字列を比較しているのではなく、アドレスを比較しています。アドレスが異なるため、 を返しますfalse

関数でバッファーを埋める必要があるため、2 つの主なオプションがあります。

a) C 文字列と_tcscmp(の TCHAR バージョン) を使用しますstrcmp

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

b) コンテナを使用します。std::vectorstd::arrayは異なり、バッファを編集できstd::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

の定数 C 文字列バージョンにclsは、 からアクセスできますcls.c_str()

GetClassNameバイト単位のサイズではなく、バッファの文字単位の長さを取るという事実を反映するように呼び出しを変更したことに注意してください。TCHARのサイズは 1 ではない可能性があるため、それで割る必要があります。

于 2012-10-18T00:26:37.230 に答える