易语言自绘菜单,超级菜单演示/WINAPI自定义菜单背景颜色,文字颜色

有人发邮件问我,易语言里是否可以自定义菜单或自定义菜单文字颜色背景颜色?在易语言的控件里超级菜单可以达到这一目的,也可以采用自绘的方式。稍后我也会将此类API集成到WinApi操作模块内。

超级菜单方式

// 也就是置入一些参数
.版本 2
.支持库 ExtMenu

.子程序 __启动窗口_创建完毕

超级菜单1.点燃颜色 = #紫红  ' 8388736
超级菜单1.渐变条颜色1 = #浅灰  ' 12632256
超级菜单1.渐变条颜色2 = #褐绿  ' 32896
超级菜单1.菜单条点燃颜色1 = #灰色  ' 8421504
超级菜单1.菜单条点燃颜色2 = #浅灰  ' 12632256
超级菜单1.底色 = #白色  ' 16777215
超级菜单1.置菜单项图片 (测试, 0)

其显示效果

易语言自绘菜单,超级菜单演示/WINAPI自定义菜单背景颜色,文字颜色

自绘方式

在此之前我们需要了解以下函数
  1. SetWindowLong  // 该函数用来改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置
  2. CallWindowProc // 将消息信息传送给指定的窗口过程的函数
  3. RtlMoveMemory // 从指定内存中复制内存至另一内存里
  4. GetMenuItemCount // 返回菜单中条目(菜单项)的数量
  5. GetMenuItemInfo // 取菜单子项
  6. SetMenuItemInfo // 更改菜单项的信息
  7. CreateSolidBrush // 创建一个具有指定颜色的逻辑刷子
  8. FillRect // 函数用指定的画刷填充矩形,此函数包括矩形的左上边界,但不包括矩形的右下边界
  9. DeleteObject // 该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源
  10. GetMenuInfo // 检索指定菜单的信息
  11. SetMenuInfo // 设置指定菜单的信息
  12. GetStockObject // 该函数检索预定义的备用笔、刷子、字体或者调色板的句柄
  13. GetMenuString // 将指定菜单项的正文字符串拷贝到指定缓冲区
  14. SetBkMode // 设置指定DC的背景混合模式,背景混合模式用于与文本,填充画刷和当画笔不是实线时
  15. DrawText // 该函数在指定的矩形里写入格式化的正文,根据指定的方法对正文格式化(扩展的制表符,字符对齐、折行等)
  16. InsertMenu // 该函数插入一个新菜单项到菜单里,并使菜单里其他项下移
以下为部分实现代码(代码来自易语言资源网)稍后我们将该类API集成在WinApi操作模块中,可以下载源码来看看实现的方法,也可以下载模块来直接操作
.版本 2

.子程序 WndProc, 整数型
.参数 hWnd, 整数型
.参数 Msg, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型
.局部变量 hMenu, 整数型
.局部变量 mis, MEASUREITEMSTRUCT
.局部变量 mii, MENUITEMINFO
.局部变量 mi, MENUINFO
.局部变量 i, 整数型
.局部变量 dis, DRAWITEMSTRUCT
.局部变量 bkgbrush, 整数型
.局部变量 string, 文本型
.局部变量 length, 整数型

.判断开始 (Msg = #WM_CONTEXTMENU)
    弹出菜单 (弹出菜单, LOWORD (lParam), HIWORD (lParam))
.判断 (Msg = #WM_INITMENUPOPUP)
    .如果真 (HIWORD (lParam) = 0)  ' 不是系统菜单
        hMenu = wParam
        mi.cbSize = 28
        mi.fMask = 8
        GetMenuInfo (hMenu, mi)
        .如果真 (mi.dwMenuData ≠ -1)
            mi.fMask = 10
            mi.hbrBack = GetStockObject (0)
            mi.dwMenuData = -1
            SetMenuInfo (hMenu, mi)
            mii.cbSize = 48
            mii.fMask = 位或 (#MIIM_FTYPE, #MIIM_DATA)
            .变量循环首 (0, GetMenuItemCount (hMenu) - 1, 1, i)
                GetMenuItemInfo (hMenu, i, 真, mii)
                mii.dwItemData = mii.fType
                mii.fType = 位或 (mii.fType, #MFT_OWNERDRAW)
                SetMenuItemInfo (hMenu, i, 真, mii)
            .变量循环尾 ()
            InsertMenu (hMenu, 0, 3328, -1, 0)
            InsertMenu (hMenu, GetMenuItemCount (hMenu), 3328, -1, 0)  ' 菜单顶端和底端加宽
        .如果真结束

    .如果真结束

.判断 (Msg = #WM_MEASUREITEM)
    RtlMoveMemory_MEASUREITEMSTRUCT1 (mis, lParam, 24)
    .如果真 (mis.CtlType = 1)
        mis.itemWidth = 227
        .如果 (mis.itemID = -1)
            mis.itemHeight = 3  ' 菜单顶端和底端加宽
        .否则
            mis.itemHeight = 选择 (mis.itemData = 2048, 7, 23)
        .如果结束

    .如果真结束
    RtlMoveMemory_MEASUREITEMSTRUCT2 (lParam, mis, 24)
.判断 (Msg = #WM_DRAWITEM)
    RtlMoveMemory_DRAWITEMSTRUCT (dis, lParam, 48)
    .如果真 (dis.CtlType = 1)
        .如果真 (dis.itemID ≠ -1)
KBKB            .如果 (dis.itemData = 2048)
                bkgbrush = CreateSolidBrush (14145495)
                dis.rcItem.Top = dis.rcItem.Top + 3
                dis.rcItem.Bottom = dis.rcItem.Top + 1
                FillRect (dis.hDC, dis.rcItem, bkgbrush)
                DeleteObject (bkgbrush)
                返回 (0)
            .否则
                bkgbrush = CreateSolidBrush (选择 (位与 (dis.itemState, 1) = 1, 15066597, #白色))  ' 选中
                FillRect (dis.hDC, dis.rcItem, bkgbrush)
                DeleteObject (bkgbrush)
            .如果结束
            string = 取空白文本 (255)
            length = GetMenuString (dis.hwndItem, dis.itemID, string, 255, 0)
            SetBkMode (dis.hDC, 1)
            dis.rcItem.Left = dis.rcItem.Left + 35
            DrawText (dis.hDC, string, length, dis.rcItem, 位或 (#DT_SINGLELINE, #DT_VCENTER, #DT_HIDEPREFIX))
        .如果真结束

    .如果真结束

.默认
    返回 (CallWindowProc (OldWndProc, hWnd, Msg, wParam, lParam))
.判断结束
返回 (0)

下载信息 源码名称: 菜单源码 源码适用: 易语言
下载地址
亦行
  • 版权声明: 发表于 2018-11-2022:17:44,共 2818 字。
  • 转载注明:https://www.nanzl.com/archives/824

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: