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的主要内容,如果未能解决你的问题,请参考以下文章
如图,VS2017新建MFC对话框之后,工具箱控件不可用怎么办?