Когда код случайно начинает работать без реальных измененийC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Когда код случайно начинает работать без реальных изменений

Сообщение Anonymous »

Я уже сталкивался с подобными ситуациями, когда мой код не работал должным образом, и в поисках решения проблемы я внес некоторые изменения, затем прокомментировал эти изменения, и проблема была решена. Внезапно простое «редактирование» где-то в файле устранило проблему, но реальных изменений в коде не произошло. Я снова столкнулся с подобной проблемой, и мне просто интересно, как это происходит?

Код: Выделить всё

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. Он начинает работать правильно и в релизной версии. Чем я прокомментировал эти строки, тем больше это работает в релизной сборке. Я удалил их, и это больше не работает в сборке релиза. Мне нужно, чтобы эти строки были только что прокомментированы для сборки релиза, чтобы поступить правильно. Как это можно оправдать? Что на самом деле может вызвать такое «редактирование» файла, которое на самом деле не представляет собой никаких изменений в реальном коде и устраняет проблему?

Я также хочу добавить, что я пробовал «отредактировать» или прокомментировать новый код в других местах файла, который не обязательно устраняет проблему. Мне нужно только иметь прокомментированный код в приведенной выше функции, который это исправит.

Обновить Вот полный класс. Я должен сказать, что этот курс доступен бесплатно где-то в Интернете, и я не являюсь его первоначальным автором.
  • вызывается из OnInitDialog диалогового окна, размер которого необходимо изменить. Он просто сохраняет координаты всех элементов управления.
  • OnSize() фактически выполняет изменение размера.

    CDlgResizeHelper::CDlgResizeHelper ()
    {
    }

    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 );
    
    Sleep( 50 );
    
    m_CtrlsList.push_back(cs);
    
    hCtrl = ::GetNextWindow(hCtrl, GW_HWNDNEXT);
    
    }
    
    }
    
    }

    void CDlgResizeHelper::Remove(HWND hwnd)
    {
    CtrlList ::итератор;

    Код: Выделить всё

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

    void CDlgResizeHelper::Update(HWND hwnd)
    {
    if (m_hParent && hwnd)
    {
    CtrlList::iterator it;

    Код: Выделить всё

        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()));
    }
    
    }
    
    }
    


void CDlgResizeHelper::Add(HWND hwnd)
{
if (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);

}
}

void CDlgResizeHelper::OnSize()
{
if (: :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, bool resize /< em>= true/)
{
CtrlList::iterator it;

Код: Выделить всё

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, bool resize /< em>= true/)
{
return Fix(::GetDlgItem(m_hParent, a_itemId), a_hFix, a_vFix, resize);


BOOL CDlgResizeHelper::Fix(HorizFix a_hFix, VertFix a_vFix, bool resize /= true/)
{
CtrlList::iterator it;

Код: Выделить всё

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, bool resize /< em>= true/)
{
char 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;
}

Подробнее здесь: https://stackoverflow.com/questions/139 ... eal-change
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»