SOFTIST 编程方法筆記 目录

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