Unicode環境で、ツールチップを利用するには?

解決


柚子  2010-08-11 11:06:25  No: 71868  IP: [192.*.*.*]

前日に続いて質問させて頂きます。

ダイアログで表示するコントロールそれぞれをツールチップに関連づけております。
マルチバイト文字環境でビルドすると問題無く動作しますが、Unicodeでビルドすると関連づけに失敗するのか
コントロール上にマウスカーソルを置いても、何も表示されません。

関連付けコードは下記のようになっております。

/* 関連づけるコード */
/*
 * hWndToolTip: ツールチップのハンドル
 * hWnd: ダイアログのハンドル
 * GetDlgItem( hWnd, IDC_BUTTON ): 関連付ける対象のボタンハンドル
 * MAKEINTRESOURCE(IDC_BUTTON): 表示するメッセージ(中身はリソースのストリングテーブルで定義)
 */
addTooltip( hWndToolTip, hWnd, GetDlgItem( hWnd, IDC_BUTTON ), MAKEINTRESOURCE(IDC_BUTTON) );

/* resource.h */
#define IDC_BUTTON  0x100

/* resource.rc */
STRINGTABLE {
    IDC_BUTTON  "ボタンです"
}

/* 関連付けを行う関数 */
void addTooltip( HWND hWndTip, HWND hWndShow, HWND hWnd, TCHAR *pszText )
{

    TOOLINFO    toolInfo = { 0 };

    toolInfo.cbSize = sizeof(TOOLINFO);
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.hwnd = hWndShow;
    toolInfo.uId = (UINT_PTR)hWnd;
    toolInfo.hinst = (HINSTANCE)(GetWindowLongPtr( hWnd, GWLP_HINSTANCE ));

    if( pszText != NULL )
    {
        toolInfo.lpszText = pszText;
    }
    else
    {
        toolInfo.lpszText = LPSTR_TEXTCALLBACK;
    }

    SendMessage( hWndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo );
    return;

}

マルチバイト環境ですと、SendMessageで1が返りますが
Unicode環境ですと、SendMessageで0が返ります。

共にGetLastErrorを呼んでも、0が返ってきており、ヘッダを追っても
きちんとTOOLINFOは、TOOLINFOWとTOOLINFOAに切り替えられているので
何故Unicodeにすると表示されないのかが、現在見切りも付けられない状態です。

どうぞご教授の程お願いいたします。

編集 削除
仲澤@失業者  2010-08-11 16:12:11  No: 71869  IP: [192.*.*.*]

何らかの理由でSendMessage()、LPSTR_TEXTCALLBACKのUnicode版が採用
されていないのかもしれません。Unicode時に、明示的に

1.SendMessage()の代わりにSendMessageW()
    を使ってみる

2.LPSTR_TEXTCALLBACK  のからりに、明示的に
    LPSTR_TEXTCALLBACKWを使ってみる

これで、うまくいってしまった場合、ところどころUnicodeと
MBCSが混ざってしまっているかもしれません。

編集 削除
仲澤@失業者  2010-08-11 16:22:44  No: 71870  IP: [192.*.*.*]

ごめん間違ったかもm(__)m。
コンパイラとOSが提示されてませんが、
最近はツールチップはUnicode版のはずですね。
そうなるとさっきの発言が「とほほ」かも。

編集 削除
柚子  2010-08-11 18:57:34  No: 71871  IP: [192.*.*.*]

>仲澤@失業者さん
レス有難うございます。
OSはWinXPで、IDEはVC++2008です。
記入せず申し訳ありません。

色々と調べてみたところ、同様の症状の方がおり、無事解決に至りました。
http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/5cc9a772-5174-4180-a1ca-173dc81886d9

UNICODEでは、単純にsizeof(TOOLINFO)としては行けないようでした。
ANSIと共に同様の48byteを返すのに、何故UNICODEではと思っておりますが…

編集 削除
subaru  2010-08-12 13:30:30  No: 71872  IP: [192.*.*.*]

確かANSIかUNICODEではなくて
使用しているcomctl32.dllのバージョンによって
構造体サイズを切り替えなければならなかった覚えがあります。

編集 削除