Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2009, 16:53   #1
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию [MFC] Border: Resizing

Итак, что есмь. Есмь интересная фиговина... Есмь обработчик онсайз и некий набор контролов, которые ресайзятся с определенными коэффициентами.

Код:
typedef struct{
    CWnd * control;
    double bottom;
    double top;
    double left;
    double right;
} ResizeControl;

vector<ResizeControl> m_Controls;
Код:
void SizingDialog::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);

    if(IsWindowVisible() && nType != 1){
        CRect newRect;
        GetClientRect(&newRect);

        int dx = newRect.right - m_RememberLastSize.right;
        int dy = newRect.bottom - m_RememberLastSize.bottom;

        CRect rect;
        vector<ResizeControl>::iterator i;
        for(i = m_Controls.begin(); i != m_Controls.end(); i++){
            (i->control)->GetWindowRect(&rect);
            ScreenToClient(&rect);
            rect.bottom += (int)(dy * i->bottom + (dy >= 0 ? 0.5 : -0.5));  // коэффициент изменения "низины"
            rect.top += (int)(dy * i->top + (dy >= 0 ? 0.5 : -0.5)); // коэффициент изменения высоты
            rect.left += (int)(dx * i->left + (dx >= 0 ? 0.5 : -0.5));  // ну и так далее
            rect.right += (int)(dx * i->right + (dx >= 0 ? 0.5 : -0.5));
            (i->control)->MoveWindow(&rect);
        }

        m_RememberLastSize = newRect;
    }
}
Собственно, когда задаем коэффициент 0.5 для того, чтобы контрол держался, скажем, в центре окошка, он начинает меееедленно-меееедленно убегать. Подозрения в том, что криво работает округление. Есть у кого-нибудь мысли о том, как бы это исправить?
wyvern@localhost:~$ sudo emerge --unmerge world

Последний раз редактировалось wyvern; 17.04.2009 в 17:15.
wyvern вне форума Ответить с цитированием
Старый 17.04.2009, 17:10   #2
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Думаю, тут на халяву не пройдет. При округлении чисел до целых по-любому будет присутствовать погрешность и будет теряться часть информации. Единственное, что приходит в голову - это запоминать изначальное положение органов и диалога. И при изменении размера диалога все пересчитывать не относительно текущих размеров, а относительно базовых.
Pashan вне форума Ответить с цитированием
Старый 18.04.2009, 07:23   #3
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

хммм...
мде, жалко..
wyvern@localhost:~$ sudo emerge --unmerge world
wyvern вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MFC Cdevelop Visual C++ 4 18.03.2009 21:28
ODBC и MFC MadDog__ Win Api 0 06.02.2009 01:18
Проблема с MFC Nikimax Visual C++ 1 06.12.2008 22:50
MFC и e-mail alixEx Visual C++ 2 13.05.2008 01:07
MFC Diman2008 Visual C++ 2 06.03.2008 16:24