在学习了弹窗跟着鼠标走-技术论坛-工业支持中心-西门子中国 (siemens.com.cn)之后,增加判断弹窗高和宽超过屏幕一半的情况。
错误更正:
SetVisible(lpszPictureName,lpszObjectName,bVisible); //Return-Type: BOOL
SetPropChar(lpszPictureName,lpszObjectName,lpszPropertyName,szValue); //Return-Type: BOOL
GetWidth(lpszPictureName,lpszObjectName); //Return-Type: long int
GetHeight(lpszPictureName,lpszObjectName); //Return-Type: long int
lpszPictureName:当前页面名,创建按钮事件,形参里有定义。
比如void OnLButtonDown(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y)
intx,inty,为鼠标点击时的当前坐标。
lpszObjectName:对象名称。我原来理解成画面窗口名,正确的是在画面窗口的对象名属性。
PS:用英文版wincc可能会很简单,这些参数从英文名称看很直观。译成中文就……

bVisible:1惑TRUE都行,true不行。
lpszPropertyName:字符串。标题="CaptionText"
szValue:要设置的标题名,字符串。
int WindowsHeight,WindowsWidth,PictureHeight,PictureWidth;
SetVisible(lpszPictureName,"XXXXXL",TRUE); //显示弹窗
SetPropChar(lpszPictureName,"XXXXXL","CaptionText","XXXXXL"); //更改画面标题
WindowsWidth = GetWidth(lpszPictureName,"XXXXXL"); //获取弹窗宽度
WindowsHeight = GetHeight(lpszPictureName,"XXXXXL"); //获取弹窗高度
PictureWidth = GetTagWord("ScreenWidth"); //获取屏幕画面宽度
PictureHeight = GetTagWord("ScreenHeigh"); //获取屏幕画面高度
if(x >= PictureWidth/2)
{
if ( 0 < x - WindowsWidth - 10)
{
SetLeft(lpszPictureName,"XXXXXL",x - WindowsWidth - 10); //鼠标位置在画面右侧,且鼠标左侧能容下弹窗
}
else
{
SetLeft(lpszPictureName,"XXXXXL",0); //鼠标位置在画面右侧,但鼠标左侧容不下弹窗
}
}
else
{
if ( PictureWidth > x + WindowsWidth + 10)
{
SetLeft(lpszPictureName,"XXXXXL",x + 10); //鼠标位置在画面左侧,且鼠标右侧能容下弹窗
}
else
{
SetLeft(lpszPictureName,"XXXXXL",PictureWidth - WindowsWidth); //鼠标位置在画面左侧,但鼠标右侧容不下弹窗
}
}
//加10和减10,纯粹个人行为,不希望画面窗口左上侧焦点和鼠标焦点重合。
if(y >= PictureHeight/2)
{
if ( 0 < y - WindowsHeight - 10)
{
SetTop(lpszPictureName,"XXXXXL",y - WindowsHeight - 10); //鼠标位置在画面下侧,且鼠标上侧能容下弹窗
}
else
{
SetTop(lpszPictureName,"XXXXXL",0); //鼠标位置在画面下侧,但鼠标上侧容不下弹窗
}
}
else
{
if ( PictureHeight > y + WindowsHeight + 10)
{
SetTop(lpszPictureName,"XXXXXL",y + 10); //鼠标位置在画面上侧,且鼠标下侧能容下弹窗
}
else
{
SetTop(lpszPictureName,"XXXXXL",PictureHeight - WindowsHeight); //鼠标位置在画面上侧,但鼠标下侧容不下弹窗
}
}
逻辑修改:把画面分成四象限,先判断鼠标点(X,Y)在哪里,再对画面窗口的焦点(左上角)的(Left,Top)=(int x,int y)进行修改。
PS:目前项目用了OS编辑器生成项目框架,然后又做了一个超过画面一半的弹窗。
PS:"XXXXXL"自行替换成画面窗口的对象名称(ObjectName),以及窗口标题CaptionText。
有不对之处,请斧正。