有关 MFC-CTreeCtrl 的消息

问题描述 投票:0回答:1

目前我们已经创建了一些从 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 吗?预先感谢。

c++ tree mfc message
1个回答
0
投票

刚刚制作了一个测试应用程序来检查上述内容: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 也许会有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.