按钮
单选按钮、普通按钮、复选按钮
void CButtonDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString str = "";
if(m_radio1.GetCheck() == 1)
str += "年龄为大于30岁";
else if(m_radio2.GetCheck() == 1)
str += "年龄为15到30岁之间";
else if(m_radio3.GetCheck() == 1)
str += "年龄为小于15岁";
else
str += "年龄未知";
str += "爱好包括:";
if(m_check1.GetCheck() == 1)
str += "聊天交友,";
if(m_check2.GetCheck() == 1)
str += "查阅资料,";
if(m_check3.GetCheck() == 1)
str += "打游戏,";
if(m_check4.GetCheck() == 1)
str += "进论坛。";
m_button.SetWindowText("您已经按下确定按钮");
AfxMessageBox(str);
}
滚动条
- 对话框放置一个滚动条
- 设置滚动条控制变量m_test,注意是控制变量,非value、int
- 在函数OnInitDialog中对m_test初始化,在return true之前
// TODO: Add extra initialization here
m_test.SetScrollRange(0,100);//0-100范围
m_test.SetScrollPos(10);//当前位置初始化为10
- 对CTestDlg添加类向导,OnVScroll事件,添加消息响应函数:
void CTestDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
int n = m_test.GetScrollPos();
if(pScrollBar == &m_test)
switch(nSBCode)
{
case SB_THUMBTRACK:
m_test.SetScrollPos(nPos); break;
case SB_LINEDOWN:
m_test.SetScrollPos(n + 1); break;
case SB_LINEUP:
m_test.SetScrollPos(n - 1); break;
case SB_PAGEDOWN:
m_test.SetScrollPos(n + 3); break;
case SB_PAGEUP:
m_test.SetScrollPos(n - 3); break;
}
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
静态文本控件
若需要改变静态文本的内容,添加控制性变量,设置name以示区别,调用SetWindowText进行改变。
列表框控件
- 属性中single表示单选,multiple表示多选,extended表示能拖动多选
- 为列表框建立控制型变量m_list,注意是控制性,非value型
- 在CTestDlg::OnInitDialog中添加如下:
// TODO: Add extra initialization here
m_list.AddString("唱歌");
m_list.AddString("绘画");
m_list.AddString("篮球");
m_list.AddString("足球");
m_list.AddString("写作");
m_list.InsertString(1,"看电影");
m_list.InsertString(3,"上网");
m_list.InsertString(0,"逛街");
- 添加确定按钮消息响应函数:
void CTestDlg::OnOK()
{
// TODO: Add extra validation here
CString message = "您的爱好有:";
CString str;
int num = m_list.GetSelCount();
int m[10];
for(int i=0;i<10;i++ )
m[i] = -1;
m_list.GetSelItems(num,m);
for(i = 0;i < 10;i++)
{
if(m[i] != -1)
{
m_list.GetText(m[i],str);
message += str;
}
}
AfxMessageBox(message);
// CDialog::OnOK();
}
- 为列表框添加一个双击某个选项的消息响应函数
void CTestDlg::OnDblclkList1()
{
// TODO: Add your control notification handler code here
AfxMessageBox("请进行单击选择");
}
列表视图
- 属性中LVS_ICON表示大图标显示,LVS_SMALLICON表示小图标显示,还有列表显示和详细报表显示
- 创建一个详细报表列表,添加控制性变量m_list
- 在CTestDlg::OnInitDialog函数中编写代码如下:
// TODO: Add extra initialization here
m_list.SetBkColor(RGB(0,0,0));//背景颜色
m_list.SetTextBkColor(RGB(255,0,0));//字体背景色
m_list.SetTextColor(RGB(255,255,0));//字体颜色
m_list.InsertColumn(0,"日期");
m_list.InsertColumn(1,"天气");
//获取列表宽度
RECT rect;
m_list.GetWindowRect(&rect);
int wid = rect.right - rect.left;
//为每列设置列宽
m_list.SetColumnWidth(0,wid/4);
m_list.SetColumnWidth(1,3*wid/4);
m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
for(int i=0;i<7;i++)
{
CString str;
str.Format("星期%d",i+1);
m_list.InsertItem(0,"aa");
m_list.SetItemText(0,0,str);
m_list.SetItemText(0,1,(i%2==0)?"晴":"多云");
}
树视图控件的构成
- 创建一个树视图,属性中选择Styles标签,选择其中的has buttons、has lines和lines at root复选框。
- 在资源编辑器中添加三个图标IDI_ICON1,2,3
- CTestDlg类中添加数据成员CImageList m_imageList
class CTestDlg : public CDialog
{
// Construction
public:
CImageList m_imageList;//++++++++++++++++++++++++++++
- 在CTestDlg::OnInitDialog中添加代码如下:
// TODO: Add extra initialization here
HICON hIcon[3]; //图标数组
int n;
m_imageList.Create(32,32,0,16,16);
hIcon[0] = AfxGetApp()->LoadIcon(IDI_ICON1);
hIcon[1] = AfxGetApp()->LoadIcon(IDI_ICON2);
hIcon[2] = AfxGetApp()->LoadIcon(IDI_ICON3);
for(n = 0;n < 3;n++)
{
m_imageList.Add(hIcon[n]);
}
CTreeCtrl * pTree = (CTreeCtrl *)GetDlgItem(IDC_TREE1);
pTree->SetImageList(&m_imageList,TVSIL_NORMAL);
TV_INSERTSTRUCT tvinsert;
tvinsert.hParent = NULL;
tvinsert.hInsertAfter = TVI_LAST;
tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE| TVIF_TEXT;
tvinsert.item.hItem = NULL;
tvinsert.item.state = 0;
tvinsert.item.stateMask = 0;
tvinsert.item.cchTextMax = 6;
tvinsert.item.iSelectedImage = 1;
tvinsert.item.cChildren = 0;
tvinsert.item.lParam = 0;
//第一层
tvinsert.item.pszText = "学校";
tvinsert.item.iImage = 0;
HTREEITEM hDad= pTree ->InsertItem(&tvinsert);
//第二层
tvinsert.hParent = hDad;
tvinsert.item.pszText = "自动化学院";
tvinsert.item.iImage = 1;
HTREEITEM hDad21=pTree->InsertItem(&tvinsert); //第二层两个项目
tvinsert.item.pszText = "通信学院";
HTREEITEM hDad22=pTree->InsertItem(&tvinsert);
//第三层
//第二层第一个项目的两个子项目
tvinsert.hParent = hDad21;
tvinsert.item.pszText = "电气工程专业";
tvinsert.item.iImage = 2;
pTree->InsertItem(&tvinsert);
tvinsert.item.pszText = "自动化专业";
pTree->InsertItem(&tvinsert);
//第二层第二个项目的两个子项目
tvinsert.hParent = hDad22;
tvinsert.item.pszText = "通信工程";
tvinsert.item.iImage = 2;
pTree->InsertItem(&tvinsert);
tvinsert.item.pszText = "电气信息";
pTree->InsertItem(&tvinsert);
编辑框
- 创建对话框应用程序,两个编辑框,一个按钮
- 设置编辑框属性:多行,水平滚动、垂直滚动、需要返回,边界
- 添加控制性变量m_edit1、m_edit2
- 为按钮添加消息响应函数:
void CTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_edit2.SetSel(0,-1);
m_edit2.ReplaceSel(""); //清除编辑框2的内容
m_edit1.SetSel(0,-1);
m_edit1.Copy(); //将编辑框1内的内容复制到剪贴板
m_edit1.ReplaceSel(""); //清除编辑框1的内容
m_edit2.Paste(); //将剪贴板内容粘贴到编辑框2中
}
组合框
- 类型:简单类型没有三角符号、下拉和下拉列表有三角符号,下拉还可以在编辑框中输入。
- 属性、数据中输入列表选项,一行一项,ctrl+enter换行
- 建立消息响应函数
属性页
- 创建对话框程序
- 添加属性页控件IDC_TAB
- 利用类向导,添加控制变量CTabCtrl m_tab
- 利用资源管理器添加两个对话框资源dialog1、dialog2,设置其属性为child下层,取消title
- 利用类向导为两个对话框添加类CDialog1、CDialog2
- 在CTestDlg类的声明文件中包含头文件
#include "Dialog1.h"
#include "Dialog2.h"
- 在CTestDlg类中添加两个成员变量
public:
CTestDlg(CWnd* pParent = NULL); // standard constructor
CDialog1 dlg1;//+++++++++++++++++++++++++++
CDialog2 dlg2;//++++++++++++++++++++++++++++
- 在CTestDlg::OnInitDialog中添加属性页控件的初始化语句
// TODO: Add extra initialization here
m_tab.InsertItem(0,"对话框1");
m_tab.InsertItem(1,"对话框2");
//创建两个以IDC_TAB为父窗口的属性页
dlg1.Create(IDD_DIALOG1,GetDlgItem(IDC_TAB));
dlg2.Create(IDD_DIALOG2,GetDlgItem(IDC_TAB));
//显示区域
RECT rect;
m_tab.GetClientRect(&rect);
rect.top += 30;
rect.left += 5;
rect.right -= 5;
rect.bottom -= 5;
dlg1.MoveWindow(&rect);
dlg2.MoveWindow(&rect);
dlg1.ShowWindow(TRUE);
dlg2.ShowWindow(FALSE);
m_tab.SetCurSel(0);
- 为了响应切换属性页的消息,利用类向导添加TCN_SELCHANGE和TCN_SECHANGING消息,前者是切换回发出的消息,后者是切换中发出的消息
- 利用类向导添加TCN_SELCHANGE,函数如下:
void CTestDlg::OnSelchangeTab(NMHDR* pNMHDR, LRESULT* pResult)
{
int num = m_tab.GetCurSel();
if(num == 0)
{
dlg1.ShowWindow(TRUE);
dlg2.ShowWindow(FALSE);
}
else
{
dlg1.ShowWindow(FALSE);
dlg2.ShowWindow(TRUE);
}
*pResult = 0;
}
进度条
在使用过程中可以在对话框中添加一个进度条控件,然后创建一个指向该进度条的对象指针。在应用程序中可以利用类中的函数对进度条控件进行操作。进度条控件的使用一般需要一个时间定时来实现进度条的前进。
滑块
当利用鼠标拖动滑块控件时,可以添加消息响应函数来处理。
IP Address控件
在网络类应用程序中,经常需要对IP地址进行处理,而IP地址控件是一个四段型的标准IP地址的形式,用户可以以点分十进制形式输入IP地址。IP地址是一个32位的二进制数据,实际中常用的形式是点分十进制形式,例如119.255.33.44。
时间控件
用来接收时间的输入和输出。
应用实例
进度条、滑块操作
- 创建对话框程序
- 放入进度条、按钮、滑块、编辑框(只读)
- 在类向导中对进度条和滑块添加变量
CSliderCtrl m_SliderCtrl;
CProgressCtrl m_progressCtrl;
- 添加单击按钮控件的消息映射,编写函数体如下:
void CTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_progressCtrl.SetRange(0,100);//1-100
for(int i=0;i<=100;i++)
{
m_progressCtrl.SetPos(i);
Sleep(100);//100ms
}
AfxMessageBox("进度条到达终点");
}
- 利用类向导,添加滑块的消息映射,需要注意的是,横向滑块移动的消息映射是WM_HSCROLL消息,而垂直的滑块的消息映射是WM_VSCROLL消息。
void CTestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
m_SliderCtrl.SetRange(0,100);
CString str;
str.Format("%d",m_SliderCtrl.GetPos());
SetDlgItemText(IDC_EDIT1,str);
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
时间控件应用实例
- 创建一个对话框
- 在资源编辑器中分别添加Date Time Picker控件和MonthCalendar
- 利用类向导分别为两个控件添加变量CdateTimeCtrl m_date和CmonthCalCtrl m_time
- 利用类向导添加再日历控件上选择日期时的消息映射,即添加消息MCN_SELECT的响应函数
void CTestDlg::OnSelectMonthcalendar1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CString str;
SYSTEMTIME time;
m_time.GetCurSel(&time); //得到选中的日期
str.Format("%d年 %d月 %d 日 星期%d",time.wYear,time.wMonth,time.wDay,
time.wDayOfWeek);
AfxMessageBox(str); //弹出消息框
*pResult = 0;
}
- 利用类向导为时间控件添加消息映射DTN_CLOSEUP
void CTestDlg::OnCloseupDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CString str;
SYSTEMTIME time; //结构体变量
m_date.GetTime(&time); //得到选中日期
str.Format("%d年 %d月 %d 日 星期%d",time.wYear,time.wMonth,time.wDay,
time.wDayOfWeek);
m_time.SetCurSel(&time); //设置日期
AfxMessageBox(str); //弹出消息框
*pResult = 0;
}
- 在Release版本下运行程序,否则消息框时间混乱!

被折叠的 条评论
为什么被折叠?



