新建对话框工程,拖拽按钮控件,添加点击事件响应函数!
a、双击模版进行添加;
b、事件方式进行添加;
button的常见事件类型
void CMFCTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
MessageBox(_T("1111"));
}
void CMFCTestDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
MessageBox(_T("1111"));
}
两种方式本质是一样的
按钮的消息类型
一共要删除3个地方:
a、h头文件中的函数声明
public:
afx_msg void OnBnClickedButton2();
b、cpp文件中的函数定义;
void CMFCTestDlg::OnBnClickedButton2()
{
MessageBox(_T("1111"));
}
c、cpp文件中的ON_BN_CLICKED宏绑定代码。
ON_BN_CLICKED(IDC_BUTTON2, &CMFCTestDlg::OnBnClickedButton2)
属性 | 含义 |
---|---|
Default Button | True,按下回车键,相应该按钮的处理函数 |
Visable | False ,在资源对话框存在,但是不能显示 |
Caption | 标题 |
Flat | 平滑 |
Disabled | false 启用 true 禁用 |
ID | 按钮的ID,可以通过ID得到该按钮 |
void CMFCTestDlg::OnBnClickedButton3()
{
// 启用和禁用登录按钮
//1.获取按钮句柄
HWND hBtn = ::GetDlgItem(m_hWnd, IDC_BUTTON2);
//2.获取当前按钮的指针
CWnd*login = GetDlgItem(IDC_BUTTON2);
if (hBtn == NULL)
{
return;
}
// 2.判断该按钮是否启用
if (GetDlgItem(IDC_BUTTON2)->IsWindowEnabled())
{
::EnableWindow(hBtn, FALSE);
}
else
{
login->EnableWindow(TRUE);
}
//GetDlgItem 是MFC中的函数
//::GetDlgItem SDK 全局的API
}
刚刚我们想对按钮控件启用或者禁用之前必须先获得按钮控件的窗口句柄,也就是说如果以后要对这个按钮控件进行任何操作,都得先获取他的窗口句柄,之后才能操作,也就是都得调用这句话:HWND hBtn = ::GetDlgItem(m_hWnd, IDC_BTN_1); 比较麻烦
简单的方式:就是绑定控件类型变量
MFCTestDlg.h
public:
CButton m_loginBtn;
------------------------------------------------------------------------------------------ void CMFCTestDlg::OnBnClickedButton3()
{
// 判断该按钮是否启用
if (m_loginBtn.IsWindowEnabled())
{
//禁用
m_loginBtn.EnableWindow(FALSE);
}
else
{
//启用
m_loginBtn.EnableWindow(TRUE);
}
}
微软也提供给我们控件的美化接口,那就是自绘,就是自己完全重新绘制控件的样子。其实控件的重绘是件非常麻烦的事情,类似按钮的倒还好,如果是类似列表控件那就更麻烦了。
我们可以在 codeproject 上面找开源的控件类,一般这些开源的控件类都是基于MFC中已有的各种控件的类,比如按钮的就是 CButton 的派生类,美化后的按钮效果如图:
下载源码:
1》.h文件和.cpp文件,导入工程 CCoolButton
2》右键添加 现有项
3》stdafx.h 可以手动添加,也可以在某个文件,修改预编译头
4》CButton m_loginBtn ==》改为CCoolButton m_loginBtn
a、要求一组内的单选框按钮控件ID必须由小到大排列,中间不能夹杂其他组的单选框按钮;
b、若有多组,则组内第一个单选框按钮的Group属性为True,其他为False;
c、选中组内某个单选框按钮:CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO2);
d、获得当前当前选中的单选框按钮控件:int nCheckId = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO3);
//选中方式一
CButton*radio1 = (CButton*)GetDlgItem(IDC_RADIO1);
radio1->SetCheck(BST_CHECKED);
//选中方式二,选中某一组内某个按钮
CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO2);
int nCheckId = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO3);
CString t;
t.Format(_T("%d"), nCheckId);
MessageBox(t); //整数转换为LPCTSTR
备注:Resouce.h定义的宏可以随便该,只有不重复就行
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_MFCTEST_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_BUTTON1 1000
#define IDC_BUTTON2 1001
#define IDC_BUTTON3 1002
#define IDC_RADIO1 1003
#define IDC_RADIO2 1004
#define IDC_RADIO3 1005
#define IDC_RADIO4 1006
#define IDC_RADIO5 1007
::SendMessage(::GetDlgItem(m_hWnd, IDC_CHECK1), BM_SETCHECK, BST_CHECKED, 0);
GetDlgItem(IDC_CHECK1)->SendMessage(BM_SETCHECK, BST_CHECKED, 0);
m_Check.SetCheck(BST_CHECKED);
三种方法任意一种都可以!
备注:取消勾选的话只需要把 BST_CHECKED 改成 BST_UNCHECKED 就可以了!
UINT nCheckState = ::SendMessage(::GetDlgItem(m_hWnd, IDC_CHECK1), BM_GETCHECK, 0, 0);
nCheckState = GetDlgItem(IDC_CHECK1)->SendMessage(BM_GETCHECK, 0, 0);
nCheckState = m_Check.GetCheck();
三种方法任意一种都可以!
如果返回值 nCheckState 的值为 BST_CHECKED,那么就是勾选状态。如果值为 BST_UNCHECKED,那么就是非勾选状态。
原文:https://www.cnblogs.com/chance0x1/p/13110857.html