Лёшик, вот за что я тебя обычно люблю, так это за непвторимую манеру спрашивать одно, а ввиду иметь совершенно другое.
Поэтому ты давай не увиливай, что сначала спросил, на то ответ и получишь.
Хотя...
ScrollWindow должна спасти гиганта мысли.
Но в данном случае думаю всё-таки стоит разобраться. Тем более, что вызвать её тебе где-то же надо. В принципе, с самого начала, ответил на твой, кстати правильно поставленный, вопрос. Уточню (полоски ессно остаются - чем-то же всё-таки надо управлять), ибо фраза
Когда контролы заезжают за край диалога, полоски должны появляться и позволять прокрутить содержимое диалога
наверняка означает, что "уезжают" они при ресайзе, или у тебя контролы самостоятельно ездят по форме?
Итак, у тебя есть диалог, с кучей контролов. Ну я сильно не стал заморачиваться, где три там и тридцать. По запарке назвал его TesdScrollDlg имелось ввиду Test. Да и сделал его только для вертикального, ессно для горизонтального тоже самое, только в профиль.
Ты меняешь его размеры - уменьшаешь (увеличивать изначально ничего не принесёт), ессно часть контролов уходит из области видимости. Например так:
Теперь бы тебе хотелось увидеть эти контролы, не меняя размеров окна, двигая движки полосок типа так:
Надеюсь, я правильно уловил твою мысль? Если нет, забудь всё. В противном случае скажу, что ты абсолютно прав: двигать ручками каждый контрол не только неспортивно, но и даже накладно, ведь их у нас на форме как грязи, а если ещё добавить? Конечно, проще свалить всё на кривость МС и забыть. Но попробуем таки разобраться. А вдруг получится.
"Остапа несло" (с)Итак, диалог с полосками. Единственное, что им не хватает - информации о положении клиентской области. Для них она всегда постоянна и равна размерам окна минус какие-то рамки. Да ещё одно, в след раз внимательно читай мои вопросы. Я тебя попросил показать OnSize, и меня при этом совсем не волновало как ты там собирался, собираешься и тд контролы двигать. Я просто хотел увидеть, какую инфу ты там передаёшь полоскам, а точнее делаешь ли это ваще. Вот и всё.
Итак, для вертикального скрола тебе надо:
а) запомнить размеры клиента при инициализации диалога и запоминать текущую скролл-позицию для каждой полоски, те идея заключается в том, чтобы сравнивать текущие размеры окна, с некими постоянными размерами, я их из лени слямзил при старте:
GetWindowRect(m_rect);
m_nScrollPos = 0;
б) в OnSize информировать полоски об изменениях
void CTesdScrollDlgDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
m_nCurHeight = cy;
int nScrollMax;
if (cy < m_rect.Height())
{
nScrollMax = m_rect.Height() - cy;
}
else
nScrollMax = 0;
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS;
si.nMin = 0;
si.nMax = nScrollMax;
si.nPage = si.nMax/10;
si.nPos = 0;
SetScrollInfo(SB_VERT, &si, TRUE);
}
в) в OnScroll пересчитывать позицию в координаты и вызывать упомянутую ScroolWindow:
void CTesdScrollDlgDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int nDelta;
int nMaxPos = m_rect.Height() - m_nCurHeight;
switch (nSBCode)
{
case SB_LINEDOWN:
if (m_nScrollPos >= nMaxPos)
return;
nDelta = min(nMaxPos/100,nMaxPos-m_nScrollPos);
break;
case SB_LINEUP:
if (m_nScrollPos <= 0)
return;
nDelta = -min(nMaxPos/100,m_nScrollPos);
break;
case SB_PAGEDOWN:
if (m_nScrollPos >= nMaxPos)
return;
nDelta = min(nMaxPos/10,nMaxPos-m_nScrollPos);
break;
case SB_THUMBPOSITION:
nDelta = (int)nPos - m_nScrollPos;
break;
case SB_PAGEUP:
if (m_nScrollPos <= 0)
return;
nDelta = -min(nMaxPos/10,m_nScrollPos);
break;
default:
return;
}
m_nScrollPos += nDelta;
SetScrollPos(SB_VERT,m_nScrollPos,TRUE);
ScrollWindow(0,-nDelta);
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
Ну и фсё!
зы Подправил очепятки, которые нашёл. Перечитал и сам плохо понял, забывать я стал русский основательно, может тебе больше повезёт. Надёюсь в большей степени на код. Ну если что - спрашивай.