在我的代码无法正常工作之前,我遇到了类似的情况,在寻求解决问题的过程中,我进行了一些更改,而不是评论这些更改并迅速解决了问题。突然之间,文件中的某个“编辑”已解决了该问题,但是代码中没有真正的更改。我又遇到了类似的问题,我只是想知道这是怎么发生的?

void CDlgResizeHelper::Init(HWND hparent)
{
    m_hParent = hparent;
    m_CtrlsList.clear();


    if (::IsWindow(m_hParent))
    {
        ::GetWindowRect(m_hParent, m_OrigParentSize);

        // get all child windows and store their original sizes and positions
        HWND hCtrl = ::GetTopWindow(m_hParent);

        while (hCtrl)
        {
            CtrlSize cs;
            cs.hctrl = hCtrl;

            ::GetWindowRect(hCtrl, cs.orig_size);
            ::ScreenToClient(m_hParent, &cs.orig_size.TopLeft());
            ::ScreenToClient(m_hParent, &cs.orig_size.BottomRight());


        //  CString msg;
        //  msg.Format("Old Size: %d        %d      %d      %d\r\n", cs.orig_size.left, cs.orig_size.top, cs.orig_size.right, cs.orig_size.bottom );

        //  TRACE( msg );

            m_CtrlsList.push_back(cs);

            hCtrl = ::GetNextWindow(hCtrl, GW_HWNDNEXT);

        }

    }

}


此类/函数根据对话框大小调整控件的大小。它在调试版本中有效,但相同的代码在发行版本中不起作用(=正确调整大小)。我进行了更改,并在上面的循环中为TRACE函数添加了三行。它也开始在发行版中正常工作。比我评论这些行,它在发布版本中仍然有效。我删除了它们,但在发行版本中不再起作用。我必须对这些行进行评论,以便发布版本做正确的事情。如何证明这一点呢?到底是什么导致文件的“编辑”,而实际代码中没有任何变化,才解决了该问题?

我还想补充一点,我尝试了“编辑”或注释了新代码,而文件中的其他代码不一定能解决问题。我只需要在上面的函数中有注释的代码就可以解决它。

更新这里是完整的类。我必须说这个课程可以在网上的某个地方免费获得,我不是原始作者。


从需要调整大小的对话框的Init中调用OnInitDialog。它仅存储所有控件的坐标。
OnSize()实际上会进行大小调整。

CDlgResizeHelper :: CDlgResizeHelper()
{
}

无效CDlgResizeHelper :: Init(HWND hparent)
{
    m_hParent = hparent;
    m_CtrlsList.clear();

if (::IsWindow(m_hParent))
{
    ::GetWindowRect(m_hParent, m_OrigParentSize);

    // get all child windows and store their original sizes and positions
    HWND hCtrl = ::GetTopWindow(m_hParent);

    while (hCtrl)
    {
        CtrlSize cs;
        cs.hctrl = hCtrl;

        ::GetWindowRect(hCtrl, cs.orig_size);
        ::ScreenToClient(m_hParent, &cs.orig_size.TopLeft());
        ::ScreenToClient(m_hParent, &cs.orig_size.BottomRight());


        CString msg;
        msg.Format("Old Size: %d        %d      %d      %d\r\n", cs.orig_size.left, cs.orig_size.top, cs.orig_size.right, cs.orig_size.bottom );

        Sleep( 50 );

        m_CtrlsList.push_back(cs);

        hCtrl = ::GetNextWindow(hCtrl, GW_HWNDNEXT);

    }

}


}

无效CDlgResizeHelper :: Remove(HWND hwnd)
{
    CtrlList :: iterator它;

for (it = m_CtrlsList.begin(); it != m_CtrlsList.end(); ++it)
{
    if (it->hctrl == hwnd)
    {
        m_CtrlsList.erase(it);
        return;
    }

}


}

无效CDlgResizeHelper :: Update(HWND hwnd)
{
    如果(m_hParent && hwnd)
    {
        CtrlList :: iterator它;

    for (it = m_CtrlsList.begin(); it != m_CtrlsList.end(); ++it)
    {
        if (it->hctrl == hwnd)
        {
            ::GetWindowRect(hwnd, &(it->orig_size));
            ::ScreenToClient(m_hParent, &(it->orig_size.TopLeft()));
            ::ScreenToClient(m_hParent, &(it->orig_size.BottomRight()));
        }

    }


}



}

无效CDlgResizeHelper :: Add(HWND hwnd)
{
    如果(m_hParent && hwnd)
    {
        CtrlSize cs;
        cs.hctrl = hwnd;

    ::GetWindowRect(hwnd, cs.orig_size);
    ::ScreenToClient(m_hParent, &cs.orig_size.TopLeft());
    ::ScreenToClient(m_hParent, &cs.orig_size.BottomRight());

    m_CtrlsList.push_back(cs);

}


}

无效CDlgResizeHelper :: OnSize()
{
    如果(:: IsWindow(m_hParent))
    {
        CRect currparentsize;
        :: GetWindowRect(m_hParent,currparentsize);

    double xratio = ((double) currparentsize.Width()) / m_OrigParentSize.Width();
    double yratio = ((double) currparentsize.Height()) / m_OrigParentSize.Height();

    HDWP hdwp;
    hdwp = BeginDeferWindowPos((int)m_CtrlsList.size());

    // resize child windows according to their fix attributes
    CtrlList::const_iterator it;

    for (it = m_CtrlsList.begin(); it != m_CtrlsList.end(); ++it)
    {
        CRect currctrlsize;
        HorizFix horiz_fix = it->horiz_fix;
        VertFix vert_fix = it->vert_fix;

        if (horiz_fix & LEFT)
            currctrlsize.left = it->orig_size.left;
        else
            currctrlsize.left = (LONG)( ((horiz_fix & WIDTH) && (horiz_fix & RIGHT)) ? (it->orig_size.left + currparentsize.Width() - m_OrigParentSize.Width()) : (it->orig_size.left * xratio));

        if (horiz_fix & RIGHT)
            currctrlsize.right = it->orig_size.right + currparentsize.Width() - m_OrigParentSize.Width();
        else
            currctrlsize.right = (LONG)((horiz_fix & WIDTH) ? (currctrlsize.left + it->orig_size.Width()) : (it->orig_size.right * xratio));

        if (vert_fix & TOP)
            currctrlsize.top = it->orig_size.top;
        else
            currctrlsize.top = (LONG)(((vert_fix & HEIGHT) && (vert_fix & BOTTOM)) ? (it->orig_size.top + currparentsize.Height() - m_OrigParentSize.Height()) : (it->orig_size.top * yratio));

        if (vert_fix & BOTTOM)
            currctrlsize.bottom = it->orig_size.bottom + currparentsize.Height() - m_OrigParentSize.Height();
        else
            currctrlsize.bottom = (LONG)((vert_fix & HEIGHT) ? (currctrlsize.top + it->orig_size.Height()) : (it->orig_size.bottom * yratio));

        UINT flags = SWP_NOZORDER;

        if (! it->resize)
            flags |= SWP_NOSIZE;


        hdwp = ::DeferWindowPos(hdwp, it->hctrl, NULL, currctrlsize.left, currctrlsize.top, (it->resize)? currctrlsize.Width() : 0, (it->resize)? currctrlsize.Height() : 0, flags);

        if (hdwp == NULL)
            return;

    } //end for (it = m_CtrlsList.begin(); it != m_CtrlsList.end(); ++it)

    EndDeferWindowPos(hdwp);

} //end if (::IsWindow(m_hParent))


}

BOOL CDlgResizeHelper :: Fix(HWND a_hCtrl,HorizFix a_hFix,VertFix a_vFix,布尔调整大小/ = true /)
{
    CtrlList :: iterator它;

for (it = m_CtrlsList.begin(); it != m_CtrlsList.end(); ++it)
{
    if (it->hctrl == a_hCtrl)
    {
        it->horiz_fix = a_hFix;
        it->vert_fix = a_vFix;
        it->resize = resize;

        return TRUE;

    }

}

return FALSE;


}

BOOL CDlgResizeHelper :: Fix(int a_itemId,HorizFix a_hFix,VertFix a_vFix,布尔调整大小/ = true /)
{
  返回Fix(:: GetDlgItem(m_hParent,a_itemId),a_hFix,a_vFix,调整大小);
}

BOOL CDlgResizeHelper :: Fix(HorizFix a_hFix,VertFix a_vFix,布尔调整大小/ = true /)
{
    CtrlList :: iterator它;

for(it = m_CtrlsList.begin(); it!=m_CtrlsList.end(); ++it)
{
    it->horiz_fix = a_hFix;
    it->vert_fix = a_vFix;
    it->resize = resize;
}

return TRUE;


}

UINT CDlgResizeHelper :: Fix(LPCTSTR a_pszClassName,HorizFix a_hFix,VertFix a_vFix,布尔调整大小/ = true /)
{
    字符cn_buf [200];
    memset(cn_buf,0,200);

UINT cnt = 0;
CtrlList::iterator it;

for (it = m_CtrlsList.begin(); it!= m_CtrlsList.end(); ++it)
{
    ::GetClassName(it->hctrl, cn_buf, sizeof(cn_buf));

    if (strcmp(cn_buf, a_pszClassName) == 0)
    {
        cnt++;
        it->horiz_fix = a_hFix;
        it->vert_fix = a_vFix;
        it->resize = resize;
    }

}

return cnt;


}

最佳答案

听起来您在某处使用了未初始化的变量。它可以根据构建模式获得不同的值,并且恰好在调试时分配了无害的东西。

尝试针对您的代码运行CppCheck应用程序。反正不会受伤。

关于c++ - 当代码意外开始工作而没有实际更改时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13995995/

10-11 19:14