|
### 易语言窗口菜单焦点保持方案
在易语言中,窗口菜单默认会在窗口失去焦点时变灰,这是Windows的标准行为。不过,我们可以通过一些技巧来模拟菜单始终保持焦点的效果。以下是几种可行的方法:
### 方案一:使用定时器刷新菜单状态
这是最简单的实现方式,通过定时器不断检查并设置菜单状态:
```易语言
.版本 2
.支持库 eAPI
.子程序 __启动窗口_创建完毕
' 创建定时器,每200毫秒检查一次菜单状态
启动窗口定时器 (1, 200)
.子程序 _窗口定时器_周期事件, 整数型
.参数 定时器ID, 整数型
.如果真 (定时器ID = 1)
' 检查窗口是否激活,如果未激活则模拟激活状态
.如果 (取窗口状态 (取运行窗口句柄 ()) ≠ #窗口状态_激活)
' 获取菜单句柄
菜单句柄 = GetMenu (取运行窗口句柄 ())
' 重绘菜单,使其保持高亮状态
DrawMenuBar (取运行窗口句柄 ())
.如果结束
.如果真结束
```
### 方案二:拦截窗口消息,修改菜单绘制逻辑
更高级的方法是通过拦截窗口消息来修改菜单的默认行为:
```易语言
.版本 2
.支持库 eAPI
.子程序 __启动窗口_创建完毕
' 安装窗口子类,用于拦截窗口消息
窗口子类句柄 = SetWindowSubclass (取运行窗口句柄 (), &窗口过程, 1, 0)
.子程序 窗口过程, 整数型, 公开, 窗口消息处理过程
.参数 hWnd, 整数型, 窗口句柄
.参数 uMsg, 整数型, 消息类型
.参数 wParam, 整数型, 消息参数
.参数 lParam, 整数型, 消息参数
.参数 uIdSubclass, 整数型, 子类ID
.参数 dwRefData, 整数型, 引用数据
.如果 (uMsg = #WM_ACTIVATE)
' 拦截窗口激活/非激活消息
.如果 (wParam = #WA_INACTIVE)
' 当窗口失去焦点时,模拟菜单仍处于激活状态
菜单句柄 = GetMenu (hWnd)
DrawMenuBar (hWnd)
' 返回0,表示已处理该消息
返回 (0)
.如果结束
.如果结束
' 其他消息使用默认处理
返回 (DefSubclassProc (hWnd, uMsg, wParam, lParam))
```
### 方案三:使用自定义菜单控件
如果以上方法都不理想,可以考虑使用自定义菜单控件完全替代系统菜单:
```易语言
.版本 2
.支持库 eAPI
.支持库 eGUI
.子程序 __启动窗口_创建完毕
' 创建自定义菜单面板
菜单面板.创建 (0, 0, 取窗口宽度 (取运行窗口句柄 ()), 25, 取运行窗口句柄 ())
菜单面板.置可视 (真)
' 添加菜单项
添加菜单项 (菜单面板, "文件(&F)", 1001)
添加菜单项 (菜单面板, "编辑(&E)", 1002)
添加菜单项 (菜单面板, "查看(&V)", 1003)
.子程序 添加菜单项, 整数型, 公开, 添加自定义菜单项
.参数 菜单容器, 整数型, 菜单面板句柄
.参数 标题, 文本型, 菜单项标题
.参数 菜单项ID, 整数型, 菜单项ID
.局部变量 按钮句柄, 整数型
' 创建菜单项按钮
按钮句柄 = 按钮.创建 (标题, 0, 0, 文本长度 (标题) * 12 + 20, 25, 菜单容器)
按钮.置可视 (按钮句柄, 真)
按钮.置风格 (按钮句柄, #按钮风格_扁平)
' 记录菜单项ID
置窗口数据 (按钮句柄, 菜单项ID)
' 设置菜单项位置(水平排列)
.局部变量 菜单项数量, 整数型
.局部变量 当前X坐标, 整数型
菜单项数量 = 取窗口数据 (菜单容器, 100) + 1
置窗口数据 (菜单容器, 100, 菜单项数量)
当前X坐标 = (菜单项数量 - 1) * 80
置窗口位置 (按钮句柄, 当前X坐标, 0)
' 设置菜单项事件
按钮.置回调 (按钮句柄, &菜单项_被单击)
返回 (按钮句柄)
.子程序 菜单项_被单击, 整数型, 公开, 菜单项点击事件处理
.参数 控件ID, 整数型
.局部变量 菜单项ID, 整数型
菜单项ID = 取窗口数据 (控件ID, 0)
' 处理菜单项点击事件
.判断开始 (菜单项ID)
.判断 (1001)
' 处理"文件"菜单点击
.判断 (1002)
' 处理"编辑"菜单点击
.判断 (1003)
' 处理"查看"菜单点击
.判断结束
```
### 实现建议
1. **优先尝试方案一**:这是最简单的实现方式,适合快速验证效果
2. **性能考虑**:如果使用定时器,注意设置合适的间隔时间,避免过度消耗资源
3. **兼容性**:不同Windows版本可能对菜单绘制有不同的处理方式,建议在多种环境下测试
4. **自定义菜单的优势**:方案三虽然实现复杂,但可以获得最佳的控制效果和视觉一致性
无论选择哪种方案,都可能需要根据实际情况进行调整和优化。如果需要更精确的控制,可能还需要结合Windows API进行更底层的操作。 |
|