VC++ 6.0 Доступ к scrollbars в диалоговом окне
От: NickName01  
Дата: 18.11.04 10:38
Оценка:
На первый взгляд простой вопрос, но не получается решить.
В среде VisualStudio 6.0 создаю простейшее диалоговое окно в редакторе ресурсов. Задаю стили Horizontal Scroll и Vertical Scroll. Функция GetScrollBarCtrl(SB_VERT) для класса диалогового окна возвращает NULL. Функция API ::GetScrollInfo(...) возвращает ошибку. Как получить доступ к этим полосам прокрутки?

Формат вызова:

BOOL CDialogScrollBarsDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here

    CWnd const *pVScrollBar = GetScrollBarCtrl(SB_VERT);
    ASSERT(pVScrollBar != NULL);        // assert!
    SCROLLINFO ScrollInfo;
    ::ZeroMemory(&ScrollInfo, sizeof(ScrollInfo));
    ScrollInfo.cbSize = sizeof(ScrollInfo);
    ScrollInfo.fMask = SIF_ALL;
    BOOL bResult = ::GetScrollInfo(GetSafeHwnd(), SB_VERT, &ScrollInfo);
    if(!bResult) 
    {
        TRACE("%x\n", GetLastError());    // return 0
    }
    
    return TRUE;  // return TRUE  unless you set the focus to a control
}



22.11.04 00:44: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Re: VC++ 6.0 Доступ к scrollbars в диалоговом окне
От: nii_im_b Мухосранск  
Дата: 18.11.04 11:45
Оценка:
Здравствуйте, NickName01, Вы писали:

NN>На первый взгляд простой вопрос, но не получается решить.

NN>В среде VisualStudio 6.0 создаю простейшее диалоговое окно в редакторе ресурсов. Задаю стили Horizontal Scroll и Vertical Scroll. Функция GetScrollBarCtrl(SB_VERT) для класса диалогового окна возвращает NULL. Функция API ::GetScrollInfo(...) возвращает ошибку. Как получить доступ к этим полосам прокрутки?

NN>Формат вызова:


NN>
NN>BOOL CDialogScrollBarsDlg::OnInitDialog()
NN>{
NN>    CDialog::OnInitDialog();

NN>    // TODO: Add extra initialization here

NN>    CWnd const *pVScrollBar = GetScrollBarCtrl(SB_VERT);
NN>    ASSERT(pVScrollBar != NULL);        // assert!
NN>    SCROLLINFO ScrollInfo;
NN>    ::ZeroMemory(&ScrollInfo, sizeof(ScrollInfo));
NN>    ScrollInfo.cbSize = sizeof(ScrollInfo);
NN>    ScrollInfo.fMask = SIF_ALL;
NN>    BOOL bResult = ::GetScrollInfo(GetSafeHwnd(), SB_VERT, &ScrollInfo);
NN>    if(!bResult) 
NN>    {
NN>        TRACE("%x\n", GetLastError());    // return 0
NN>    }
    
NN>    return TRUE;  // return TRUE  unless you set the focus to a control
NN>}
NN>



This method does not operate on scroll bars created when the WS_HSCROLL or WS_VSCROLL bits are set during the creation of a window. The CWnd implementation of this function simply returns NULL. Derived classes, such as CView, implement the described functionality.

матчасть прежде всего!!! кстати CWnd const храбро заменяем на CScrollBar
Re[2]: VC++ 6.0 Доступ к scrollbars в диалоговом окне
От: NickName01  
Дата: 18.11.04 12:14
Оценка:
Здравствуйте, nii_im_b, Вы писали:

__>This method does not operate on scroll bars created when the WS_HSCROLL or WS_VSCROLL bits are set during the creation of a window. The CWnd implementation of this function simply returns NULL. Derived classes, such as CView, implement the described functionality.


Ох, господи, опять студенты. Товарисч, я на С пишу с 94 года. И не только курсовые. Наверно я видел всё что есть в MSDN по этому поводу. Приведенная Вами цитата относится к GetScrollBarCtrl(), классов не производных от CView, которую привел просто "до кучи" чтоб и её кто-нибудь не посоветовал. К API функции ::GetScrollInfo эта цитата никоим образом не относится.

Видимо, описанная в топике ситуация, какая-то "фича" VC++ (или баг). Если кто-то уже сталкивался с этим и ЗНАЕТ ответ — напишите как он обходится.

З.Ы.
__>матчасть прежде всего!!! кстати CWnd const храбро заменяем на CScrollBar

В С++ указатель на базовый класс может использоваться для производных классов, если не требуется вызывать по нему невиртуальные методы производного класса, так что "храбро" используем хоть CObject *.
Re: VC++ 6.0 Доступ к scrollbars в диалоговом окне
От: NickName01  
Дата: 18.11.04 12:37
Оценка:
Всё, сам решил. Действительно очередная "фича" от Microsoft.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.