[kaze's test] プログラミングメモ →目次

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();
}