我在一篇文章里看到这么一段代码,说是可以使窗口自动靠边的.我把它拷下来,自己建个基于Dialog的程序试了一下,结果我稍微修改了一下,就很诡异了,代码如下,有兴趣可以试一下:
BOOL AdjustPos(CRect* lpRect)
{//自动靠边
int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
int iSY=GetSystemMetrics(SM_CYFULLSCREEN);
RECT rWorkArea;
BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre
a, 0);
CRect rcWA;
if(!bResult)
{//如果调用不成功就利用GetSystemMetrics获取屏幕面积
rcWA=CRect(0,0,iSX,iSY);
}
else
rcWA=rWorkArea;
int iX=lpRect->left;
int iY=lpRect->top; if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)
{//调整左
//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
lpRect->OffsetRect(rcWA.left-iX,0);
AdjustPos(lpRect);
return TRUE;
}
if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)
{//调整上
//pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
lpRect->OffsetRect(0,rcWA.top-iY);
AdjustPos(lpRect);
return TRUE;
}
if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->W idth())
{//调整右
//pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
lpRect->OffsetRect(rcWA.right-lpRect->right,0);
AdjustPos(lpRect);
return TRUE;
}
if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect
->Height())
{//调整下
//pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
return TRUE;
}
return FALSE;
} //然后在ONMOVEING事件中使用所下过程调用
CRect r=*pRect;
AdjustPos(&r);
*pRect=(RECT)r;
这是原代码,有点问题,比如前面有个DETASTEP未定义,CRect r=*pRect; AdjustPos(&r); *pRect=(RECT)r;也让人莫明其妙.================
我作的修改是:选int DETASTEP=0;(或者把前面任一个if语句的条件设了TRUE),但并不调用AdjustPos方法.结果程序窗口还没出现就自动退出了.
问题是:一个没被调用的函数为什么也会产生影响呢.
BOOL AdjustPos(CRect* lpRect)
{//自动靠边
int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
int iSY=GetSystemMetrics(SM_CYFULLSCREEN);
RECT rWorkArea;
BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre
a, 0);
CRect rcWA;
if(!bResult)
{//如果调用不成功就利用GetSystemMetrics获取屏幕面积
rcWA=CRect(0,0,iSX,iSY);
}
else
rcWA=rWorkArea;
int iX=lpRect->left;
int iY=lpRect->top; if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)
{//调整左
//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
lpRect->OffsetRect(rcWA.left-iX,0);
AdjustPos(lpRect);
return TRUE;
}
if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)
{//调整上
//pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
lpRect->OffsetRect(0,rcWA.top-iY);
AdjustPos(lpRect);
return TRUE;
}
if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->W idth())
{//调整右
//pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);
lpRect->OffsetRect(rcWA.right-lpRect->right,0);
AdjustPos(lpRect);
return TRUE;
}
if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect
->Height())
{//调整下
//pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);
lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);
return TRUE;
}
return FALSE;
} //然后在ONMOVEING事件中使用所下过程调用
CRect r=*pRect;
AdjustPos(&r);
*pRect=(RECT)r;
这是原代码,有点问题,比如前面有个DETASTEP未定义,CRect r=*pRect; AdjustPos(&r); *pRect=(RECT)r;也让人莫明其妙.================
我作的修改是:选int DETASTEP=0;(或者把前面任一个if语句的条件设了TRUE),但并不调用AdjustPos方法.结果程序窗口还没出现就自动退出了.
问题是:一个没被调用的函数为什么也会产生影响呢.
const int DETASTEP = 50;
BOOL AdjustPos(CWnd* pWnd, CRect* lpRect)
{
//自动靠边
int iSX=GetSystemMetrics(SM_CXFULLSCREEN);
int iSY=GetSystemMetrics(SM_CYFULLSCREEN); RECT rWorkArea;
BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkArea, 0); CRect rcWA;
if(!bResult)
{
//如果调用不成功就利用GetSystemMetrics获取屏幕面积
rcWA=CRect(0,0,iSX,iSY);
}
else
rcWA=rWorkArea; int iX=lpRect->left;
int iY=lpRect->top;
//调整靠左
if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)
{
pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
return TRUE;
} //调整靠上
if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)
{
pWnd->SetWindowPos(NULL, iX, rcWA.top, 0, 0, SWP_NOSIZE);
return TRUE;
} //调整靠右
if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->Width())
{
pWnd->SetWindowPos(NULL ,rcWA.right-lpRect->Width(), iY, 0, 0, SWP_NOSIZE);
return TRUE;
} //调整靠下
if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect->Height())
{
pWnd->SetWindowPos(NULL , iX, rcWA.bottom-lpRect->Height(), 0, 0, SWP_NOSIZE);
return TRUE;
} return FALSE;
} void CTestDlg::OnMove(int x, int y)
{
CDialog::OnMove(x, y); // TODO: Add your message handler code here
CRect rect;
GetWindowRect(&rect); AdjustPos(this, &rect);
}