目前我们已经创建了一些从 CTreeCtrl 派生的类。 TVN_ITEMEXPANDING 存在根本未发送的问题。
通过反复试验,我们发现必须使用 TVN_ITEMEXPANDING 的 Unicode 版本。否则回调函数不会被调用。
BEGIN_MESSAGE_MAP
...
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDINGW, OnExpand)
END_MESSAGE_MAP()
这有点奇怪,因为我们根本不在 Unicode 应用程序中,并且在程序的其他位置我们使用了 TVN_ITEMEXPANDING,这导致了 ANSI 版本 TVN_ITEMEXPANDINGA。这是在 CommCtrl.h 中定义的
#ifdef UNICODE
#define TVN_SELCHANGING TVN_SELCHANGINGW
#define TVN_SELCHANGED TVN_SELCHANGEDW
#define TVN_GETDISPINFO TVN_GETDISPINFOW
#define TVN_SETDISPINFO TVN_SETDISPINFOW
#define TVN_ITEMEXPANDING TVN_ITEMEXPANDINGW
#define TVN_ITEMEXPANDED TVN_ITEMEXPANDEDW
#define TVN_BEGINDRAG TVN_BEGINDRAGW
#define TVN_BEGINRDRAG TVN_BEGINRDRAGW
#define TVN_DELETEITEM TVN_DELETEITEMW
#define TVN_BEGINLABELEDIT TVN_BEGINLABELEDITW
#define TVN_ENDLABELEDIT TVN_ENDLABELEDITW
#else
#define TVN_SELCHANGING TVN_SELCHANGINGA
#define TVN_SELCHANGED TVN_SELCHANGEDA
#define TVN_GETDISPINFO TVN_GETDISPINFOA
#define TVN_SETDISPINFO TVN_SETDISPINFOA
#define TVN_ITEMEXPANDING TVN_ITEMEXPANDINGA
#define TVN_ITEMEXPANDED TVN_ITEMEXPANDEDA
#define TVN_BEGINDRAG TVN_BEGINDRAGA
#define TVN_BEGINRDRAG TVN_BEGINRDRAGA
#define TVN_DELETEITEM TVN_DELETEITEMA
#define TVN_BEGINLABELEDIT TVN_BEGINLABELEDITA
#define TVN_ENDLABELEDIT TVN_ENDLABELEDITA
#endif
有人知道为什么同一程序的 Unicode 和 ANSI 版本都需要 TVN_ITEMEXPANDED 吗?预先感谢。
刚刚制作了一个测试应用程序来检查上述内容:MFC 对话框应用程序、DLL 中的 MFC、64 位、MBCS、子类树视图控件(CTreeCtrl 派生)。它立即工作并且表现得完全符合预期:如果使用 MBCS 选项编译,则控制类会收到(反映的)ANSI
TVN_ITEMEXPANDING
通知,否则收到 Unicode 通知。
此外,如果项目是使用 MBCS 选项构建的,则
IsWindowUnicode()
函数会返回 FALSE
。控件内容的 Unicode 格式设置 (TVM_GETUNICODEFORMAT
) 也会返回一致的结果。
还发现发送
TVM_SETUNICODEFORMAT
消息可以改变上述行为。例如,已收到 IsWindowUnicode()
消息且 FALSE
设置为 TVM_SETUNICODEFORMAT
(更改为 Unicode)的 MBCS 树视图控件(lParam
返回 1
)将收到 Unicode 通知 (TVN_ITEMEXPANDINGW
) ).
因此,您的项目或编译器设置,或者您的类代码一定有问题。我们发现 Win32 完全支持 MBCS 和 Unicode 树视图控件,并且工作得非常好。上传 MRE 也许会有帮助。