- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
创建标准窗口控件(例如 "EDIT"
控件)时,其 WNDPROC
被定义为窗口类的一部分(即 "EDIT "
有一个特定的 WNDPROC
,旨在使窗口显示并充当编辑控件。
MFC 允许您通过它们的包装类与此类控件进行交互,例如 CEdit
包装了 "EDIT"
窗口控件的专用消息。
MFC 进一步允许您将 "EDIT"
窗口的实例绑定(bind)到 CEdit 的 C++ 子类,例如 CMyEdit
,您可以在其中覆盖继承的虚函数CEdit
和 CWnd
,您可以定义一个消息表来访问/覆盖发送到窗口实例本身的消息。
有CWnd::Default() ,它使用当前消息参数调用 this->DefWndProc。这似乎是在 WNDPROC
中查找与之关联的 HWND。那么这是正确的答案吗:调用 DefWndProc()(或者同样地,Default()),它将把它传递给 Windows 控件的 WNDPROC
?
显然,这与其他消息表处理程序不同,后者可以返回 FALSE 以指示它们没有处理该消息,并且 MFC 会自动将消息沿类继承层次结构向上路由到该消息的下一个消息处理程序,或者,我假设,Default() 将由 native WNDPROC
处理?
如果我定义一个任意的消息处理程序,例如 WM_SETTEXT,那么将此消息传递给 "EDIT"
WNDPROC
的正确方法是什么?
我也很想知道是否有办法将消息传递给父类(super class)(C++ 类层次结构)进行处理?许多 OnXXX 样式的处理程序确实有办法这样做,但是是否有适用于 ON_MESSAGE 处理程序的机制?
class CDynamicMenuControlEdit : public CEdit
{
...
LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
...
}
BEGIN_MESSAGE_MAP(CDynamicMenuControlEdit, CEdit)
...
ON_MESSAGE(WM_SETTEXT, OnSetText)
...
END_MESSAGE_MAP()
LRESULT CDynamicMenuControlEdit::OnSetText(
WPARAM wParam, // not used; must be zero
LPARAM lParam // window-text string (LPCTSTR)
)
{
if (m_bHasFocus)
{
// do normal thing
// !!! THIS IS MY QUESTION: IS THIS CALLING EDIT's WNDPROC, or ::DefWinProc()? !!!
return DefWindowProc(WM_SETTEXT, wParam, lParam);
}
...
}
澄清
您可以在 C++ 级别拥有多个 MFC 子类 -
因此 C 继承 B 继承 A,其中 A 是 MFC 类(例如 CEdit
)。
它们中的每一个都可以有一个 MFC 消息表 - 即 BEGIN_MESSAGE_MAP
... END_MESSAGE_MAP
每个都可以有一个处理任意窗口消息的处理程序,例如 WM_MESSAGE(WM_SETTEXT, OnSetText)
- OnSetText
成员不一定是虚拟的 - 只是一个静态成员(每个 MFC 子类都可以以任意方式路由该消息)。
我的问题是 - 因为 WM_MESSAGE
调度条目没有返回值,我如何允许 MFC 在返回给真正的 Windows 'EDIT' 类的 wndproc?
或者是否所有此类条目都旨在 MFC 设计级别不被遍历?即,子类化程度最高的层的调度程序是唯一被调用的?如果它想利用一个继承的成员,它必须手动进行调用 - MFC 根本没有为此提供任何特定的通用结构?
最佳答案
调用 Default()
将导致响应消息时发生的“正常”处理。我不完全清楚你想要实现什么,但在我看来调用 Default()
是你想要做的。
如果您在 CWnd
处理程序中查看大量来自 Windows 消息的处理程序(以及从 CWnd
派生的类的处理程序,例如 CEdit
) 你会看到他们调用了 Default()
。
明智的话,Default()
实际上会使用原始消息具有的任何参数 - 您无法更改它们。
关于windows - 如何将消息路由到控件的标准 WNDPROC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15252435/
我有一个让我抓狂的问题。我花了一个星期的时间来追查这个错误,可能只是我对互操作的理解不如我想的那样。在这里: public class User { public const int GWL_W
我正在尝试处理 .NET WebBrowser 类型的 Close 事件,这似乎不是开箱即用的。 ( 编辑: 当在浏览器中运行的脚本中发出 window.close() 调用时,会发出此事件。) 我见
一天前,我开始重写我的一个旧组件,并决定提高其可读性。我的组件是一个典型的 TWinControl,它已重写 WndProc 来处理我自己的大量消息。每条消息都有很多代码,阅读代码成了一个问题。 因此
我正在阅读一些教程,遇到以下结构: protected override void WndProc( ref Message m ) { ... base.WndProc( ref m
我想在第二个线程上创建一个表单,该表单将在其 WndProc 方法中接收消息。创建这样的隐形表格的推荐方法是什么?设置“ShowInTaskbar=false”和“Visible=false”是否足够
我的表单中有以下 WndProc 处理程序。它应该防止水平移动表单(只允许垂直移动): protected override void WndProc(ref System.Windows.Forms
我被困住了。我有一个结构 vector ,其成员之一是 HWND。我使用这些 HWND 来处理消息,其他成员是特定于实例的参数。我使用 lpParam 将指向每个新创建的结构实例的指针传递给 WndP
我正在尝试创建一个自定义 GLWindow 类,其中包括我对 OpenGL 窗口的所有设置。但是,我还想在我的 GLWindow 类中包含用于发送到窗口的消息的 WndProc 回调函数。 GLWin
我创建了一个创建DLL 的项目。该项目使用WFS方法,它们访问一些硬件(设备)以获取信息或执行一些命令。 在我的项目中,我首先打开这些设备然后注册它们,然后我使用其他方法获取信息或执行。 HRESUL
我不是 C++ 的新手,但是 Win32 编程的概念对我来说是相当新的。无论如何,当 WM_NCHITTEST 消息通过 WndProc 传递时,我在获取 X 和 Y 坐标时遇到了一些麻烦。为了立即尝
我有一个 Window 类,它包含一个方法来设置窗口句柄 (HWND) 的属性。该方法执行以下功能: _hWnd = CreateWindowEx(dwExStyle, _wcex.lpszClass
我想在它自己的 wndproc 中处理所有 ListBox 消息传递,用于自己的透明项目绘画与 MainWindow 中显示的图像混合。不幸的是,现在只有 WM_PAINT、WM_ERASEBKGND
如果我有一个控制台应用程序,它的句柄是这样设置的; HWND hWnd = GetConsoleWindow(); 那我该如何为窗口设置一个新的wndProc呢? 我尝试使用 SetWindowLon
创建标准窗口控件(例如 "EDIT" 控件)时,其 WNDPROC 被定义为窗口类的一部分(即 "EDIT " 有一个特定的 WNDPROC,旨在使窗口显示并充当编辑控件。 MFC 允许您通过它们的包
当我创建一个新的 Win32 应用程序时,我注意到函数: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
我想知道是否有一种方法可以缩短这段代码,是否有办法制作一个 #define 来缩短我在消息开关中执行 if 语句的方式。我检查我是否已经设置了一个函数,如果有我就调用它这只是我的 wndproc 的一
我一直在四处寻找,并没有真正看到太多关于为什么有人会覆盖 wndproc 来处理消息的信息。 所以我想知道: 为什么要这样做? 什么时候做? 它在 C# 中的一般用途是什么? 当看到串行 COM 从计
这是我目前所拥有的...即使我实例化了一个 Window(WindowBase 的子类),我还是收到了一个错误,即试图调用一个纯虚函数。基本上,我的程序试图调用 WindowBase::WndProc
我有一个小问题希望有人能帮助我。有什么方法可以连接到其他应用程序 WNDPROC? 情况是我想在另一个应用程序菜单栏中插入一个菜单,并且我想为每个菜单项定义命令。 我能够使用一些 Win32 API
要与特定服务通信,我必须覆盖 WindProc。并接收窗口消息。 但是,当表单最小化时,我不再收到任何消息。我知道它必须是那样的,但是有解决方法吗?我不想有一个始终保持打开状态的隐藏表单... 最佳答
我是一名优秀的程序员,十分优秀!