Меняем цвет Scroll Bar в приложении MFC Автор: Paul DiLascia
Windows имеет два типа скролбаров. Это
"встроенные" скролбары, которые мы получаем
при использовании оконных стилей WS_HSCROLL и/или
WS_VSCROLL, и скролбар контролы, которые фактически
являются дочерними окнами и которые можно
создавать в пределах окна. Сообщение WM_CTLCOLOR могут
посылать только последние. class CMainFrame : public CFrameWnd {
protected:
CScrollbar m_wndHScroll;
CScrollBar m_wndVScroll;
•••
};
Затем, при создании фрейма, создаём их окна: int CMainFrame::OnCreate(...)
{
•••
CRect rc(0,0,0,0);
VERIFY(m_wndSBHorz.Create(WS_VISIBLE|WS_CHILD|SBS_HORZ,
rc, this, AFX_IDW_HSCROLL_FIRST));
VERIFY(m_wndSBVert.Create(WS_VISIBLE|WS_CHILD|SBS_VERT,
rc, this, AFX_IDW_HSCROLL_FIRST+1));
VERIFY(m_wndSBBox.Create(WS_VISIBLE|WS_CHILD|SBS_SIZEBOX,
rc, this,-1));
return 0;
}
Обратите внимание, что Вам прийдётся
создать бокс скролбара, это небольшой квадратик,
где вертикальный и горизонтальный скролбары
соединяются, чтобы можно было ресайзить окно и
избежать пустого пятна. CScrollBar* CPictureView::GetScrollBarCtrl(int nBar) const
{
CWnd* pParent = GetParent();
UINT nID = AFX_IDW_HSCROLL_FIRST;
if (nBar==SB_VERT)
nID++;
return (CScrollBar*)pParent->GetDlgItem(nID);
}
Она получает управление от родителя используя
удобные идентификаторы (ID) AFX_IDW_HSCROLL_FIRST и
AFX_IDW_HSCROLL_FIRST+1. // Из winfrm.cpp
void CFrameWnd::OnHScroll(...)
{
CWnd* pActiveView = GetActiveView();
if (pActiveView != NULL) {
pActiveView->SendMessage(WM_HSCROLL, ...);
}
}
Если Ваш вид наследован от CScrollView, то для
того, чтобы обработать сообщения прокрутки,
ничего делать не надо, так как MFC делает это
автоматически!
//////////////////
// изменение размеров фрейма: перемещение вида и скролбаров
//
void CMainFrame::RecalcLayout(BOOL bNotify)
{
CFrameWnd::RecalcLayout();
CView* pView = GetActiveView();
if (pView) {
CRect rc;
pView->GetWindowRect(&rc);
ScreenToClient(&rc);
// shrink view by scrollbars
int cyHScroll = GetSystemMetrics(SM_CYHSCROLL);
int cxVScroll = GetSystemMetrics(SM_CXVSCROLL);
rc.right -= cxVScroll;
rc.bottom -= cyHScroll;
pView->MoveWindow(rc);
// next, move the scroll bars: horz, vert and box
rc.left = rc.right;
rc.right += cxVScroll;
m_wndSBVert.MoveWindow(rc);
rc.left = 0;
rc.right -= cxVScroll;
rc.top = rc.bottom;
rc.bottom+= cyHScroll;
m_wndSBHorz.MoveWindow(rc);
rc.left = rc.right;
rc.right+=cxVScroll;
m_wndSBBox.MoveWindow(rc);
}
} }
}
|