MFCでフラットスクロールバー(VC++) MFCのCScrollViewのスタイルをフラットスクロールバーに変えることで、スクロールバーの背景色を変えることができます。 BOOL FlatSB_SetScrollProp( HWND hwnd, UINT index, INT_PTR newValue, BOOL fRedraw ); このAPIは、引数のindexの指定で、フラットのスタイルや、背景色等を設定することができます。 int FlatSB_SetScrollInfo( HWND hwnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw ); スクロールバーの位置などの情報が変わった時に、このAPIを呼び出して、スクロールバーの位置などの情報を再設定して、「フラット」の外形を維持します。 CScrollViewの派生クラスCScrlViewで、上の絵を表示できるようにプログラムを実装します。 #include "commctrl.h" #pragma comment(lib, "Comctl32.lib") void CScrlView::OnDraw(CDC* pDC) { CScrlDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CString strText; int iXPos = GetScrollPos(SB_HORZ); int iYPos = GetScrollPos(SB_VERT); strText.Format(_T("<%d,%d>"), iXPos, iYPos); pDC->TextOut(iXPos, iYPos, strText); } void CScrlView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); CSize sizeTotal; sizeTotal.cx = 2000; sizeTotal.cy = 1000; SetScrollSizes(MM_TEXT, sizeTotal); BOOL bRet = ::InitializeFlatSB(m_hWnd); ::FlatSB_SetScrollProp(m_hWnd, WSB_PROP_VSTYLE, FSB_FLAT_MODE, TRUE); ::FlatSB_SetScrollProp(m_hWnd, WSB_PROP_HSTYLE, FSB_FLAT_MODE, TRUE); ::FlatSB_SetScrollProp(m_hWnd, WSB_PROP_HBKGCOLOR, 0x000000ff, TRUE); ::FlatSB_SetScrollProp(m_hWnd, WSB_PROP_VBKGCOLOR, 0x0000ff00, TRUE); } void CScrlView::OnSize(UINT nType, int cx, int cy) { CScrollView::OnSize(nType, cx, cy); SCROLLINFO scrollinfo; memset(&scrollinfo, 0, sizeof(SCROLLINFO)); GetScrollInfo(SB_HORZ, &scrollinfo); FlatSB_SetScrollInfo(m_hWnd, SB_HORZ, &scrollinfo, TRUE); memset(&scrollinfo, 0, sizeof(SCROLLINFO)); GetScrollInfo(SB_VERT, &scrollinfo); FlatSB_SetScrollInfo(m_hWnd, SB_VERT, &scrollinfo, TRUE); Invalidate(); } void CScrlView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CScrollView::OnVScroll(nSBCode, nPos, pScrollBar); SCROLLINFO scrollinfo; memset(&scrollinfo, 0, sizeof(SCROLLINFO)); GetScrollInfo(SB_VERT, &scrollinfo); FlatSB_SetScrollInfo(m_hWnd, SB_VERT, &scrollinfo, TRUE); Invalidate(); } void CScrlView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CScrollView::OnHScroll(nSBCode, nPos, pScrollBar); SCROLLINFO scrollinfo; memset(&scrollinfo, 0, sizeof(SCROLLINFO)); GetScrollInfo(SB_HORZ, &scrollinfo); FlatSB_SetScrollInfo(m_hWnd, SB_HORZ, &scrollinfo, TRUE); Invalidate(); } |