我在一篇文章里看到这么一段代码,说是可以使窗口自动靠边的.我把它拷下来,自己建个基于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方法.结果程序窗口还没出现就自动退出了.
问题是:一个没被调用的函数为什么也会产生影响呢.

解决方案 »

  1.   

    没被调用当然不会产生影响,肯定是你自己搞错了这里DETASTEP明显是个常量或宏定义,表示窗口距离屏幕边距,当然不应设为0,设个50看看这段代码是用递归的AdjustPos调用来重置窗口位置,实现靠边,但不知为何把SetWindowPos都注释掉了,你改的吧?
      

  2.   

    改了一下,没必要递归,这样即可:
    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);
    }
      

  3.   

    哦,我搞错了,用SetWindowPos注释掉了还搞个P啊,呵呵.脑太晕了.