2012-09-25 41 views
3

這是一個老問題,我從來沒有想過 - 想知道如果某人在這裏可能碰巧知道你的頭頂上的答案...爲什麼TTN_NEEDTEXTW但不是TTN_NEEDTEXTA?

在我們的軟件的某些部分(MFC/Win32/MBCS)我的代碼將只接收

TTN_NEEDTEXTW

在我們的軟件的其他部分,我會收到MBCS正確的消息

TTN_NEEDTEXTA

這是沒有意義到m即

我知道我們的軟件可以編譯爲Unicode或不是(我們設置爲使用多字節字符集)。我有一個模糊的回憶,即每個窗口都可以被構建爲Unicode,儘管這是一個模糊的記憶,沒有具體的東西。

有誰知道爲什麼我們會在我們的代碼中的某些地方獲取寬版本消息,儘管編譯爲多字節?

注:

  • 我們絕對不會發送此郵件 - 大概工具提示控制。
  • 我們絕對只在某些地方接收(W)消息,而且絕對只在其他地方接收(A)消息。
  • 我確定所有的編譯模塊都使用MBCS,而不是Unicode,並且編譯目標都指定了MBCS而不是Unicode。
  • 這似乎只發生在CMainFrame託管的窗口和控件上。即主框架之外的Windows可以使用窄版本(比如在對話框中)。

回答

4

集中控制向您發送WM_NOTIFYFORMAT消息,問你「你願意接受MBCS通知或Unicode通知?」缺省情況下,根據窗口是通過CreateWindowExW還是CreateWindowExA創建來進行響應。

+0

小調:使用RegisterClassExA/RegisterClassExW決定窗口的unicode狀態。 – arx

+0

這是有道理的,但到目前爲止,沒有看到爲什麼我們的CFrameWnd派生窗口和託管控件將接收MBCS構建的W變體。跟蹤啓動顯示RegisterClassA和CreateWindowA在課程註冊和創建期間被調用。更奇怪的是,WM_NOTIFYFORMAT僅在我們的代碼中用於跟蹤目的,並且在VC++中包含用於定義其數字標識和ON_WM_NOTIFYFORMAT()宏的路徑。也許當工具提示控件被初始化時,還有另一種方法告訴它要發送什麼樣的消息類型? – Mordachai

+0

工具提示是否可能由其他代碼創建? (例如,listview控件創建它自己的工具提示。) –

相關問題