Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 27.03.2019, 16:36   #1
erslgoeirjh
Пользователь
 
Регистрация: 19.05.2009
Сообщений: 98
По умолчанию Как сделать активным вертикальный скроллбар CListCtrl во время вычислений?

Есть таблица m_IDC_LIST3 типа CListCtrl. В неё во время вычислений выводится информация. При этом временнОй интервал между выводами в таблицу составляет две с половиной минуты--столько времени требуется для вычислений на каждом шаге.
Видимая часть этого m_IDC_LIST3 оставляет 12 строк. Для просмотра последующих строк нужно пользоваться вертикальным скроллбаром.
Но этот вертикальный скроллбар становится активным только тогда, когда будут выведены все строки в таблицу m_IDC_LIST3.

Можно ли сделать так, чтобы этот вертикальный скроллбар был бы активным не только после завершения вывода в таблицу, но и до этого завершения? То есть можно ли сделать так, чтобы можно выбло прокручивать по вертикали содержимое таблицы до завершения вычислений?

Код:

Код:
void CCalcDialog::OnBnClickedButton1()
// если была нажата кнопка "Рассчитать"
{
    // TODO: добавьте свой код обработчика уведомлений
    // ...
    jt = jt0;
    tj = tj0;
    countline = 0;
    do
    {
        //Progn_Step_interface(sat, jt, tj, step, rv, &jt, &tj, 0);
        Progn_Step_interface(sat, jt, tj, step, rv, &jt2, &tj2, 0);
        curtime = jt2 + tj2;
        jt2 = (long)curtime;
        tj2 = curtime - (long double)jt2;
        JD(jt2,tj2,&year,&month,&day,&partDay);
        partDay *= 86400.0;
        hour = (int)(partDay / 3600.0);
        partDay -= hour * 3600.0;
        minute = (int)partDay / 60.0;
        second = partDay - minute * 60.0;
        vecttoelem2full(rv[0].x,rv[0].y,rv[0].z,rv[1].x,rv[1].y,rv[1].z,year,month,day,hour,minute,second,myu,1,a,e,ild,w,Omega,M0,tpiyear,tpimonth,tpiday,tpihour,tpiminute,tpisecond,p,rpi,ralpha,u0,lambda0,teta0,T,h);
        if (countline>=12)  m_IDC_LIST3.InsertItem(countline,L""); // если количество строк больше 12, то добавляем в таблицу строку
        swprintf(ws,39,L"%.3f",(countline+1)*step/365.25);
        m_IDC_LIST3.SetItemText(countline,0,ws); // dt полета (годы)
        swprintf(ws,39,L"%d.%02d.%02d/%02d:%02d:%06.3f",year,month,day,hour,minute,second);
        m_IDC_LIST3.SetItemText(countline,1,ws); // дата
        T *= 24.0;
        swprintf(ws,39,L"%f",T);
        m_IDC_LIST3.SetItemText(countline,2,ws); // период T
        Hpi = rpi - REarth/AE;
        Hpi = Hpi * AE;
        swprintf(ws,39,L"%f",Hpi);
        m_IDC_LIST3.SetItemText(countline,3,ws); // Hpi
        Halpha = ralpha - REarth/AE;
        Halpha = Halpha * AE;
        swprintf(ws,39,L"%f",Halpha);
        m_IDC_LIST3.SetItemText(countline,4,ws); // Halpha
        swprintf(ws,39,L"%f",ild/PI*180.0);
        m_IDC_LIST3.SetItemText(countline,5,ws); // наклонение i
        swprintf(ws,39,L"%f",Omega/PI*180.0);
        m_IDC_LIST3.SetItemText(countline,6,ws); // долгота восходящего узла Omega
        swprintf(ws,39,L"%f",w/PI*180.0);
        m_IDC_LIST3.SetItemText(countline,7,ws); // аргумент перицентра w
        m_IDC_LIST3.RedrawWindow();
        jt = jt2;
        tj = tj2;
        countline++;
    } while ((jt+tj)<=(jt0+tj0+timeinterval-step) && Hpi > 80);
    AfxMessageBox(L"Расчёт на заданный интервал времени завершён.");
}
erslgoeirjh вне форума Ответить с цитированием
Старый 27.03.2019, 17:50   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,197
По умолчанию

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
можно выбло прокручивать по вертикали содержимое таблицы до завершения вычислений
Да, можно.
Надо где-то в теле цикла прокачать все накопившиеся сообщения.
Смотрите функции
PeekMessage()
TranslateMessage()
DispatchMessage()
waleri вне форума Ответить с цитированием
Старый 29.03.2019, 09:55   #3
erslgoeirjh
Пользователь
 
Регистрация: 19.05.2009
Сообщений: 98
По умолчанию

Ясно, понял.

И ещё вопрос: когда количество строк в этом m_IDC_LIST3 будет больше 12 и появится вертикальный скроллбар, то как сделать так, чтобы этот скроллбар был всегда внизу--то есть чтобы можно было всегда видеть последнюю строку в таблице?
erslgoeirjh вне форума Ответить с цитированием
Старый 29.03.2019, 10:11   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,197
По умолчанию

GetScrollRange()
SetScrollPos()
waleri вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать активным окно Максим_maks Общие вопросы Delphi 6 19.04.2018 02:42
Сделать активным окно. Winexcel Общие вопросы Delphi 7 26.01.2014 16:42
MainMenu сделать элемент активным lu_una Общие вопросы Delphi 3 19.11.2012 05:01
Как сделать mail активным? Rebel123 Общие вопросы Delphi 3 02.09.2009 18:29
Сделать список активным ALev Microsoft Office Excel 3 02.07.2009 15:53


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS