【PB案例学习笔记】-24创建一个窗口图形菜单

写在前面

这是PB案例学习笔记系列文章的第24篇,该系列文章适合具有一定PB基础的读者。

通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。

文章中设计到的源码,小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git

gitee代码仓库

需要源代码的小伙伴们可以自行下载查看,后续文章涉及到的案例代码也都会提交到这个仓库【pb-project-example

如果对小伙伴有所帮助,希望能给一个小星星⭐支持一下小凡。

一、小目标

继上一个案例之后,这个案例我们将制作一个图形菜单。案例中需要用到图形菜单技术,制作图形菜单可以使界面变得

更加友好美观。最终效果如下图所示

图形菜单最终效果

二、创作思路

要实现图形菜单,我们需要用到LoadImageA()SetMenuItemBitmaps()GetMenuItemID()ModifyMenu()等函数。

利用这些函数来加载一个图片,给菜单设置图标。

三、创建程序基本框架

① 新建examplework工作区

② 新建exampleapp应用

③ 新建菜单,保存为m_mymenu

④ 新建w_main窗口,将Title属性设置为"图形菜单",将MenuName属性设置为m_mymenu

由于文章篇幅原因,以上步骤不再赘述。如果忘记怎么操作得小伙伴可以翻一翻该系列之前文章

四、设置Menu菜单

① 创建菜单基本框架。如下图所示

创建菜单基本框架

② 保存菜单

五、编写代码

① 定义扩展函数

Declare Local External Functions 选项卡中添加如下代码

FUNCTION ulong LoadImageA(ulong hintance, string filename,uint utype,int x,int y,uint fload)  LIBRARY "USER32.DLL"
FUNCTION boolean SetMenuItemBitmaps(ulong hmenu,uint upos,uint flags,ulong handle_bm1,ulong handle_bm2)  LIBRARY "USER32.DLL"
FUNCTION int GetSystemMetrics(  int nIndex ) LIBRARY "USER32.DLL"
FUNCTION ulong GetMenuItemID(ulong hMenu,uint uItem) LIBRARY "USER32.DLL"
FUNCTION int GetSubMenu(ulong hMenu,int pos) LIBRARY "USER32.DLL"
FUNCTION ulong GetMenu(ulong hWindow) LIBRARY "USER32.DLL"
FUNCTION boolean ModifyMenu(ulong  hMnu, ulong uPosition, ulong uFlags, ulong uIDNewItem, long lpNewI) alias for ModifyMenuA LIBRARY "USER32.DLL"

② 准备图片

在应用根目录下准备好如下两张图片,图片格式为bmp。注:这里的图片格式必须是bmp格式,否则没法设置

准备图片

③ 在w_main窗口的Open事件中输入如下代码

Long		ll_MainHandle
long		ll_SubMenuHandle
integer	li_MenuItemID
long		ll_X
long		ll_Y
long		ll_BitmapHandleA
long		ll_BitmapHandleB
// Win32 常量
Integer IMAGE_BITMAP	   = 0
Integer LR_LOADFROMFILE = 16
Integer SM_CXMENUCHECK  = 71
Integer SM_CYMENUCHECK	= 72
Integer MF_BITMAP			= 4
Integer MF_BYCOMMAND		= 0
Integer MF_BYPOSITION	= 1024
// 获取菜单句柄
ll_MainHandle = GetMenu(Handle(this))
//获取第一个菜单的句柄
ll_SubMenuHandle = GetSubMenu(ll_MainHandle,0)
//以原始大小装入图片
ll_BitmapHandleA = LoadImageA(0,'1.bmp',0,0,0,LR_LOADFROMFILE)
ll_BitmapHandleB = LoadImageA(0,'2.bmp',0,0,0,LR_LOADFROMFILE)
li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,0)
ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapHandleA)
li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,1)
ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapHandleB)
ll_SubMenuHandle = GetSubMenu(ll_SubMenuHandle,2)
li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,0)
ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapHandleA)
li_MenuItemID = GetMenuItemID(ll_SubMenuHandle,1)
ModifyMenu(ll_SubMenuHandle,li_MenuItemID,MF_BITMAP,li_MenuItemId,ll_BitmapHandleB)


// back to the top


//Now get the handle of the second submenu..
ll_SubMenuHandle = GetSubMenu(ll_MainHandle,1)

// Get sizes for the pictures, use winapi for the bitmaps sizes
ll_x = GetSystemMetrics(SM_CXMENUCHECK) 
ll_y = GetSystemMetrics(SM_CYMENUCHECK) 

// Load the images using the dimensions for the checked state
ll_BitmapHandleA = LoadImageA(0,'1.bmp',  IMAGE_BITMAP	,ll_x,ll_y,LR_LOADFROMFILE)
ll_BitmapHandleB = LoadImageA(0,'2.bmp',IMAGE_BITMAP	,ll_x,ll_y,LR_LOADFROMFILE)

SetMenuItemBitmaps(ll_SubMenuHandle,0,MF_BYPOSITION,ll_BitmapHandleA,ll_BitmapHandleB)
SetMenuItemBitmaps(ll_SubMenuHandle,1,MF_BYPOSITION,ll_BitmapHandleB,ll_BitmapHandleA) 
// Get a handle the third submenu menu item
ll_SubMenuHandle = GetSubMenu(ll_SubMenuHandle,2)
SetMenuItemBitmaps(ll_SubMenuHandle,0,MF_BYPOSITION,ll_BitmapHandleA,ll_BitmapHandleB)
SetMenuItemBitmaps(ll_SubMenuHandle,1,MF_BYPOSITION,ll_BitmapHandleB,ll_BitmapHandleA) 

以下是代码的详细解释和注释:

  1. 定义了一些Win32常量,包括加载位图、菜单项标识、菜单项位置等。
  2. 获取主菜单的句柄。
  3. 获取主菜单中第一个子菜单的句柄。
  4. 使用LoadImageA函数加载两个位图文件(1.bmp和2.bmp)。
  5. 获取第一个子菜单中第一个菜单项的标识。
  6. 使用ModifyMenu函数将第一个菜单项的位图替换为加载的第一个位图。
  7. 获取第一个子菜单中第二个菜单项的标识。
  8. 使用ModifyMenu函数将第二个菜单项的位图替换为加载的第二个位图。
  9. 获取第一个子菜单中第三个菜单项的句柄。
  10. 重复步骤6和7,将第三个菜单项的位图替换为加载的位图。
  11. 获取第二个子菜单的句柄。
  12. 获取位图的大小。
  13. 使用LoadImageA函数再次加载位图,但这次使用了位图的大小。
  14. 使用SetMenuItemBitmaps函数将加载的位图设置为第二个子菜单中的菜单项的位图。
  15. 重复步骤14,将第二个子菜单中第二个菜单项的位图设置为加载的位图。
  16. 获取第二个子菜单中第三个菜单项的句柄。
  17. 重复步骤14和15,将第三个菜单项的位图替换为加载的位图。

这段代码的目的是在菜单项中插入位图,以增强用户界面的视觉效果。通过加载并设置位图,可以为菜单项添加图像,使菜单看起来更加生动和吸引人。

④ 在开发界面左边的System Tree窗口中双击exampleapp,并在其Open事件中添加如下代码

open(w_main)

六、运行程序

代码都添加完了,我们来验证下劳动成果,看看能不能达到预期效果。

最终效果

本期内容到这儿就结束了,★,°:.☆( ̄▽ ̄)/$:.°★ 。 希望对您有所帮助

我们下期再见 ヾ(•ω•`)o (●’◡’●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/744963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第一百二十九节 Java面向对象设计 - Java枚举比较

Java面向对象设计 - Java枚举比较 您可以通过三种方式比较两个枚举常量: 使用Enum类的compareTo()方法使用Enum类的equals()方法使用运算符 Enum类的compareTo()方法比较同一枚举类型的两个枚举常量。它返回两个枚举常量的序数差。如果两个枚举常量相同&#xff0…

《山西化工》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问:《山西化工》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊。 问:《山西化工》级别? 答:省级。主办单位:山西省工业和信息化厅 主管单位:山…

基于SaaS平台的iHRM管理系统测试学习

目录 目录 1、登录模块 2、员工管理模块 3、Postmannewman软件的安装,学习 1、Postman的使用 2、Postman断言 3、全局变量和环境变量 4、请求时间戳 5、Postman关联 6、批量执行测试用例 7、Postman生成测试报告 8、Postman读取外部数据文件&#xff08…

Java——IO流(一)-(7/8):字节流-FileOutputStream、字节流完成文件拷贝

目录 文件字节输出流:写字节出去 构造器及常用方法 实例演示 案例:文件复制 过程分析 复制照片 复制文件 文件字节输出流:写字节出去 FileOutputStream(文件字节输出流) 作用:以内存为基准&#x…

如何提高pcdn技术的传输效率?

提高PCDN技术的传输效率是一个复杂且多层面的任务,涉及多个关键策略和方法的结合。以下是一些具体的建议和措施,有助于提升PCDN技术的传输效率: 一.优化缓存策略: 精准定位热点内容,优先将这部分内容缓存…

《数字图像处理》实验报告四

一、实验任务与要求 对 Fig0403.tif 进行傅里叶变换并显示其频谱图像;fft2(x) 对 Fig0405.tif 图像进行填充和非填充的高斯滤波,并观察其不同;paddedsize,fft2(x,m,n) 由 sobel 空间滤波算子生成相应的频率…

小柴冲刺嵌入式系统设计师系列总目录

工作两年 逐渐意识到基础知识的重要性✌️ 意识到掌握了这个证书好像就已经掌握了80%工作中用到的知识了。剩下的就在工作的实战中学习 来和小柴一起冲刺软考吧!加油😜 【小柴冲刺软考中级嵌入式系统设计师系列】总目录 前言 专栏目标:冲刺…

最新国内首码对接app平台汇总,一手项目资源!

在当前激烈的移动应用市场竞争环境下,有效推广首次代码App项目变得至关重要。文章将探讨一些推广首次代码App项目的策略和适用的推广渠道,助于开发者获取更多流量和用户关注。 选择可靠的平台来进行推广。 在推广首码App项目之前,首先要考虑…

lmdeploy部署chatglm3模型并对话

lmdeploy部署chatglm3模型并对话 环境准备创建虚拟环境安装组件下载模型 chat启动模型并对话启动成api_server服务并对话启动成gradio服务 环境准备 使用30% A100 来运行chatglm3模型,采用lmdeploy来启动。 创建虚拟环境 # 创建虚拟环境 conda create -n langcha…

如何利用AI工具高效写作?

利用AI工具进行高效写作已经成为许多人的选择,因为它们能够帮助用户节省时间、提高效率,并在一定程度上保证写作质量。下面小编就和大家分享的一些具体的步骤和建议,帮助大家更好地利用AI工具进行写作。 1.选择合适的AI写作工具 根据自己的写…

以敏感数据保护为中心,建立健全高校数据安全治理体系

教育行业数据安全事件频发 2023年8月,南昌某高校3万余条师生个人信息数据在境外互联网上被公开售卖,该校受到责令改正、警告并处80万元人民币罚款的处罚,主要责任人被罚款5万元人民币。2023 年 7月,中国人民大学一名毕业生马某某…

BarTender版软件下载及安装教程

​根据行业数据显示强大的配套应用软件甚至能够管理系统安全性、网络打印功能、文档发布、打印作业记录等,为满足不同的需要和预算,BarTender 提供四个版本,每个都拥有卓越的功能和特性。根据软件大数据显示多国语言支持:轻松设计…

微信小程序-人脸核身解决方案

微信小程序-人脸核身解决方案 名词解释 由于不同公司对于 人脸识别的用词不一致,微信小程序背靠腾讯,因此以下的名词主要采集于腾讯云的解释 人脸识别: 主要关注人脸的检测、分析、比对等技术层面,侧重于识别个体身份的技术实现。…

【SSM】医疗健康平台-管理端-统计分析

知识目标 了解ECharts,能够说出ECharts的作用 掌握会员数量统计的实现,能够使用Echarts绘制会员数量统计图形报表 掌握套餐预约占比统计的实现,能够使用Echarts绘制套餐预约占比统计图形报表 掌握运营数据报表的实现 通过对数据进行统计…

Games101 透视投影矩阵推导

目录 齐次坐标 透视投影 透视投影的四棱锥体挤压为正交投影的长方体 变换规定 转换过程 观察1 观察2 关于任意一点挤压后向哪里移动的问题,简单推导了一下 齐次坐标 如下,(x, y, z, 1) 表示空间中的xyz点,让它每个分量乘以k&#…

使用Hugging Face获取BERT预训练模型

【图书推荐】《从零开始大模型开发与微调:基于PyTorch与ChatGLM》_《从零开始大模型开发与微调:基于pytorch与chatglm》-CSDN博客 BERT是一个预训练模型,其基本架构和存档都有相应的服务公司提供下载服务,而Hugging Face是一家目前专门免费提…

如何应对UI测试自动化的不稳定循环!

以下为作者观点: 当我加入UI自动化团队时,我很高兴能为新功能的自动化测试用例开发做出贡献。然而,我很快意识到团队花费了大量时间来修复之前迭代中不稳定的测试。这种情况让我感到困惑,因为当自动化测试脚本已知不稳定时&#…

HRSC2016 :推动光学遥感图像细粒度船舶检测的创新引擎(目标检测)

亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 摘要&a…

LabVIEW在核磁共振实验室的应用

​核磁共振(NMR)实验室在进行复杂的核磁共振实验时,需要一个高效、灵活且易于操作的实验控制和数据采集系统。传统的NMR实验系统往往使用专门的硬件和软件,存在系统封闭、扩展性差、维护成本高等问题。为了解决这些问题&#xff0…

java设计模式(五)建造者模式(Builder Pattern)

1、模式介绍: 建造者模式(Builder Pattern)是一种创建型设计模式,它允许你创建一个复杂对象的表示,同时隐藏了创建细节。该模式将对象的构建过程和表示分离,使得相同的构建过程可以创建不同的表示。 2、应…