Есть таблица 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 г.
Здравствуйте, RussianFellow, Вы писали:
RF>Можно ли сделать так, чтобы этот вертикальный скроллбар был бы активным не только после завершения вывода в таблицу, но и до этого завершения? То есть можно ли сделать так, чтобы можно выбло прокручивать по вертикали содержимое таблицы до завершения вычислений?
Периодически или после добавления очередной строки делать вызов типа
for (MSG msg; ::PeekMessage(&msg, m_hWnd, 0, 0, TRUE); ::TranslateMessage(&msg), ::DispatchMessage(&msg));
Если, конечно, это не вычисления данных для одной строки 2 минуты занимают. Иначе тогда только вычисления в отдельном потоке делать. Еще проблема может возникнуть, когда после добавления строки сроллбар будет сбрасывать своё положение, но это не точно и это решаемо.
Здравствуйте, 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 г.
Здравствуйте, 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
Ясно, понял.
Спасибо!
1613 г. = 2024 г.
И ещё вопрос: когда количество строк в этом m_IDC_LIST3 будет больше 12 и появится вертикальный скроллбар, то как сделать так, чтобы этот скроллбар был всегда внизу--то есть чтобы можно было всегда видеть последнюю строку в таблице?
1613 г. = 2024 г.
Здравствуйте, RussianFellow, Вы писали:
RF>И ещё вопрос: когда количество строк в этом m_IDC_LIST3 будет больше 12 и появится вертикальный скроллбар, то как сделать так, чтобы этот скроллбар был всегда внизу--то есть чтобы можно было всегда видеть последнюю строку в таблице?
int nCount = m_myListCtrl.GetItemCount();
if (nCount > 0)
m_myListCtrl.EnsureVisible(nCount-1, FALSE);