05. 基本控件(上)
基本控件(上)
- 基本的控制组件,通过控件可以提高效率
-
- 任何vc内部的windows基础控件都有一个固定的控件类可以与之建立控件型关联变量
- 有一些控件类是多种控件公用的,比如“CButton”类,按钮控件,单选按钮,复选框都是出自于这个 类,都是这个类派生出来的。
- 有些控件不但可以建立控件型关联变量,还可以建立数值型关联变量。
静态文本
- Static Text
- 用来在指定的位置显示特定的字符串,一般用来标识附近另一个控件的内容。
- 显示在静态文本控件中的字符串一般不再改变
- 在需要的时候也可以通过调用相应的函数来进行设置。通过CStatic类来进行修改,由CStatic类来支持静 态控件
静态文本示例
- 创建一个MFC程序,选择“基于对话框”。
- 修改对话框属性。拖入一个“Static Text”。修改为“网址”。再拖入第二个"static text"修改为“www.bai du.com”。来实现当点击第二个静态文本时,自动打开“www.baidu.com”这个网站。修改好ID以未区 别。
- 通过“类向导”,选择添加“MFC类”。在"MFC添加类向导”中自定义类名:CMyStatic。
- 在“CMyStatic”类中添加成员函数声明及定义
void SetLink(BOOL isLink);//设置超链接
void CMyStatic::SetLink(BOOL isLink) // 设置超链接
{
if (isLink)
{
//调用这个函数修改窗口的风格
ModifyStyle(0, //指定修改时要删除的窗口风格
SS_NOTIFY);//指定修改时将要增加的窗口风格
}
else
ModifyStyle(SS_NOTIFY, 0);
}
- 为这个类添加一个左键消息的处理程序。
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
- 实现函数体。
void CMyStatic::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CString strLink;
GetWindowText(strLink);//得到窗口上的文本,设置进参数中
ShellExecute(NULL, _T("open"), strLink, NULL, NULL, SW_NORMAL);//open strLink
里面的字符串
CStatic::OnLButtonDown(nFlags, point);
}
- 在主类生成对象。
- 为网址“添加变量”。
- 修改变量类型,如下所示:
//CStatic m_linkStatic;
CMyStatic m_linkStatic;
- 在初始化函数中
m_linkStatic.SetLink(true);//调用超链接
- 运行结果。如想改变该静态文本的颜色。添加“WM_CTLCOLOR”消息
if (IDC_STATIC_LINK == pWnd->GetDlgCtrlID())
{
pDC->SetTextColor(RGB(255, 0, 0));//dc中设置文本颜色为之前设定的表示颜色的变量
pDC->SetBkMode(TRANSPARENT);//dc中设置文本的背景模式为透明
}
- 还想改变这个静态文本的字体,则定义一个表示字体的类成员变量CFont m_newFont。
- 在初始化函数中初始化
CFont* font;
font = m_linkStatic.GetFont();//获取CFont对象
LOGFONT lf;
font->GetLogFont(&lf);//获取LOGFONT结构体
lf.lfHeight = 26; //修改字体大小
lf.lfItalic = TRUE; //倾斜
lf.lfUnderline = true;//下划线
lf.lfWeight = 400; //修改字体的粗细
m_newFont.CreateFontIndirectW(&lf);//创建一个新的字体
m_linkStatic.SetFont(&m_newFont);//通过关联的静态文本变量去设置新的字体
最后运行。
单选按钮
- 顾名思义:单选按钮只能选取一个。
- 通过单选按钮让用户选择其中一个控件,另外的控件就为非选择。
单选按钮示例
- 1、拖入“静态文本”,修改名字为:“性别”。再拖入两个单选按钮“Radio Button”,一个修改为“男”,一个 为“女”。修改这两个单选按钮的ID。再在右侧拖入一个“Button”,修改为:“选择”,修改ID
- 运行两个按钮都是非选中状态,设置一个默认选项
- 初始化函数中加入:
((CButton*)GetDlgItem(IDC_MAN))->SetCheck(BST_CHECKED);//默认选择男
运行代码,默认选择了“男”。
-
要想获得用户选择的单选是谁,通过用户点击“选择”这个button来得到一个消息盒子。
添加如下代码:
switch (GetCheckedRadioButton(IDC_MAN, IDC_WOMAN))//得到选择的单选按钮 { case IDC_MAN: MessageBox(_T("你选择的性别为:男"), _T("提示"), MB_OK | MB_ICONQUESTION); break; case IDC_WOMAN: MessageBox(_T("你选择的性别为:女"), _T("提示"), MB_OK | MB_ICONQUESTION); break; }
-
实现多组单选按钮。继续拖入3个“Radio Button”,修改名字。修改ID。还是通过按钮来进行操作。
switch (GetCheckedRadioButton(IDC_SMALL, IDC_BIG))
{
case IDC_SMALL:
MessageBox(_T("你选择的学历为:小学"), _T("提示"), MB_OK | MB_ICONQUESTION);
break;
case IDC_MEDIUM:
MessageBox(_T("你选择的学历为:高中"), _T("提示"), MB_OK | MB_ICONQUESTION);
break;
case IDC_BIG:
MessageBox(_T("你选择的学历为:大学"), _T("提示"), MB_OK | MB_ICONQUESTION);
break;
}
复选按钮
- check box
- MFC中复选按钮CheckBox的基类是CButton。
- 在复选按钮中有三种状态:
- 复选按钮没有被选中
- 复选按钮被选中
- 表示不确定(三态)
复选按钮示例
- 拖入三个“check box”,修改名字为:“吃饭”,“喝酒”,“打牌”。
- 为“选择”按钮添加处理程序:
//表示check box的3种状态的描述
CButton* pBtn = (CButton*)GetDlgItem(IDC_CHECK1);
int state = pBtn->GetCheck();
switch (state)
{
case 0:
MessageBox(_T("没有选中吃饭"));
break;
case 1:
MessageBox(_T("选中吃饭"));
break;
case 2:
MessageBox(_T("不确定选中吃饭"));
break;
default:
break;
}
//只是表示check box被选中
if (IsDlgButtonChecked(IDC_CHECK2))
MessageBox(_T("喝酒"));
编辑框
- 之前用过编辑框,在对话框中给出一个文本编辑框,供用户输入文字。
编辑框示例
-
拖入三个编辑框“edit”。
-
继续拖动一个edit,通过在这个edit中用文字显示出用户选择的选项。。 修改这个编辑框的属性:“Read Only”改为true。 修改“Multiline”为true。 修改“Vertical Scroll”为true。
-
为这4个edit绑定变量。
-
拖入按钮,进入按钮的处理函数。
UpdateData(true); if (m_strName.IsEmpty())//姓名不能为空 { MessageBox(_T("姓名不能为空值"),_T("错误"),MB_OK | MB_ICONERROR); GetDlgItem(IDC_EDIT_NAME)->SetFocus();//设置当前edit为输入焦点 return; } if (m_strMZ.IsEmpty())//民族不能为空 { MessageBox(_T("民族不能为空值"), _T("错误"), MB_OK | MB_ICONERROR); GetDlgItem(IDC_EDIT_MZ)->SetFocus(); return; } if (m_iAge > 200) { MessageBox(_T("年龄输入有误"), _T("错误"), MB_OK | MB_ICONERROR); m_iAge = 0;//年龄重置为0 UpdateData(false);//把绑定变量数据更新到对话框 GetDlgItem(IDC_EDIT_AGE)->SetFocus(); return; } m_strShowText += "姓名:"; m_strShowText += m_strName; m_strShowText += "\r\n"; m_strShowText += "性别:"; switch (GetCheckedRadioButton(IDC_MAN, IDC_WOMAN)) { case IDC_MAN: m_strShowText += "男"; break; case IDC_WOMAN: m_strShowText += "女"; break; } m_strShowText += "\r\n"; m_strShowText += "民族:"; m_strShowText += m_strMZ; m_strShowText += "\r\n"; m_strShowText += "年龄:"; TCHAR tempArr[16] = {}; _stprintf_s(tempArr, _T("%d"), m_iAge);//把整数按格式化输出到字符串 m_strShowText += tempArr; m_strShowText += "\r\n"; m_strShowText += "学历:"; switch (GetCheckedRadioButton(IDC_SMALL, IDC_BIG)) { case IDC_SMALL: m_strShowText += "小学"; break; case IDC_MEDIUM: m_strShowText += "高中"; break; case IDC_BIG: m_strShowText += "大学"; break; default: m_strShowText += "无"; } m_strShowText += "\r\n"; UpdateData(false);
按钮
按钮示例
-
单击鼠标修改文本内容,也可以通过属性栏进行编辑。
-
通过“类向导”添加BUTTON的控件变量,从而在对话框类中使用button的接口。
-
常用接口:
CWnd::SetWindowText 设置控件内容 CWnd::GetWindowText 获取控件内容 CWnd::EnableWindow 设置控件是否变灰 -
代码示例:
//获取按钮的内容 CString str; m_button.GetWindowText(str); MessageBox(str); //设置按钮内容 m_button.SetWindowText(TEXT("^_^")); //设置按钮状态为灰色 m_button.EnableWindow(FALSE); m_button.EnableWindow(TRUE);
-
按钮的响应,双击按钮控件后跳转至cpp,且自动生成响应函数:
//按钮BN_CLICKED事件处理函数 void CMFCApplication2Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 }