想在MFC中实现滚动条slider和编辑框edit的联动(改变滚动条,显示数字在编辑框),同时想要添加两个滚动条,分别控制亮度和对比度。参考了几个博客在VS2017中跑不出来。自己写了一个能运行的版本,供大家参考。这里没有给出改变对比度和亮度的函数,只是实现实现滚动条slider和编辑框edit的联动。
最终实现的效果
第一部分:滚动条和编辑框联动部分。
第一步 ,在资源试图界面找到Dialog,打开Dialog界面(这里用的是MFC基于对话框类型)
在工具箱中双击slider control,添加两个。然后同样的道理,添加两个edit control。
添加完如下图所示(前面我又自行添加了两个Static Text静态文本,修改成亮度和对比度,以此来标识,看起来更清晰)。
第二步,给滚动条(slider)添加两个变量。
一个是控件类型,另一个是值类型。下面就以其中一个滚动条为例。该控件的ID名称是IDC_SLIDER1,对应的是上图中的亮度对应的滚动条的ID。
【1】右击滚动条,选择添加变量。如下图,一般只需要修改三个地方。类别,名称,访问(一般是private),这里改成:类别:控件,访问:private,名称:m_slider.然后点击完成,这样就添加好了控件类型的变量。
【2】再来添加值类型的变量。同样的,右击同一个滚动条,选择添加变量,此处修改类别:值,访问:private,名称改为m_int。点击完成即可。
用同样的手法给另外一个滚动条添加两个变量。如下图所示。
【1】控件类型变量。控件ID为:IDC_SLIDER2,名称:m_slider2
【2】值类型变量。数值变量名称为m_int2
再来看一下整个界面
第三步,滚动条初始化。
打开类试图,找到下面
在初始化部分BOOL CMFCApplication1Dlg::OnInitDialog()底下,找到下面这个位置,在TODO后面添加如下代码:
// TODO: 在此添加额外的初始化代码
//滚动条1
//设置滚动条滚动范围
m_slider.SetRange(0, 100);
//每十个单位画一个刻度
m_slider.SetTicFreq(10);
//设置初始位置
int Start=80;
m_slider.SetPos(Start);//滚动条初始位置
SetDlgItemInt(IDC_EDIT1, Start);//设置编辑框的初始值
//滚动条2
//设置滚动条滚动范围
m_slider2.SetRange(0, 300);
//每十个单位画一个刻度
m_slider2.SetTicFreq(10);
//设置初始位置
int Start2 = 80;
m_slider2.SetPos(Start2);
SetDlgItemInt(IDC_EDIT2, Start2);//编辑框的初始值
第四步,给滚动条添加事件
右击整个对话框(不是某一个控件),选择类向导,选择消息,找到WM_HSCROLL,双击,之后点击确定。
然后弹出如下界面
这里就是实现滚动条和编辑框联动的地方(改变滚动条,显示相应的值)需要注意的是,滚动条和按钮不一样,按钮可以添加很多的消息,而滚动条只有这么一个,因为它是在整个对话框页面设置的。那该怎么区分不同的滚动条呢?
方法是通过pSlider->GetDlgCtrlID()来和滚动条的ID来比较,区分是对不同的滚动条进行操作。
代码如下:
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (pScrollBar != NULL)
{
// 强制转换成CSliderCtrl
CSliderCtrl* pSlider = (CSliderCtrl*)pScrollBar;
// 根据CSlider控件的ID 来判断是哪一个滚动条
if (pSlider->GetDlgCtrlID() == IDC_SLIDER1)//对第一个滚动条进行操作
{
//获取当前位置值,放在变量m_int中
m_int = m_slider.GetPos();
//内容设置到编辑框中,编辑框的ID是IDC_EDIT1
SetDlgItemInt(IDC_EDIT1, m_int);
//On_ContrastAndBright(m_int, m_int2);//用来调整图片亮度和对比度的函数
//imshow("src1", g_dstImage);// opencv用来显示图片
}
if (pSlider->GetDlgCtrlID() == IDC_SLIDER2)//对第二个滚动条操作
{
//获取当前位置值,放在变量m_int2中
m_int2 = m_slider2.GetPos();
//内容设置到编辑框中,编辑框的ID是IDC_EDIT2
SetDlgItemInt(IDC_EDIT2, m_int2);
//On_ContrastAndBright(m_int, m_int2);//用来调整图片亮度和对比度的函数
//imshow("src1", g_dstImage);// opencv用来显示图片
}
}
最终的运行结果
总结:
1.安放控件
2.添加变量:控件类型和值类型。
3.初始化
4.添加事件。注意滚动条消息是对于整个页面的,对不同的滚动条的处理事件都写在这底下,区分的依据是对ID进行识别。