подскажите плз
нужно по событию (например по нажатию кнопки) сделать полосы прокрутки неактивными
использую функцию EnableScrollBar — срабатывает для всех флажков, кроме ESB_ENABLE_BOTH
для ESB_ENABLE_BOTH возвращает false. в чем может быть дело?

может сталкивался кто
CScrollBar m_vertScrollBar;
<...>
void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_END)
{
bool bRes = false;
bRes = m_vertScrollBar.EnableScrollBar(ESB_ENABLE_BOTH);
}
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
Здравствуйте, Веселопедист, Вы писали:
В>подскажите плз
В>нужно по событию (например по нажатию кнопки) сделать полосы прокрутки неактивными
В>использую функцию EnableScrollBar — срабатывает для всех флажков, кроме ESB_ENABLE_BOTH
В>для ESB_ENABLE_BOTH возвращает false. в чем может быть дело?
может сталкивался кто
В>В>CScrollBar m_vertScrollBar;
В><...>
В>void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
В>{
В> if (nChar == VK_END)
В> {
В> bool bRes = false;
В> bRes = m_vertScrollBar.EnableScrollBar(ESB_ENABLE_BOTH);
В> }
В> CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
В>}
В>
If the arrows are already in the requested state or an error occurs, the return value is zero. To get extended error information, call GetLastError.
Скорее всего именно это. Кстати, почему именно ESB_ENABLE_BOTH ? чтобы неактивным сделать, надо ESB_DISABLE_BOTH.
Если же причина не в этом — зови GetLastError и результат в студию.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, Веселопедист, Вы писали:
В>>подскажите плз
В>>нужно по событию (например по нажатию кнопки) сделать полосы прокрутки неактивными
В>>использую функцию EnableScrollBar — срабатывает для всех флажков, кроме ESB_ENABLE_BOTH
В>>для ESB_ENABLE_BOTH возвращает false. в чем может быть дело?
может сталкивался кто
В>>В>>CScrollBar m_vertScrollBar;
В>><...>
В>>void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
В>>{
В>> if (nChar == VK_END)
В>> {
В>> bool bRes = false;
В>> bRes = m_vertScrollBar.EnableScrollBar(ESB_ENABLE_BOTH);
В>> }
В>> CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
В>>}
В>>
PD>If the arrows are already in the requested state or an error occurs, the return value is zero. To get extended error information, call GetLastError.
PD>Скорее всего именно это. Кстати, почему именно ESB_ENABLE_BOTH ? чтобы неактивным сделать, надо ESB_DISABLE_BOTH.
PD>Если же причина не в этом — зови GetLastError и результат в студию.
м... просто надо их включать/выключать
код выше набросал просто для проверки именно самой функции EnableScrollBar. передавал туда сначала ESB_DISABLE_BOTH, потом еще раз вызывал ее же и передавал ESB_ENABLE_BOTH.
и вот выключать получается на ура.и по одной стрелочке и сразу обе. а включить обратно — фиг!
GetLastError пробовал. ничего не вернул :\

так что стало совсем непонятно, куда рыть дальше.
и в итоге из положения вышел тупо через
pScrollBar->EnableWindow()
в чем проблема так и осталось мне непонятно
Здравствуйте, Веселопедист, Вы писали:
В>м... просто надо их включать/выключать
В>код выше набросал просто для проверки именно самой функции EnableScrollBar. передавал туда сначала ESB_DISABLE_BOTH, потом еще раз вызывал ее же и передавал ESB_ENABLE_BOTH.
В>и вот выключать получается на ура.и по одной стрелочке и сразу обе. а включить обратно — фиг!
В>GetLastError пробовал. ничего не вернул :\
так что стало совсем непонятно, куда рыть дальше.
Что значит ничего ? Нуль ? Если нуль, значит
If the arrows are already in the requested state or an error occurs, the return value is zero. To get extended error information, call GetLastError.
чтобы было нагляднее, приведу свой текущий код:
void CChildView::ChangeSBFix(CScrollBar* pScrollBar, bool lineIsFixed)
{
BOOL result = 0;
if (lineIsFixed)
{
result = pScrollBar->EnableScrollBar(ESB_DISABLE_BOTH);
DWORD dw = GetLastError();
}
else
{
result = pScrollBar->EnableScrollBar(ESB_ENABLE_BOTH);
DWORD dw = GetLastError();
}
}
вызывается отсюда:
void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// нажатие на f1
// по нажатию на F1 блокируем горизонтальную линейку
if (nChar == VK_F1)
{
m_hLineIsFixed = !m_hLineIsFixed;
ChangeSBFix(&m_vertScrollBar, m_hLineIsFixed);
}
// нажатие на f2
if (nChar == VK_F2)
{
m_vLineIsFixed = !m_vLineIsFixed;
ChangeSBFix(&m_horzScrollBar, m_vLineIsFixed);
}
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
начинаю отладку. нажимаю F1 в первый раз. заходит в
if (lineIsFixed)
{
result = pScrollBar->EnableScrollBar(ESB_DISABLE_BOTH);
DWORD dw = GetLastError();
}
результат выполнения: result = 8, dw = 0;
нажимаю F1 еще раз
заходит в
else
{
result = pScrollBar->EnableScrollBar(ESB_ENABLE_BOTH);
DWORD dw = GetLastError();
}
результат выполнения: result = 0, dw = 0;
то есть формально линейки УЖЕ выставлены или ошибка, так? ("If the arrows are already in the requested state or an error occurs, the return value is zero. To get extended error information, call GetLastError.")
но GetLastError() возвращает 0.
Слегка модифицировал, чтобы выводился текст ошибки (если есть)
пишет "Операция успешно завершена" на каждой итерации. а линейки блокируются, и потом не разблокируются