通过拖动滚动条改变对话框背景色,按下箭头步长为 1, 按下滚动条空白区步长为10。
解答:
1、通过MFC可视化编辑框完成界面设计。
CScrollBar
的变量m_Red_ScrollBar
、m_Green_ScrollBar
、m_Blue_ScrollBar
。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);
}
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);
完成。