c++ - 在 createddialog 创建的窗口中捕获 OnMouseMove 消息以进行编辑控件?

标签 c++ visual-studio onmousemove

我有一个由 CreateDialog() 创建的对话窗口.

在对话窗口中有一个由CreateDialog() 自动创建的文本编辑控件。打电话,但我似乎听不到 OnMouseMove它的消息 - 只有它的父窗口(控件,而不是对话框)。 CreateDialog()只允许您为主对话框(不是子对象,如编辑控件)设置过程函数,如果我捕获 OnMouseMove那里的消息,它们只会触发主对话框本身上的鼠标移动(任何没有控件的地方,例如按钮,文本编辑框等)。

没有使用 CreateWindowEx() 手动创建窗口(以及所有子对象),有没有办法捕捉 OnMouseMove与特定文本编辑控件通过其 ID 关联的消息还是什么?我已通过 GetDlgItem() 检索到它的句柄.

我最终要完成的是阅读鼠标光标下方的文本并在单词被识别/匹配时显示相关的工具提示,如果您有任何想法,我绝对愿意接受其他选择!

这是基本代码:

使用 DBG_DLG 创建对话框定义控件的模板

hDbg = CreateDialog(hCurInst, TEXT("DBG_DLG"), 0, DbgDlgProc);
DBG_DLG模板在项目的 .rc 中定义文件。我找不到在此处粘贴该代码的简单方法,但它有一个特定的文本编辑控件,我试图用 ID 捕获 ID_OP_ED .

来自DbgDlgProc()的相关代码这不起作用,并且只捕获与主对话框相关的消息,而不是控件本身。将鼠标悬停在控件上不会导致此例程捕获任何消息。

BOOL CALLBACK DbgDlgProc(
                         HWND hwnd,
                         UINT message,
                         WPARAM wParam,
                         LPARAM lParam
                         )
{

    switch(message)
    {
    case WM_INITDIALOG:

        return TRUE;
    case WM_MOUSEMOVE:
        OnMouseMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), (DWORD)wParam);
        return FALSE;

最佳答案

一旦你有了子文本编辑的 HWND(来自 GetDlgItem() ),你可以直接子类化它,使用 SetWindowLongPtr()或更好SetWindowSubclass() .您的子类将接收所有直接发送到控件的消息。

有关详细信息,请参阅 MSDN:

Subclassing Controls

关于c++ - 在 createddialog 创建的窗口中捕获 OnMouseMove 消息以进行编辑控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60355560/

相关文章:

javascript - 如何修复仅在 wordpress 网站上不起作用的 javascript onmousemove

javascript - 幻灯片的多个实例破坏了代码

c++ - 有没有办法为类的指针定义括号运算符?

c++ - 获取堆栈溢出,找不到位置

c++ - 是否可以在 C++ 中使用 DateTime 值?

c++ - 如何在没有 Qt 项目的情况下在 Visual Studio 中使用 Qt 资源文件?

sql-server - 用于执行 sql 的 visual studio 扩展

c# - 如何让工具提示跟随鼠标?

c++ - 方法延迟整个程序的时间延迟

c++ - 为什么使用构造函数而不是函数?