本部分共涉及八种控件
Picture控件可以做分割线使用也可以载入位图或者ICON。 Spin控件提供了一对箭头可以微调控件所表示的数值
一. Picture控件
Picture控件主要有两个用途,第一个用途是分割线 第二个用途为插入图片
分割线的使用方法:将Picture控件压扁以后Type属性设置为Frame,Color属性设置为Etched(深灰)
插入图片(Icon和Bitmap)
首先在资源文件当中点击右键选择添加资源类型,比如说Bitmap或者是Icon
然后查看ID,以便选入ID
最后在Picture控件的属性框中将Type选项中选为Bitmap或者是Icon,然后在Image选项中选择刚才加入图片的ID
Spin控件的使用
Spin控件通常与tab order位于它前面的控件成对进行使用,可以首先拖放一个编辑框控件,然后拖放一个Spin紧挨着
将Spin的属性Allignment设置为Right Align并且选中Auto buddy属性
在InitDialog中添加初始化代码,设置Spin的范围为0~100,当前位置为50
BOOL C对话框Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
//-----spin----
CSpinButtonCtrl*pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);
pSpin->SetRange(0, 100);
pSpin->SetPos(50);
pSpin->GetBuddy()->SetWindowText(L"5.0");
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
使用类向导添加WM_VSCROLL消息响应代码
Edit控件显示范围为0.0~10.0每次调整步长为0.1但是Spin控件只支持整数范围,所以需要进行重映射
编写代码如下
void C对话框Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (pScrollBar->GetDlgCtrlID() == IDC_SPIN1)
{
CString strValue;
strValue.Format(L"%3.1f", (double)nPos / 10.0);
((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowTextW(strValue);
}
CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}
Spin控件
实现的程序界面如下
初始化函数要写
用什么指针控制,Spin的范围,初始位置与其配合的控件的显示问题
BOOL CSpin控件的使用Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
//CSpinButtonCtrl类型指针顾名思义就是控制类型
//GetDlgItem即获得ID
CSpinButtonCtrl*pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);
pSpin->SetRange(0, 100);
pSpin->SetPos(50);
pSpin->GetBuddy()->SetWindowTextW(L"5.0");//GetBuddy指向伙伴的指针,在这里就指向了编辑框控件
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
响应方面通过类向导添加WM_VSCROLL消息的响应(相似于滚动条控件)可以联系前面的SDK编程进行几个参数的联想
void CSpin控件的使用Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (pScrollBar->GetDlgCtrlID() == IDC_SPIN1)//如果获得来自Spin的消息
{
CString strValue;
strValue.Format(L"%3.1f", (double)nPos / 10.0);
//CSpinButtonCtrl*顾名思义就是Spin的控制按键,按下以后通过该指针反馈到伙伴身上
((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowTextW(strValue);
}
CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}
Progress控件
该控件就是一个指示百分比的控件,也就是下面的绿的,估计具体样式根据不同操作系统而定
下列贴上代码,首先是OnInitDialog的代码,就是初始化咯
BOOL C对话框通用控件Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pProg->SetRange(0, 100);
pProg->SetPos(50);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
第二部分就是按钮的单击事件
这是第一个按钮
void C对话框通用控件Dlg::OnBnClickedButtonStart()
{
// TODO: 在此添加控件通知处理程序代码
CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pProg->SetPos(0);
SetTimer(2008, 100, NULL);
/*
SetTimer是一种API函数,位于user32.dll中。
你想每隔一段时间执行一件事的的时候,你可以使用它。
使用定时器的方法比较简单,通常告诉Windows一个时间间隔,
然后Windows以此时间间隔周期性触发程序。
通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。
不需要指定定时器时,可以调用对应的KillTimer函数销毁指定的时钟。
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT nElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
*/
}
这是第二个
void C对话框通用控件Dlg::OnBnClickedButtonReverse()
{
// TODO: 在此添加控件通知处理程序代码
CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pProg->SetPos(100);
SetTimer(2009, 100, NULL);
}
最后是写WM_TIMER的响应函数,对应于前面的SetTimer中的ID
void C对话框通用控件Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nIDEvent == 2008)
{
CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pProg->SetPos(pProg->GetPos() + 1);
if (pProg->GetPos() >=100)
{
KillTimer(nIDEvent);
AfxMessageBox(L"Boom!!!!!!!!~~~");
}
}
else if (nIDEvent == 2009)
{
CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pProg->SetPos(pProg->GetPos() - 1);
if (pProg->GetPos() == 0)
{
KillTimer(nIDEvent);
AfxMessageBox(L"有错误别墨迹,赶紧改");
}
}
CDialogEx::OnTimer(nIDEvent);
}
Slider控件
和滚动条控件差不多
首先在OnInitDialog中添加下列代码进行相关初始化
CSliderCtrl*pSlider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
pSlider->SetRange(0, 100);
pSlider->SetPos(50);
CString strText1;
strText1.Format(L"%d", pSlider->GetPos());
SetDlgItemText(IDC_STATIC_SLIDER, strText1);
然后添加WM_HSCROLL消息
void C对话框通用控件Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (pScrollBar->GetDlgCtrlID() == IDC_SLIDER1)
{
CSliderCtrl*pSlider = (CSliderCtrl*)pScrollBar;
CString strText;
strText.Format(L"%d", pSlider->GetPos());
SetDlgItemText(IDC_STATIC_SLIDER, strText);
}
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
Date Time Picker
先扔代码,后续补上图片
初始化部分
//Date Time Control
CDateTimeCtrl*pDT = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);
CString formatStr = _T("'今天是:'yy'/'MM'/'dd'");
pDT->SetFormat(formatStr);
后续报时按钮响应程序
void C对话框通用控件Dlg::OnBnClickedButtonTime()
{
// TODO: 在此添加控件通知处理程序代码
CDateTimeCtrl*pDT = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);
CTime t;
pDT->GetTime(t);
CString s = t.Format(L"%A,%B,%d,%Y,%H:%M:%S");
AfxMessageBox(s);
}