На первый взгляд простой вопрос, но не получается решить.
В среде 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++. Прикладные вопросы' — Павел Кузнецов
Здравствуйте, 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
Здравствуйте, 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 *.
Всё, сам решил. Действительно очередная "фича" от Microsoft.