MFC-滚动条控件

通过拖动滚动条改变对话框背景色,按下箭头步长为 1, 按下滚动条空白区步长为10。

MFC滚动条控件

解答:

1、通过MFC可视化编辑框完成界面设计。

2、为红绿蓝三个滚动条控件分别绑定类型为CScrollBar的变量m_Red_ScrollBarm_Green_ScrollBarm_Blue_ScrollBar

3、在BOOL CbkcolorDlg::OnInitDialog()(即对话框初始化函数)中添加控件初始化代码:

//设定滚动条范围
m_Red_ScrollBar.SetScrollRange(0, 255);
m_Green_ScrollBar.SetScrollRange(0, 255);
m_Blue_ScrollBar.SetScrollRange(0, 255);

//设定滚动条的当前位置
m_Red_ScrollBar.SetScrollPos(100);
m_Green_ScrollBar.SetScrollPos(100);
m_Blue_ScrollBar.SetScrollPos(100);

4、在类向导中为WM_HSCROLL消息添加消息响应函数响应滚动条水平拖动消息:

void CbkcolorDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	int iRedNowPos, iGreenNowPos, iBlueNowPos; //记录滚动条的整型数

	iRedNowPos = m_Red_ScrollBar.GetScrollPos();//获得滚动条当前位置
	iGreenNowPos = m_Green_ScrollBar.GetScrollPos();
	iBlueNowPos = m_Blue_ScrollBar.GetScrollPos();

	//对红色滚动条进行操作
	if (pScrollBar == &m_Red_ScrollBar)
	{
		switch (nSBCode)
		{
		case SB_THUMBTRACK: //拖动滚动条
			m_Red_ScrollBar.SetScrollPos(nPos); //设定滚动条位置
			iRedNowPos = nPos;
			break;
		case SB_LINERIGHT: //按向右按钮
			iRedNowPos = m_Red_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iRedNowPos = iRedNowPos + 1; //位置量+1
			if (iRedNowPos > 255) {
				iRedNowPos = 255;
			}
			break;
		case SB_LINELEFT: //按向左按钮
			iRedNowPos = m_Red_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iRedNowPos = iRedNowPos - 1; //位置量-1
			if (iRedNowPos < 0) {
				iRedNowPos = 0;
			}
			break;
		case SB_PAGERIGHT: //击向右按钮和滑动块之间的区域
			iRedNowPos = m_Red_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iRedNowPos = iRedNowPos + 10; //位置量+10
			if (iRedNowPos > 255) {
				iRedNowPos = 255;
			}
			break;
		case SB_PAGELEFT: //击向左按钮和滑动块之间的区域
			iRedNowPos = m_Red_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iRedNowPos = iRedNowPos - 10; //位置量-10
			if (iRedNowPos < 0) {
				iRedNowPos = 0;
			}
			break;
		}
	}

	//对绿色滚动条进行操作
	if (pScrollBar == &m_Green_ScrollBar)
	{
		switch (nSBCode)
		{
		case SB_THUMBTRACK: //拖动滚动条
			m_Green_ScrollBar.SetScrollPos(nPos); //设定滚动条位置
			iGreenNowPos = nPos;
			break;
		case SB_LINERIGHT: //按向右按钮
			iGreenNowPos = m_Green_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iGreenNowPos = iGreenNowPos + 1; //位置量+1
			if (iGreenNowPos > 255) {
				iGreenNowPos = 255;
			}
			break;
		case SB_LINELEFT: //按向左按钮
			iGreenNowPos = m_Green_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iGreenNowPos = iGreenNowPos - 1; //位置量-1
			if (iGreenNowPos < 0) {
				iGreenNowPos = 0;
			}
			break;
		case SB_PAGERIGHT: //击向右按钮和滑动块之间的区域
			iGreenNowPos = m_Green_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iGreenNowPos = iGreenNowPos + 10; //位置量+10
			if (iGreenNowPos > 255) {
				iGreenNowPos = 255;
			}
			break;
		case SB_PAGELEFT: //击向左按钮和滑动块之间的区域
			iGreenNowPos = m_Green_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iGreenNowPos = iGreenNowPos - 10; //位置量-10
			if (iGreenNowPos < 0) {
				iGreenNowPos = 0;
			}
			break;
		}
	}

	//对蓝色滚动条进行操作
	if (pScrollBar == &m_Blue_ScrollBar)
	{
		switch (nSBCode)
		{
		case SB_THUMBTRACK: //拖动滚动条
			m_Blue_ScrollBar.SetScrollPos(nPos); //设定滚动条位置
			iBlueNowPos = nPos;
			break;
		case SB_LINERIGHT: //按向右按钮
			iBlueNowPos = m_Blue_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iBlueNowPos = iBlueNowPos + 1; //位置量+1
			if (iBlueNowPos > 255) {
				iBlueNowPos = 255;
			}
			break;
		case SB_LINELEFT: //按向左按钮
			iBlueNowPos = m_Blue_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iBlueNowPos = iBlueNowPos - 1; //位置量-1
			if (iBlueNowPos < 0) {
				iBlueNowPos = 0;
			}
			break;
		case SB_PAGERIGHT: //击向右按钮和滑动块之间的区域
			iBlueNowPos = m_Blue_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iBlueNowPos = iBlueNowPos + 10; //位置量+10
			if (iBlueNowPos > 255) {
				iBlueNowPos = 255;
			}
			break;
		case SB_PAGELEFT: //击向左按钮和滑动块之间的区域
			iBlueNowPos = m_Blue_ScrollBar.GetScrollPos(); //得到当前滚动条位置
			iBlueNowPos = iBlueNowPos - 10; //位置量-10
			if (iBlueNowPos < 0) {
				iBlueNowPos = 0;
			}
			break;
		}
	}

	//设定滑块位置
	m_Red_ScrollBar.SetScrollPos(iRedNowPos);
	m_Green_ScrollBar.SetScrollPos(iGreenNowPos);
	m_Blue_ScrollBar.SetScrollPos(iBlueNowPos);

	Invalidate(); //发送重绘消息

	CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

5、上述代码中使用Invalidate()函数发送重绘对话框消息后,会调用OnPaint()函数,在void CbkcolorDlg::OnPaint()函数中加入重绘用户区的代码:

//重绘用户区
CDC *pDC = GetDC(); //得到设备环境指针
CBrush newBrush; //定义新画刷
newBrush.CreateSolidBrush(RGB(m_Red_ScrollBar.GetScrollPos(), m_Green_ScrollBar.GetScrollPos(), m_Blue_ScrollBar.GetScrollPos()));
pDC->SelectObject(&newBrush); //选入新画刷
CRect rect;
GetClientRect(&rect);
pDC->Rectangle(rect.left, rect.top, rect.right, rect.bottom);
ReleaseDC(pDC);

完成。

发帖时间: MFC