F
fartripLiao
Unregistered / Unconfirmed
GUEST, unregistred user!
MapLogicScreenToUserScreen这个函数需要译成DELPHI
BOOL WINAPI MapLogicScreenToUserScreen(RECT *rcLogic,
RECT *rcUser,
CAP_WND_POS *pCardPos,
DWORD dwCardCount);
说明: 设置Overlay屏幕区域到用户屏幕区域的映射关系。
系统初始化时创建了一个同屏幕大小一致的Overlay屏幕区域,
我们称之为逻辑屏幕区域,用户屏幕区域则是指我们所看到
的实际屏幕区域。StartOverlay函数中传入的矩形参数实际上
是在逻辑屏幕区域的绝对位置,由于系统初始化时两区域的
1:1关系,所以我们可以得到同坐标同大小用户屏幕区域的
视频图像。利用此函数则可重建此映射关系,以改变图像大
小/位置等比例关系。
参数: rcLogic:
Overlay逻辑屏幕区域指针,NULL表示整个逻辑屏幕
区域(此时等同于用户屏幕区域)
RcUser:用户屏幕区域指针,为NULL表示整个用户屏幕区域。
pCardPos:结构数组指针,NULL表示重置所有窗口。详见下述结构说明。
DwCardCount: pCardPos结构数组的成员个数。
返回值:TRUE: 成功
FALSE: 失败.
结 构:typedef struct tagCardRect
{
DWORD dwCard; //卡号
RECT rcUser; //新的用户屏幕区域位置
}CAP_WND_POS;
例: 我们在逻辑屏幕上相临区域创建了四路(卡)视频输出,
如左图小区域0 1 2 3 所示,如在通常1:1映射方式下工作,
这四路输出将显示到用户屏幕的左下同坐标区域,大小不变,
现在我们改变映射关系,将此逻辑区域映射到全屏,则用户得到
视频图像输出如右图所示。此时,rcLogic参数应传入整个4路输
出所占用区域在逻辑屏幕中的矩形坐标,而RcUser参数则可传入NULL值,
对于pCardPos参数,由于此时重新映射后的用户屏幕区域包含4路输出,
此时DwCardCount参数应为4,再将其卡号和他们在用户屏幕区域对应的
新矩形坐标传入即可。
现在最主要的是第三个及第四个参数压入时有问题,现附上VC的相关代码
void CSdk2500Dlg::SetScreenThirdToOne(RECT rc)
{
RECT m_rc[6];
int iCards = 4;
MapLogicScreenToUserScreen(NULL,NULL,NULL,0);
ZeroMemory(m_rc,sizeof(RECT) * 6);
//make the x,y
int i,l1,l2,xb,yb,xs,ys,xStart,yStart,xLen,yLen;
double bix,biy;
bix = 0.75;
biy = 0.6;
xLen = (int)((rc.right - rc.left) * bix) ;
yLen = (int)((rc.bottom - rc.top) * biy) ;
l1 = 2;//xLen * 0.01;
l2 = 2;//yLen * 0.01;
xb = int(xLen * 0.7);
yb = yLen - (2 * l2);
xs = xLen - xb - l1;
ys = (yLen - (4 * l2))/3;
xStart = rc.left ;
yStart = rc.top;
//so we have the x,y
m_rc[0].left = xStart;
m_rc[0].top = yStart + l2;
m_rc[0].right =xStart + xb;
m_rc[0].bottom=yStart + yLen - l2;
m_rc[1].left = xStart + xb + l1;
m_rc[1].top = yStart + l2;
m_rc[1].right = xStart + xLen;
m_rc[1].bottom= yStart + ys + l2;
m_rc[2].left = xStart + xb + l1;
m_rc[2].top = yStart + ys + (2*l2);
m_rc[2].right = xStart + xLen;
m_rc[2].bottom= yStart + ((2 * ys) + (2 * l2));
m_rc[3].left = xStart + xb + l1;
m_rc[3].top = yStart + (2 * ys) + (3 * l2);
m_rc[3].right = xStart + xLen;
m_rc[3].bottom= yStart + yLen - l2;
for(i=0;i<iCards;++i)
{
m_pButton.MoveWindow(&m_rc,TRUE);
}
for(i=0;i<iCards;++i)
{
StartOverlay(i,m_pButton.m_hWnd,&m_rc);
//新增函数,将TRUE该为FALSE即可屏蔽用户双击
EnableRespondDbClk(i,FALSE);
}
//Map to all the video screen
RECT rcLogic,rcDest;
rcLogic.left = m_rc[0].left;
rcLogic.top = m_rc[0].top;
rcLogic.right = m_rc[3].right;
rcLogic.bottom = m_rc[3].bottom;
rcDest.left = rc.left ;
rcDest.top = rc.top ;
rcDest.right = rc.right ;
rcDest.bottom = rc.bottom ;
CAP_WND_POS *CardPos = new CAP_WND_POS[4];
//下面的计算稍繁,暂时没有其他更好的办法
CardPos[0].dwCard = 0;
CardPos[0].rcUser.left = rc.left;
CardPos[0].rcUser.top = rc.top;
CardPos[0].rcUser.right = rc.left + 410;
CardPos[0].rcUser.bottom = rc.bottom;
CardPos[1].dwCard = 1;
CardPos[1].rcUser.left = rc.left + 412;
CardPos[1].rcUser.top = rc.top;
CardPos[1].rcUser.right = rc.right;
CardPos[1].rcUser.bottom = rc.top + 128;
CardPos[2].dwCard = 2;
CardPos[2].rcUser.left = rc.left + 412;
CardPos[2].rcUser.top = rc.top + 130;
CardPos[2].rcUser.right = rc.right;
CardPos[2].rcUser.bottom = rc.top + 256;
CardPos[3].dwCard = 3;
CardPos[3].rcUser.left = rc.left + 412;
CardPos[3].rcUser.top = rc.top + 260;
CardPos[3].rcUser.right = rc.right;
CardPos[3].rcUser.bottom = rc.bottom;
BOOL ret = MapLogicScreenToUserScreen(&rcLogic,&rcDest,CardPos,4);
delete CardPos;
}
BOOL WINAPI MapLogicScreenToUserScreen(RECT *rcLogic,
RECT *rcUser,
CAP_WND_POS *pCardPos,
DWORD dwCardCount);
说明: 设置Overlay屏幕区域到用户屏幕区域的映射关系。
系统初始化时创建了一个同屏幕大小一致的Overlay屏幕区域,
我们称之为逻辑屏幕区域,用户屏幕区域则是指我们所看到
的实际屏幕区域。StartOverlay函数中传入的矩形参数实际上
是在逻辑屏幕区域的绝对位置,由于系统初始化时两区域的
1:1关系,所以我们可以得到同坐标同大小用户屏幕区域的
视频图像。利用此函数则可重建此映射关系,以改变图像大
小/位置等比例关系。
参数: rcLogic:
Overlay逻辑屏幕区域指针,NULL表示整个逻辑屏幕
区域(此时等同于用户屏幕区域)
RcUser:用户屏幕区域指针,为NULL表示整个用户屏幕区域。
pCardPos:结构数组指针,NULL表示重置所有窗口。详见下述结构说明。
DwCardCount: pCardPos结构数组的成员个数。
返回值:TRUE: 成功
FALSE: 失败.
结 构:typedef struct tagCardRect
{
DWORD dwCard; //卡号
RECT rcUser; //新的用户屏幕区域位置
}CAP_WND_POS;
例: 我们在逻辑屏幕上相临区域创建了四路(卡)视频输出,
如左图小区域0 1 2 3 所示,如在通常1:1映射方式下工作,
这四路输出将显示到用户屏幕的左下同坐标区域,大小不变,
现在我们改变映射关系,将此逻辑区域映射到全屏,则用户得到
视频图像输出如右图所示。此时,rcLogic参数应传入整个4路输
出所占用区域在逻辑屏幕中的矩形坐标,而RcUser参数则可传入NULL值,
对于pCardPos参数,由于此时重新映射后的用户屏幕区域包含4路输出,
此时DwCardCount参数应为4,再将其卡号和他们在用户屏幕区域对应的
新矩形坐标传入即可。
现在最主要的是第三个及第四个参数压入时有问题,现附上VC的相关代码
void CSdk2500Dlg::SetScreenThirdToOne(RECT rc)
{
RECT m_rc[6];
int iCards = 4;
MapLogicScreenToUserScreen(NULL,NULL,NULL,0);
ZeroMemory(m_rc,sizeof(RECT) * 6);
//make the x,y
int i,l1,l2,xb,yb,xs,ys,xStart,yStart,xLen,yLen;
double bix,biy;
bix = 0.75;
biy = 0.6;
xLen = (int)((rc.right - rc.left) * bix) ;
yLen = (int)((rc.bottom - rc.top) * biy) ;
l1 = 2;//xLen * 0.01;
l2 = 2;//yLen * 0.01;
xb = int(xLen * 0.7);
yb = yLen - (2 * l2);
xs = xLen - xb - l1;
ys = (yLen - (4 * l2))/3;
xStart = rc.left ;
yStart = rc.top;
//so we have the x,y
m_rc[0].left = xStart;
m_rc[0].top = yStart + l2;
m_rc[0].right =xStart + xb;
m_rc[0].bottom=yStart + yLen - l2;
m_rc[1].left = xStart + xb + l1;
m_rc[1].top = yStart + l2;
m_rc[1].right = xStart + xLen;
m_rc[1].bottom= yStart + ys + l2;
m_rc[2].left = xStart + xb + l1;
m_rc[2].top = yStart + ys + (2*l2);
m_rc[2].right = xStart + xLen;
m_rc[2].bottom= yStart + ((2 * ys) + (2 * l2));
m_rc[3].left = xStart + xb + l1;
m_rc[3].top = yStart + (2 * ys) + (3 * l2);
m_rc[3].right = xStart + xLen;
m_rc[3].bottom= yStart + yLen - l2;
for(i=0;i<iCards;++i)
{
m_pButton.MoveWindow(&m_rc,TRUE);
}
for(i=0;i<iCards;++i)
{
StartOverlay(i,m_pButton.m_hWnd,&m_rc);
//新增函数,将TRUE该为FALSE即可屏蔽用户双击
EnableRespondDbClk(i,FALSE);
}
//Map to all the video screen
RECT rcLogic,rcDest;
rcLogic.left = m_rc[0].left;
rcLogic.top = m_rc[0].top;
rcLogic.right = m_rc[3].right;
rcLogic.bottom = m_rc[3].bottom;
rcDest.left = rc.left ;
rcDest.top = rc.top ;
rcDest.right = rc.right ;
rcDest.bottom = rc.bottom ;
CAP_WND_POS *CardPos = new CAP_WND_POS[4];
//下面的计算稍繁,暂时没有其他更好的办法
CardPos[0].dwCard = 0;
CardPos[0].rcUser.left = rc.left;
CardPos[0].rcUser.top = rc.top;
CardPos[0].rcUser.right = rc.left + 410;
CardPos[0].rcUser.bottom = rc.bottom;
CardPos[1].dwCard = 1;
CardPos[1].rcUser.left = rc.left + 412;
CardPos[1].rcUser.top = rc.top;
CardPos[1].rcUser.right = rc.right;
CardPos[1].rcUser.bottom = rc.top + 128;
CardPos[2].dwCard = 2;
CardPos[2].rcUser.left = rc.left + 412;
CardPos[2].rcUser.top = rc.top + 130;
CardPos[2].rcUser.right = rc.right;
CardPos[2].rcUser.bottom = rc.top + 256;
CardPos[3].dwCard = 3;
CardPos[3].rcUser.left = rc.left + 412;
CardPos[3].rcUser.top = rc.top + 260;
CardPos[3].rcUser.right = rc.right;
CardPos[3].rcUser.bottom = rc.bottom;
BOOL ret = MapLogicScreenToUserScreen(&rcLogic,&rcDest,CardPos,4);
delete CardPos;
}