![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
Меняем цвет Scroll Bar в приложении MFC / SliderCtrl, ScrollBar / Элементы управления |
![]() |
Меняем цвет 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); } } } }
|
![]() |
![]() |
![]() |
|