VS 2012 MFC 对话框中缺少 WM_WINDOWPOSCHANGING

Posted

技术标签:

【中文标题】VS 2012 MFC 对话框中缺少 WM_WINDOWPOSCHANGING【英文标题】:Missing WM_WINDOWPOSCHANGING in VS 2012 MFC dialog 【发布时间】:2013-09-07 09:12:07 【问题描述】:

我正在尝试实现This Article 但是,当我在资源视图(在消息选项卡中)查看我的对话框“具有”的所有消息时,我看不到此消息。 知道如何捕捉它(它可用吗?是 IDE 问题吗?) 谢谢, 丹妮

【问题讨论】:

也许它甚至不是一个 IDE 问题,该消息只是不在一个短列表中,所以它没有在 IDE 中列出。您可以添加手动输入代码的处理程序。您的窗口是否收到特定消息 - 您可以随时使用Spy++ 工具进行检查。 我看到了关于更改设置以显示那些丢失的消息的说明,但我不知道要更改什么以及何时更改:codeproject.com/Articles/1724/… 这完全取决于你需要做什么,有时不需要等待WM_WINDOWPOSCHANGING,你可以从你的WM_INITDIALOG处理程序调用PostMessage()(或者在你的OnInitDialog()覆盖如果您正在使用 MFC)。您能否提供您在消息标签中看到的内容的屏幕截图? 我收到了大约 30 条消息,但不是我需要的……我手动添加了。 【参考方案1】:

MFC 类向导不显示已在CWnd 基类中实现消息处理程序的消息。要处理WM_WINDOWPOSCHANGING,您只需覆盖CWnd::OnWindowPosChanging

更新:我刚刚检查过,我的 Visual Studio 2012(更新 3)安装确实列出了对话框类的 WM_WINDOWPOSCHANGING。如果它没有为您显示,您可能从 类名称 下拉列表中选择了错误的类。

如果无论出于何种原因在类向导中没有为您显示该消息,您仍然可以手动实现它。类向导只是一种便利,而不是要求。 MFC 通过构造一个Message Map 来实现其消息处理,您可以通过Message Map Macros 添加消息处理程序来扩展它。

在您的对话框类中声明一个具有正确签名和名称的消息处理程序。请注意,afx_msg 宏扩展为空,仅用于证明这是一个 MFC 消息处理程序。

afx_msg void OnWindowPosChanging(WINDOWPOS* lpwndpos);

将消息处理程序添加到对话框的消息映射中:

BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    ...
    ON_WM_WINDOWPOSCHANGING()
END_MESSAGE_MAP()

您可以在WM_ Messages: T - Z 找到要使用的宏以及函数签名和名称。有了这个,你就可以实现你的消息处理程序:

void CMyDialog::OnWindowPosChanging(WINDOWPOS* lpwndpos)

    CDialogEx::OnWindowPosChanging(lpwndpos);

    // TODO: Add your message handler code here

请注意,类向导实现(VS 2010 及更高版本)不再需要源代码中特殊格式的 cmets(就像在 VS6 中使用的那样)。手动添加消息处理程序不会破坏类向导功能。

【讨论】:

它是一个对话框,我需要在它显示之后开始一些东西。有几篇文章讨论了在对话框中使用此消息... @Dani 你可能正在寻找WM_WINDOWPOSCHANGED。不管怎样,请确保您已在类向导右上角的 Class name 下选择了对话框类。 好的,刚刚使用向导创建了 WM_SHOWWINDOW,然后更改了所有内容以匹配我的消息。有用。我不知道为什么属性屏幕中缺少该消息....

以上是关于VS 2012 MFC 对话框中缺少 WM_WINDOWPOSCHANGING的主要内容,如果未能解决你的问题,请参考以下文章

vs2012开发基于MFC的ActiveX控件

如图,VS2017新建MFC对话框之后,工具箱控件不可用怎么办?

使用 mfc 的 EXE(调试)无法在其他 PC 上运行

vs2012 Office2013 读写excel文件

我在 VS-2019 中缺少 Add new item Add "MFC Class From Typelib"

关于安装VS插件vcredist的一些问题