前日に続いて質問させて頂きます。
ダイアログで表示するコントロールそれぞれをツールチップに関連づけております。
マルチバイト文字環境でビルドすると問題無く動作しますが、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にすると表示されないのかが、現在見切りも付けられない状態です。
どうぞご教授の程お願いいたします。
何らかの理由でSendMessage()、LPSTR_TEXTCALLBACKのUnicode版が採用
されていないのかもしれません。Unicode時に、明示的に
1.SendMessage()の代わりにSendMessageW()
を使ってみる
2.LPSTR_TEXTCALLBACK のからりに、明示的に
LPSTR_TEXTCALLBACKWを使ってみる
これで、うまくいってしまった場合、ところどころUnicodeと
MBCSが混ざってしまっているかもしれません。
ごめん間違ったかもm(__)m。
コンパイラとOSが提示されてませんが、
最近はツールチップはUnicode版のはずですね。
そうなるとさっきの発言が「とほほ」かも。
>仲澤@失業者さん
レス有難うございます。
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ではと思っておりますが…
確かANSIかUNICODEではなくて
使用しているcomctl32.dllのバージョンによって
構造体サイズを切り替えなければならなかった覚えがあります。