EnableScrollBar не срабатывает при флаге ESB_ENABLE_BOTH
От: Веселопедист  
Дата: 13.11.10 11:33
Оценка:
подскажите плз
нужно по событию (например по нажатию кнопки) сделать полосы прокрутки неактивными
использую функцию 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
Re: EnableScrollBar не срабатывает при флаге ESB_ENABLE_BOTH
От: Веселопедист  
Дата: 13.11.10 13:10
Оценка:
не совсем точно выразился
по нажатию кнопки нужно менять состояние на противоположное
грубо говоря включать и отключать прокрутку.

просто работа с кнопками в данном случае не интересует — это и так понятно, как делать. а вот почему
полоса прокрутки в неактивное состояние уходит нормально, однако не возвращается оттуда — вот в чем загадка (лично для меня)
Re: EnableScrollBar не срабатывает при флаге ESB_ENABLE_BOTH
От: Pavel Dvorkin Россия  
Дата: 16.11.10 06:29
Оценка:
Здравствуйте, Веселопедист, Вы писали:

В>подскажите плз

В>нужно по событию (например по нажатию кнопки) сделать полосы прокрутки неактивными
В>использую функцию 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 и результат в студию.
With best regards
Pavel Dvorkin
Re[2]: EnableScrollBar не срабатывает при флаге ESB_ENABLE_B
От: Веселопедист  
Дата: 16.11.10 09:46
Оценка:
Здравствуйте, 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()

в чем проблема так и осталось мне непонятно
Re[3]: EnableScrollBar не срабатывает при флаге ESB_ENABLE_B
От: Pavel Dvorkin Россия  
Дата: 16.11.10 09:52
Оценка:
Здравствуйте, Веселопедист, Вы писали:



В>м... просто надо их включать/выключать

В>код выше набросал просто для проверки именно самой функции 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.
With best regards
Pavel Dvorkin
Re[4]: EnableScrollBar не срабатывает при флаге ESB_ENABLE_B
От: Веселопедист  
Дата: 16.11.10 14:13
Оценка:
чтобы было нагляднее, приведу свой текущий код:
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.
Слегка модифицировал, чтобы выводился текст ошибки (если есть)
пишет "Операция успешно завершена" на каждой итерации. а линейки блокируются, и потом не разблокируются
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.