如何修改edit control标准上下文菜单的字体大小?
修改Edit Control标准上下文菜单字体大小的方案
你不需要自行构建仿造菜单,通过Win32 API可以直接修改标准上下文菜单的字体大小,具体步骤如下:
- 拦截
WM_CONTEXTMENU消息:在承载Edit控件的窗口过程中,捕获目标Edit控件触发的WM_CONTEXTMENU消息。 - 获取标准上下文菜单句柄:通过向Edit控件发送
EM_GETCONTEXTMENU消息,获取系统生成的标准上下文菜单句柄。 - 自定义菜单字体:使用
CreateFont创建指定字号的字体,再通过SetMenuInfo(支持批量应用到子菜单)或遍历菜单项调用SetMenuItemInfo,为菜单设置新字体。 - 显示修改后的菜单:调用
TrackPopupMenuEx显示调整好字体的菜单,并返回0阻止系统默认处理流程。
示例代码片段(Win32 C++)
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CONTEXTMENU: { HWND targetEdit = (HWND)wParam; // 替换为你的Edit控件ID if (targetEdit == GetDlgItem(hwnd, IDC_CUSTOM_EDIT)) { // 获取Edit控件的标准上下文菜单 HMENU hCtxMenu = (HMENU)SendMessage(targetEdit, EM_GETCONTEXTMENU, 0, 0); if (hCtxMenu) { // 创建14号Segoe UI字体(可按需调整参数) HFONT customFont = CreateFont( 14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Segoe UI" ); if (customFont) { MENUINFO menuInfo = { sizeof(MENUINFO) }; menuInfo.fMask = MIM_STYLE | MIM_APPLYTOSUBMENUS | MIM_DATA; menuInfo.dwStyle = MNS_NOTIFYBYPOS; menuInfo.dwMenuData = (ULONG_PTR)customFont; // 应用字体到菜单及所有子菜单 SetMenuInfo(hCtxMenu, &menuInfo); // 可选:遍历菜单项单独设置(兼容部分特殊场景) int itemCount = GetMenuItemCount(hCtxMenu); for (int i = 0; i < itemCount; i++) { MENUITEMINFO itemInfo = { sizeof(MENUITEMINFO) }; itemInfo.fMask = MIIM_DATA; GetMenuItemInfo(hCtxMenu, i, TRUE, &itemInfo); itemInfo.dwItemData = (ULONG_PTR)customFont; SetMenuItemInfo(hCtxMenu, i, TRUE, &itemInfo); } } } // 定位并显示菜单 POINT menuPos = { LOWORD(lParam), HIWORD(lParam) }; TrackPopupMenuEx(hCtxMenu, TPM_LEFTALIGN | TPM_TOPALIGN, menuPos.x, menuPos.y, hwnd, NULL); return 0; // 覆盖系统默认菜单显示逻辑 } break; } // 其他消息处理逻辑... default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; }
如果需要全局修改所有Edit控件的上下文菜单字体,可使用SetWindowsHookEx设置全局钩子,但实现复杂度更高,仅推荐在全局场景下使用。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

