Как сделать активным вертикальный скроллбар CListCtrl во время вычислений?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 27.03.19 13:29
Оценка:
Есть таблица 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"Расчёт на заданный интервал времени завершён.");
}
1613 г. = 2024 г.
Re: Как сделать активным вертикальный скроллбар CListCtrl во время вычислений?
От: Maniacal Россия  
Дата: 27.03.19 13:39
Оценка:
Здравствуйте, RussianFellow, Вы писали:

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


Периодически или после добавления очередной строки делать вызов типа
for (MSG msg; ::PeekMessage(&msg, m_hWnd, 0, 0, TRUE); ::TranslateMessage(&msg), ::DispatchMessage(&msg));


Если, конечно, это не вычисления данных для одной строки 2 минуты занимают. Иначе тогда только вычисления в отдельном потоке делать. Еще проблема может возникнуть, когда после добавления строки сроллбар будет сбрасывать своё положение, но это не точно и это решаемо.
Re[2]: Как сделать активным вертикальный скроллбар CListCtrl во время вычислений
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 28.03.19 10:57
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Периодически или после добавления очередной строки делать вызов типа

M>
M>for (MSG msg; ::PeekMessage(&msg, m_hWnd, 0, 0, TRUE); ::TranslateMessage(&msg), ::DispatchMessage(&msg));
M>


Именно так надо писать?
Или же правильнее писать:

MSG  msg;

//...
for (::PeekMessage(&msg,m_hWnd,0,0,TRUE); ::TranslateMessage(&msg); ::DispatchMessage(&msg));


?

И к какому классу относится m_hWnd--к классу текущего диалога или же к классу CListCtrl ?
1613 г. = 2024 г.
Re[3]: Как сделать активным вертикальный скроллбар CListCtrl во время вычислений
От: Maniacal Россия  
Дата: 28.03.19 11:57
Оценка: 4 (1)
Здравствуйте, RussianFellow, Вы писали:

RF>Или же правильнее писать:


RF>
RF>MSG  msg;

RF>//...
RF>for (::PeekMessage(&msg,m_hWnd,0,0,TRUE); ::TranslateMessage(&msg); ::DispatchMessage(&msg));
RF>


RF>?

Нет, цикл нужно выполнять, пока PeekMessage возвращает TRUE.

Это я так извратился, в оригинале, где я впервые эту идею увидел, вообще было
MSG msg;
while(::PeekMessage(&msg,m_hWnd,0,0,TRUE))
{
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg));
}


RF>И к какому классу относится m_hWnd--к классу текущего диалога или же к классу CListCtrl ?


m_hWnd относится к окну, в которое вставлен CListCtrl
Re[4]: Как сделать активным вертикальный скроллбар CListCtrl во время вычислений
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 28.03.19 13:22
Оценка:
Ясно, понял.
Спасибо!
1613 г. = 2024 г.
Re[3]: Как сделать активным вертикальный скроллбар CListCtrl во время вычислений
От: std.denis Россия  
Дата: 28.03.19 13:29
Оценка: +1
RF>Именно так надо писать?
RF>Или же правильнее писать:

Лучше ни так, ни так, а воспользоваться второй частью совета и создать для вычислений отдельный поток.
Re: Как сделать активным вертикальный скроллбар CListCtrl во время вычислений?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 29.03.19 06:53
Оценка:
И ещё вопрос: когда количество строк в этом m_IDC_LIST3 будет больше 12 и появится вертикальный скроллбар, то как сделать так, чтобы этот скроллбар был всегда внизу--то есть чтобы можно было всегда видеть последнюю строку в таблице?
1613 г. = 2024 г.
Re[2]: Как сделать активным вертикальный скроллбар CListCtrl во время вычислений
От: Maniacal Россия  
Дата: 29.03.19 07:00
Оценка: 4 (1)
Здравствуйте, RussianFellow, Вы писали:

RF>И ещё вопрос: когда количество строк в этом m_IDC_LIST3 будет больше 12 и появится вертикальный скроллбар, то как сделать так, чтобы этот скроллбар был всегда внизу--то есть чтобы можно было всегда видеть последнюю строку в таблице?


        int nCount = m_myListCtrl.GetItemCount();
        if (nCount > 0)
            m_myListCtrl.EnsureVisible(nCount-1, FALSE);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.