文章目录
- 前言
- 一、步骤及解析
- 二、运行画面演示
- 三、总结
前言
在常见的Wincc上位机画面中,点击按钮或控件弹出弹窗,由于不同的弹窗内容不同,变量前缀不同,通常情况下一个弹窗就需要调用一个画面窗口,但画面窗口过多会导致画面卡顿,添加过程也过于繁琐,故本文给出一种多个控件重复调用一个弹窗的解决方案。
该方法适用于一个弹窗内部变量共用一个变量前缀的情况,但不适用于一个弹窗内部变量使用多个变量前缀的情况。
一、步骤及解析
-
新建一个主画面,在画面中添加一个画面窗口对象;
这里将新画面命名为“Start_New”。
-
更改该画面窗口对象的属性;
对象名称可以随意设置,这里设置为PIC_WINDOW1,同时根据下图设置其它属性。
-
新建一个子画面,并添加需要的按钮或其它对象;
这里将子画面命名为“@单输出电机” 。
注意:弹窗内部的对象只连接对应变量的后缀名。如下图所示:
-
在主画面中添加第一个按钮或控件;
在该控件的事件选项卡中,选择对象事件,单击,添加C动作。
编写如下脚本:
#include "apdefap.h"
void Click(char* lpszPictureName, char* lpszObjectName )
{
#define H 300
#define W 250
#define WH 920
#define WW 1920
#define TEXT "单输出电机1"
#define TAGPREFIX "M1"
#define PICTURENAME "@单输出电机.PDL"
#define WINDOW "PIC_WINDOW1"
SetPropBOOL(lpszPictureName,WINDOW,"Visible",0);
SetPropChar(lpszPictureName,WINDOW,"CaptionText",TEXT); //返回类型:BOOL
SetPropChar(lpszPictureName,WINDOW,"tagprefix",TAGPREFIX); //返回类型:BOOL
SetPropChar(lpszPictureName,WINDOW,"PictureName",PICTURENAME); //返回类型:BOOL
SetWidth(lpszPictureName,WINDOW,W);
SetHeight(lpszPictureName,WINDOW,H);
if ((WW-W)<GetLeft(lpszPictureName,lpszObjectName))
SetLeft(lpszPictureName,WINDOW,WW-W-50);
else
SetLeft(lpszPictureName,WINDOW,GetLeft(lpszPictureName,lpszObjectName)+50);
if ((WH-H)<GetTop(lpszPictureName,lpszObjectName))
SetTop( lpszPictureName,WINDOW,WH-H-70);
else
SetTop( lpszPictureName,WINDOW,GetTop(lpszPictureName,lpszObjectName)+70);
SetPropBOOL(lpszPictureName,WINDOW,"Visible",1);
代码注释如下:
#include "apdefap.h"
:包含一个名为apdefap.h
的头文件,这个文件可能包含了某些宏定义、函数声明等,是这段代码运行所依赖的环境。void Click(char* lpszPictureName, char* lpszObjectName )
:这是Click
函数的声明,它不接受任何返回值。#define H 300
等宏定义:为代码中的常量值定义了简短的标识符,分别代表子画面弹窗的高度(H)、宽度(W)、主画面的高度(WH)、宽度(WW)、弹窗标题文本(单输出电机1)、弹窗内的变量的前缀(M1)、要调用的弹窗名称(@单输出电机.PDL)和主画面名称(PIC_WINDOW1)。SetPropBOOL
、SetPropChar
、SetWidth
、SetHeight
、SetLeft
、SetTop
和GetLeft
、GetTop
:这些是函数调用,它们用来设置窗口的属性,如可见性、标题文本、位置和大小。SetPropBOOL
和SetPropChar
函数用来设置不同的属性值,SetWidth
和SetHeight
函数用来设置宽度和高度,SetLeft
和SetTop
函数用来设置水平和垂直位置,而GetLeft
和GetTop
函数用来获取当前对象的位置。if
语句块:这些语句用来判断和设置窗口的位置。如果弹窗当前的左侧位置大于主画面的宽度减去弹窗的宽度((WW-W)<GetLeft(lpszPictureName,lpszObjectName)
),则将弹窗的左侧位置设置为WW-W-50
;否则,设置为当前弹窗左侧位置加上50。对于顶部位置也有类似的逻辑。
这里+50或+70是为了弹窗不会遮挡住按钮或控件,可根据实际需求进行调整。SetPropBOOL(lpszPictureName,WINDOW,"Visible",1);
:这行代码将窗口的可见性属性设置为1
,即显示窗口。
- 再次新建一个子画面,并添加需要的按钮或其它对象;
这里将子画面命名为“@单输出电磁阀” 。同样的,弹窗内部的对象只连接对应变量的后缀名。
- 在主画面中添加第二个按钮或控件;
在该控件的事件选项卡中,选择对象事件,单击,添加C动作。
编写如下脚本:
#include "apdefap.h"
void Click(char* lpszPictureName, char* lpszObjectName )
{
#define H 300
#define W 250
#define WH 920
#define WW 1920
#define TEXT "单输出电磁阀1"
#define TAGPREFIX "Valve1"
#define PICTURENAME "@单输出电磁阀.PDL"
#define WINDOW "PIC_WINDOW1"
SetPropBOOL(lpszPictureName,WINDOW,"Visible",0);
SetPropChar(lpszPictureName,WINDOW,"CaptionText",TEXT); //返回类型:BOOL
SetPropChar(lpszPictureName,WINDOW,"tagprefix",TAGPREFIX); //返回类型:BOOL
SetPropChar(lpszPictureName,WINDOW,"PictureName",PICTURENAME); //返回类型:BOOL
SetWidth(lpszPictureName,WINDOW,W);
SetHeight(lpszPictureName,WINDOW,H);
if ((WW-W)<GetLeft(lpszPictureName,lpszObjectName))
SetLeft(lpszPictureName,WINDOW,WW-W-50);
else
SetLeft(lpszPictureName,WINDOW,GetLeft(lpszPictureName,lpszObjectName)+50);
if ((WH-H)<GetTop(lpszPictureName,lpszObjectName))
SetTop( lpszPictureName,WINDOW,WH-H-70);
else
SetTop( lpszPictureName,WINDOW,GetTop(lpszPictureName,lpszObjectName)+70);
SetPropBOOL(lpszPictureName,WINDOW,"Visible",1);
}
这里的弹窗标题为”单输出电磁阀1“,变量前缀为"Valve1",调用的弹窗名称为"@单输出电磁阀.PDL",其它不变。
二、运行画面演示
三、总结
该方法的优势在于,只需要添加一个画面窗口对象,通过更改不同按钮或控件对象的C脚本,实现弹窗重复多次调用,比较方便。