- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图了解消息路由在 MFC 中的工作原理,但我对此有一些疑问。想象一个扩展 CWnd 的控件。我的第一个问题是:该控件中的所有消息是否都传递给了父控件?
我知道 CStatic 不会发生这种情况,它仅在您设置 SS_NOTIFY 样式时传递特定消息。我想了解的是 CStatic 特有的情况还是所有控件都会出现这种情况。具体来说,我正在尝试制作一个具有多个子控件的控件,其唯一目的是定义它们的布局。我希望子控件的所有消息都由该中间控件的父控件处理。例如,如果此布局控件有一个子按钮,则单击该按钮时,消息将发送给父级进行处理。
但是我不打算手动处理所有消息。那么,如果我从 CWnd 而不是 CStatic 扩展我的控制,消息会被传递吗? FORWARD_NOTIFICATIONS() 在 MFC 中可用吗?如果不是,我宁愿扩展我的中间类来根据需要处理消息。您还知道其他解决方案吗?
最佳答案
消息被发送到窗口本身。
一些窗口向它们的父窗口发送消息,通常以 WM_NOTIFY 消息的形式,或者(像按钮一样)以像 BN_CLICKED 这样的“特殊”消息的形式。
MFC 有一个系统(“反射”系统)让窗口将这些消息发送回窗口本身,这样您就可以在控件中处理消息而不是涉及父控件。
这就是它在抽象中的大致工作方式。您想要的(让父控件处理发送给所有子控件的所有消息)通常不是您“应该”做的。例如,您不希望将子窗口的所有 WM_PAINT 都发送给父窗口。
您想要做的(处理按钮点击)是不同的。按钮点击以 BN_CLICKED 的形式由按钮“发出”。无论如何,这些都将由 parent 处理。
如果你还是下定决心,可以接 pipe 窗口的WndProc做一些“过滤”。通常这是使用 PreTranslateMessage() 虚拟函数完成的。
关于c++ - 了解 CStatic 和 CWnd 以及消息路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8503495/
根据 msdn ,当我用 CWnd::FromHandle 得到 CWnd* 时, The pointer may be temporary and should not be stored for
我在一个高度多线程的应用程序上遇到了无数次崩溃。 阅读这些 MSDN page , technical note和 this article on TLS ,我已经了解 CWnd 对象被映射到 Thr
我有一个动态创建的 CWnd 窗口,标题栏区域和任务栏的图标似乎是随机选择的。 要设置图标,我调用: // Set the icon for this dialog. The framework d
我的应用程序具有基于 ATL 的 GUI(CWnd、CDialog、...),它由多个页面(CDialog)组成。其中一个页面是空的,但它有一个占位符框架 (CWnd),可随对话框调整大小。一切都构建
H, 我有一个旧的 MFC 应用程序,它有一个继承自 CWnd 的类。我正在与原作者交谈,他说 Cwnd::Create() 创建了一个新线程。但是,我在 MSDN 文档中找不到对此的任何引用 htt
我正在尝试调用 CWnd 类的函数 GetParent()。每次都会抛出异常。我正在从工作线程调用该函数。 这是导致异常的行:CWnd* parent = this->GetParent(); 我也试
我有一个显示图像的自定义控件。当图像超过可显示大小时,它会显示滚动条。出于某种原因,我想知道是否显示水平或垂直滚动条。我在 CWnd 类中找不到任何直接函数。 我找到了 GetScrollBarI
我编写了一个 MFC 应用程序,需要一个不会将输入焦点从另一个窗口移开的按钮。 不幸的是,当用户用鼠标单击按钮时,删除 WS_TABSTOP 样式没有帮助。当我阻止 WM_LBUTTONDOWN 时,
我目前大量使用这样的代码来确定控件在窗口客户区内的位置: CRect rect; GetDlgItem(IDC_CONTROL_ID)->GetWindowRect(&rect); ScreenToC
如何获取 CWnd* 的高度和宽度? CWnd 窗口是否正确?为什么不是命令: CWnd* parent = this->GetParent(); // C++ command parent->Get
背景 MFC CWnd::SetTimer调用 WinAPI 的 SetTimer简单地。 _AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEve
我有一个 CWnd 类名 mywindow 的成员 我想给它添加一个滚动条。 我该怎么做? 我已经尝试做: mywindow.EnableScrollBarCtrl(SB_BOTH,TRUE); 它显
我有一个对话框,CFormView,其中包含一些按钮和一个面板,其中包含 Tabcontrol、单选按钮、文本输入字段等。 因此,在我的面板 CWnd 上,我创建了如下输入字段: pEdit = ne
(最后一行有一个 TL;DR) 我正在实现一个处理程序来关闭在软件应用程序中打开的选定窗口。这是一个粗略的代码: void CDlg_Dummy_Dialog::OnCloseWindows() {
我正在编写一个带有多个控件的 MFC 对话框。我目前有一个 CWnd,它位于 dialog 的右半部分。单击编辑按钮后,子 CWnd 会调整大小以占据对话框的较大部分。 但是,现在当我尝试调整窗口大小
如果我有一个带有按钮控件的 MFC 对话框,有没有办法使用按钮的 ID(例如 IDC_BUTTON_YES)为该控件构造 HWND 或 CWND? 最佳答案 是的,可以使用MFC对话框的GetDlgI
所以我有一个 MFC 应用程序,当我们执行某些操作时它会闪烁。所以我想我应该设置 SetRedraw(false) 并在函数结束时将其设置为 true。 该应用程序不再刷新,但如果我在 SetRedr
我是一个 C++ 新手,所以请多多包涵。 位于函数内的这行代码: CWnd* pWnd = CWnd::FindWindow("Shell_TrayWnd", ""); CWnd 显示为“未定义”。我
我正在处理我们的 32 位 MFC VC2010 应用程序中出现的偶发生产问题。该应用程序在 Windows Server 2008 R2 Standard SP1 64 位上运行。 此问题是由于无法
我有一个派生自 CWnd 的自定义类,我想从工作线程向其发布消息。我正在使用 PostMessage 函数来实现这一点。 PostMessage 的第一个参数是我的类的 HWND 类型句柄,接下来是我
我是一名优秀的程序员,十分优秀!