如何在PB中制作特殊形状数据窗口或按钮介绍

2023-05-16

在 CSDN 上,经常有朋友问到不规则窗口或者不规则的按钮如何制作,在这里我介绍
几个比较常用的 API 函数,来实现不规则窗口或者不规则按钮的制作。
一、先看一下效果:
点击一下圆形花边按钮,效果如下:
这里写图片描述
(蓝色的为桌面)
这里写图片描述
CSDN 社区电子杂志—POWERBUILDER 杂志创刊号
二、下面我介绍一下程序中主要用到的几个 API 函数:
1. 创建一个圆角矩形 CreateRoundRectRgn
CreateRoundRectRgn
PB 声明
FUNCTION ulong CreateRoundRectRgn(Long x1, Long y1, Long x2, Long y2, Long x3, Long y3) library “gdi32”
说明
创建一个圆角矩形,该矩形由 X1, Y1-X2, Y2 确定,并由 X3, Y3 确定的椭圆描述圆角弧度
返回值
Long,执行成功则为区域句柄,失败则为 0
参数表
参数 类型及说明
X1,Y1 Long,矩形左上角的 X, Y 坐标
X2,Y2 Long,矩形右下角的 X, Y 坐标
X3 Long,圆角椭圆的宽。其范围从 0(没有圆角)到矩形宽(全圆)
Y3 Long,圆角椭圆的高。其范围从 0(没有圆角)到矩形高(全圆)
注解
不用时一定要用 DeleteObject 函数删除该区域
用该函数创建的区域与用 RoundRect API 函数画的圆角矩形不完全相同,因为本矩形的右边和下边不包括
在区域之内
2. 创建一个由一系列点围成的区域 CreatePolygonRgn
CreatePolygonRgn
PB 声明
FUNCTION ulong CreatePolygonRgn (ref ws_position lppt[], int cPoints, int fnPolyFillMode ) Library “gdi32”
说明
创建一个由一系列点围成的区域。 windows 在需要时自动将最后点与第一点相连以封闭多边形
返回值
Long,执行成功为创建的区域句柄,失败则为 0
参数表
参数 类型及说明
lpPoint POINTAPI, nCount 个 POINTAPI 结构中的第一个 POINTAPI 结构
nCount Long,多边形的点数
nPolyFillMode
Long,描述多边形填充模式。可为 ALTERNATE 或 WINDING 常数。参考
SetPolyFillMode 函数对多边形填充模式的解释
注解
不用时一定要用 DeleteObject 函数删除该区域
- 26 -
CSDN 社区电子杂志—POWERBUILDER 杂志创刊号
3. 创建一个椭圆 CreateEllipticRgn
CreateEllipticRgn
PB 声明
FUNCTION ulong CreateEllipticRgn( Long x1, Long y1, Long x2, Long y2) library “gdi32”
说明
创建一个椭圆,该椭圆与 X1, Y1 和 X2, Y2 坐标点确定的矩形内切
返回值
Long,执行成功则为区域句柄,失败则为零
参数表
参数 类型及说明
X1,Y1 Long,矩形左上角 X, Y 坐标
X2,Y2 Long,矩形右下角 X, Y 坐标
注解
不用时一定要用 DeleteObject 函数删除区域。用 Ellipse API 函数绘出的椭圆与该椭圆区域不完全相同,
因为本函数的绘图计算不包括矩形的下边和右边
4. 改变窗口的区域 SetWindowRgn, 这是最重要的一个函数
SetWindowRgn
PB 声明
FUNCTION ulong SetWindowRgn(ulong hWnd,ulong hRgn,boolean bRedraw) LIBRARY “user32”
说明
这是那些很难有人注意到的对编程者来说是个巨大的宝藏的隐含的 API 函数中的一个。 本函数允许您改变
窗口的区域。 通常所有窗口都是矩形的——窗口一旦存在就含有一个矩形区域。 本函数允许您放弃该区域。
这意味着您可以创建圆的、星形的窗口,也可以将它分为两个或许多部分——实际上可以是任何形状
返回值
Long,执行成功为非零值,失败为 0
参数表
参数 类型及说明
hWnd Long,将设置其区域的窗口
hRgn
Long,将设置的区域的句柄,一旦设置了该区域, 就不能使用或修改该区域句
柄,也不要删除它
bRedraw Boolean,若为 TRUE,则立即重画窗口
注解
为区域指定的所有坐标都以窗口坐标(不是客户坐标) 表示, 它们以整个窗口(包括标题栏和边框) 的左
上角为起点
5. 合并区域函数 CombineRgn
CombineRgn
- 27 -
CSDN 社区电子杂志—POWERBUILDER 杂志创刊号
PB 声明
FUNCTION ulong CombineRgn(Long hDestRgn, Long hSrcRgn1, Long hSrcRgn2, Long nCombineMode )
LIBRARY “gdi32”
说明
将两个区域组合为一个新区域
返回值
Long,下列常数之一:
COMPLEXREGION:区域有互相交叠的边界
SIMPLEREGION:区域边界没有互相交叠
NULLREGION:区域为空
ERRORAPI: 不能创建组合区域
参数表
参数 类型及说明
hDestRgn Long,包含组合结果的区域句柄
hSrcRgn1 Long,源区域 1
hSrcRgn2 Long,源区域 2
Long,组合两区域的方法。可设为下述常数
RGN_AND hDestRgn 被设置为两个源区域的交集
RGN_COPY hDestRgn 被设置为 hSrcRgn1 的拷贝
RGN_DIFF
hDestRgn 被 设 置 为 hSrcRgn1 中 与
hSrcRgn2 不相交的部分
RGN_OR hDestRgn 被设置为两个区域的并集
nCombineMode
RGN_XOR
hDestRgn 被设置为除两个源区域 OR 之
外的部分
6. 删除 GDI 对象 DeleteObject
DeleteObject
PB 声明
FUNCTION ulong DeleteObject(ulong hObject) LIBRARY “gdi32.dll”
说明
用这个函数删除 GDI 对象, 比如画笔、 刷子、 字体、 位图、 区域以及调色板等等。 对象使用的所有系统资
源都会被释放
返回值
Long,非零表示成功,零表示失败
参数表
参数 类型及说明
hObject Long,一个 GDI 对象的句柄
注解
- 28 -
CSDN 社区电子杂志—POWERBUILDER 杂志创刊号
不要删除一个已选入设备场景的画笔、 刷子或位图。 如删除以位图为基础的阴影(图案) 刷子,位图不会
由这个函数删除——只有刷子被删掉
三、部分核心实现代码
圆形窗口的代码:
long ll_x1, ll_x2, ll_x3
long ll_y1, ll_y2, ll_y3
long ll_handle
long ll_data
//取窗口的宽度
ll_data = UnitsToPixels(parent.width, xunitstopixels!)
ll_data = PixelsToUnits(ll_data, ypixelstounits!)
parent.height = ll_data
ll_x1 = 10
ll_y1 = 25
ll_x2 = UnitsToPixels(parent.width, xunitstopixels!) - 10
ll_y2 = UnitsToPixels(parent.height, yunitstopixels!) - 10
//创建一个圆形区域
ll_handle = CreateEllipticRgn(ll_x1, ll_y1, ll_x2, ll_y2)
SetwindowRgn(handle(parent), ll_handle, true)
return 1
代码也比较简单,其它的我也不一一细说了,感兴趣的朋友可以整个窗口的源代码导入到 PBL 里自己运行
一下试试。
源码下载地址:
http://blog.csdn.net/lzp_lrp/article/details/45668141

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在PB中制作特殊形状数据窗口或按钮介绍 的相关文章

随机推荐

  • Pascal's Triangle

    1 xff0c 题目要求 Given a non negative integer numRows generate the first numRows of Pascal s triangle In Pascal s triangle e
  • Centos7.3升级内核

    Centos7 3升级内核 原文 span class hljs preprocessor rpm import https www elrepo org RPM GPG KEY elrepo org span span class hlj
  • PDU(协议数据单元)

    协议数据单元PDU xff08 Protocol Data Unit xff09 是指对等层次之间传递的数据单位 协议数据单元 Protocol Data Unit 物理层的 PDU是数据位 xff08 bit xff09 xff0c 数据
  • 基于FPGA的DDR3多端口读写存储管理系统设计

    基于FPGA的DDR3多端口读写存储管理系统设计 来源 xff1a 电子技术设计 作者 xff1a 佚名 2015 年04月07日 15 52 8805 次阅读 0 机载视频图形显示系统主要实现2D图形的绘制 xff0c 构成各种飞行参数画
  • 第四篇:vivado mig IP的仿真

    FPGA开源工作室将通过五篇文章来给大家讲解xilinx FPGA 使用mig IP对DDR3的读写控制 xff0c 旨在让大家更快的学习和应用DDR3 本实验和工程基于Digilent的Arty Artix 35T FPGA开发板完成 软
  • Python 办公自动化之 Excel(三)

    1 前言 前面谈到 Python 处理 Excel 文件最常见的两种方式 xff0c 即 xff1a xlrd xlwt openpyxl 其中 xff0c xlrd xlwt 这一组合 xff0c xlrd 可以负责读取数据 xff0c
  • DDR3芯片读写控制及调试总结 — Xilinx FPGA(MIS)

    目录 DDR3芯片读写控制及调试总结 1 器件选型及原理图设计 xff08 1 xff09 由于是直接购买现成的开发板作为项目前期开发调试使用 xff0c 故DDR3芯片已板载 xff0c 其型号为MT41J256M16HA 125 xff
  • 基于Xilinx的XADC笔记

    基于Xilinx的XADC笔记 星旭的博客 CSDN博客 https blog csdn net Real003 article details 88879625
  • PCIE2.0/PCIE3.0/PCIE4.0/PCIE5.0接口的带宽、速率计算

    一 PCIE接口速率 xff1a 二 PCIE相关概念 xff1a 传输速率为每秒传输量GT s xff0c 而不是每秒位数Gbps xff0c 因为传输量包括不提供额外吞吐量的开销位 xff1b 比如 PCIe 1 x和PCIe 2 x使
  • px4原生源码学习-(4)--Nuttx 实时操作系统编程

    前面说到px4是基于Nuttx实时操作系统上的 xff0c 那么px4也是由一些程序所构成 xff0c 这些程序实现了飞行器的自主控制 xff0c 只不过这些程序并不是我们通常所见到的单片机或者windows编程那样的程序 xff0c 但基
  • CNN论文-Faster RCNN

    I Motivation FastR CNN中的Selective Search方法速度很慢 xff0c 制约了模型的效率 xff0c Selective Search的缺点有 xff1a 1 基于engineered low level
  • addEventListener的三个参数详解

    DOM方法 addEventListener 和 removeEventListener 是用来分配和删除事件的函数 这两个方法都需要三个参数 xff0c 分别为 xff1a 事件名称 xff08 String xff09 要触发的事件处理
  • macOS+MatlabR2018b解决“错误使用mex -setup”问题(配置xcode10)

    在MATLAB的官网上可以看到 xff0c R2018b已经支持使用xcode10 43 进行混合编译 于是卸载 xff0c 重装了matlabR2018b xff0c 还是这个问题 尝试在MATLAB中输入mex setup xff0c
  • Arbotix+Rviz——基于Ubuntu20.04

    1 Arbotix简介 ArbotiX是一款控制电机 舵机的硬件控制板 xff1b 提供了相应的ROS功能包 xff1b 提供了一个差速控制器 xff0c 通过接收速度控制指令 xff0c 更新机器人的里程计状态 一 安装Arbotix g
  • C++中Txt文件读取和写入(方法汇总)

    一 ASCII文件 输出 为了使用下面的方法 你必须包含头文件 lt fstream h gt 在标准C 43 43 中 xff0c 已经使用取代 lt fstream h gt xff0c 所有的C 43 43 标准头文件都是无后缀的 这
  • PCL把两个点云合并成一个点云

    我先把一个人脸分成两半 xff0c 然后拼接配准之后如左图所示 xff0c 合并之后如右图所示 xff0c 保存输出 xff0c 这里的合并不涉及点云融合 xff0c 只是两个点云相加 点云模型下载链接在另一篇文章里PCL点云配准官方教程
  • kernel识别USB声卡CONTROL类型出错,论坛各位大神,懂得能帮忙看下这个问题怎么解决吗

    嗨 xff0c 最近我在arm底下调试鑫创的SSS1629 USB声卡 xff0c 但是系统起来以后kernel创建了单声道的MIC control设备 xff0c 使用amixer列出 control设备 如下 xff1a amixer
  • 安卓java c++ opencv3.4 视频实时传输

    安卓java c 43 43 视频实时传输 要做一个视频实时传输并别图像追踪识别的项目 本项目先采用TCP建立链接 xff0c 然后在用UDP实时传输 xff0c 用压缩图像帧内为JPEG的方式 xff0c 加快传输速率 下图是转的 我采用
  • Hadoop二次排序及MapReduce处理流程实例详解

    一 概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序 xff0c 这个默认排序可以满足一部分需求 xff0c 但是也是十分有限的 xff0c 在我们实际的需求当中 xff0c 往往有要对reduce输出结果进行二次排
  • 如何在PB中制作特殊形状数据窗口或按钮介绍

    在 CSDN 上 xff0c 经常有朋友问到不规则窗口或者不规则的按钮如何制作 xff0c 在这里我介绍 几个比较常用的 API 函数 xff0c 来实现不规则窗口或者不规则按钮的制作 一 先看一下效果 xff1a 点击一下圆形花边按钮 x