如何修改CEdit控件的上下文菜单?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修改CEdit控件的上下文菜单?相关的知识,希望对你有一定的参考价值。

在windows7之前,解决方案很简单。只需添加自己的菜单并编写自己的“撤消,重做,剪切,复制,粘贴,删除,全选”菜单项。但现在这已经不可能了,因为菜单变得非常复杂,包含unicode和输入消息。

答案

您需要子类化编辑控件然后使用钩子,以下是一个示例代码:

LRESULT CALLBACK EditSubclassProc(HWND hWndEdit, UINT Msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIDSubclass, DWORD_PTR dwRefData)
{
    LRESULT ret{};

    switch (Msg)
    {
    case WM_CONTEXTMENU:        
    {
        HWINEVENTHOOK hWinEventHook{ SetWinEventHook(EVENT_SYSTEM_MENUPOPUPSTART, EVENT_SYSTEM_MENUPOPUPSTART, NULL,
            [](HWINEVENTHOOK hWinEventHook, DWORD Event, HWND hWnd, LONG idObject, LONG idChild, DWORD idEventThread, DWORD dwmsEventTime)
            {
                if (idObject == OBJID_CLIENT && idChild == CHILDID_SELF)
                {
                    HMENU hMenuContextEdit{ (HMENU)SendMessage(hWnd, MN_GETHMENU, NULL, NULL) };

                    // Do what you want to do
                }
            },
            GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_OUTOFCONTEXT) };

        ret = DefSubclassProc(hWndEditMessage, Msg, wParam, lParam);

        UnhookWinEvent(hWinEventHook);
    }
    break;
    default:
        {
            ret = DefSubclassProc(hWndEdit, Msg, wParam, lParam);
        }
        break;
    }

    return ret;
}
另一答案

好的,我发现了怎么做

static bool is_first_time;

case WM_CONTEXTMENU: {
   is_first_time = true;
   original_window_proc(message,wparam,lparam);
   break;

case WM_ENTERIDLE:
    if (wparam == MSGF_MENU) {
        if (is_first_time) {
            is_first_time = false; 
            MENUBARINFO mbi;
            memset(&mbi, 0, sizeof(MENUBARINFO));
            mbi.cbSize = sizeof(MENUBARINFO);
            GetMenuBarInfo((HWND)lparam, OBJID_CLIENT, 0, &mbi);
            if (::IsMenu((HMENU)mbi.hMenu)) {
               .... add your menu items here
            }
        }
    }

不幸的是,这不起作用,因为代码使用TrackPopupMenuTPM_RETURNCMDTPM_NONOTIFY标志。因此,您可以添加新的菜单项,但无法处理命令。糟糕的微软,非常糟糕的设计。

以上是关于如何修改CEdit控件的上下文菜单?的主要内容,如果未能解决你的问题,请参考以下文章

CEdit控件的相关用法

上下文菜单不适用于两个片段

小 CEdit 控件的 CSpinButtonCtrl 绘图问题

即使焦点在其他对话框上,我们如何才能使 Cedit 控件文本突出显示?

编辑框等控件边框美化(继承CEdit,然后覆盖OnMouseLeave, OnSetFocus, OnPaint函数即可。原来的CEdit虽然代码不可见,但它也是有句柄的,照样随便画)

MFC输入框CEdit控件十六进制转换