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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 27.03.2019, 17:36   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 81
Репутация: 10
По умолчанию Как сделать активным вертикальный скроллбар 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, 18:50   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,927
Репутация: 1937
По умолчанию

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

Ясно, понял.

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


11:57.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.