请教各位:MFC CHECKBOX如何根据bool值来显示选中与未选中状态呢

Seventaxi 2018-06-13 02:30:54
在消息函数里只有BN_CLICKED处理函数,如何才能不通过点击界面,而是根据判断值来改变CHECKBOX的状态?谢谢各位解答一下
...全文
1224 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2018-06-19
  • 打赏
  • 举报
回复
然后传递CHECKPTC值给处理函数,((CETBDlg*)GetParent())->CHECKPTC = 1; 要发自定义消息 否则 :OnBnChangedCheckPtc() 不会 运行, 因为这是 消息 处理函数。
Seventaxi 2018-06-19
  • 打赏
  • 举报
回复
引用 24 楼 schlafenhamster 的回复:
你如何“ 发现CHECKPTC改变" ?

我是小白,我再叙述一下我想实现的功能吧,有故障了。就自动勾选相应项。
下位机(控制器)传过来16进制数据,我根据数据值设定CHECKPTC的值(0或1),
然后传递CHECKPTC值给处理函数,((CETBDlg*)GetParent())->CHECKPTC = 1;但是我的处理函数未进行处理void CETBDlg::OnBnChangedCheckPtc()
{
if (CHECKPTC == 1)

((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1);
else
((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0);
/*CHECKPTC=1;*/
UpdateData(TRUE);

}
我觉得我处理函数应该自定义一个,而不是用类向导生产的BN_CLICK事件处理函数
schlafenhamster 2018-06-19
  • 打赏
  • 举报
回复
你如何“ 发现CHECKPTC改变" ?
Seventaxi 2018-06-19
  • 打赏
  • 举报
回复
引用 22 楼 schlafenhamster 的回复:
重复一遍 下位机发现CHECKPTC改变时(在接受线程中吧?)必须 发这个消息 给 主程序。 WM_PTC_CHANGED ( #define WM_PTC_CHANGED (WM_APP + 10002 )) 即 SendMessage(WM_PTC_CHANGED,CHECKPTC,0);
可以私下请教您么,qq564492444
schlafenhamster 2018-06-19
  • 打赏
  • 举报
回复
重复一遍 下位机发现CHECKPTC改变时(在接受线程中吧?)必须 发这个消息 给 主程序。 WM_PTC_CHANGED ( #define WM_PTC_CHANGED (WM_APP + 10002 )) 即 SendMessage(WM_PTC_CHANGED,CHECKPTC,0);
Seventaxi 2018-06-19
  • 打赏
  • 举报
回复
引用 20 楼 xianglitian 的回复:
[quote=引用 17 楼 Seventaxi 的回复:] [quote=引用 15 楼 xianglitian 的回复:] [quote=引用 3 楼 Seventaxi 的回复:] 就是我得到bool 值为1.我可以将状态设置为选中,bool值为0,状态设置不选中。消息函数用哪个,该怎么写呢
要看你通过什么渠道来获取1或0啊 比如可以通过一个时钟消息不断的检测[/quote]
引用 15 楼 xianglitian 的回复:
[quote=引用 3 楼 Seventaxi 的回复:] 就是我得到bool 值为1.我可以将状态设置为选中,bool值为0,状态设置不选中。消息函数用哪个,该怎么写呢
要看你通过什么渠道来获取1或0啊 比如可以通过一个时钟消息不断的检测[/quote] 那如果我在处理函数里直接声明值为1,程序为何不执行操作。 void CETBDlg::OnBnClickedCheckPtc() { CHECKPTC=1 if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); } 是处理函数不对吗?[/quote] OnBnClickedCheckPtc 你这个函数是自定义函数么? 你通过什么方法触发的这个函数[/quote] 这个不是我自定义的,是通过类向导里BN_CLICK这个事件。我想找BN_CHANGED,但是没有。所以导致我接收到状态值改变,函数也不处理。请问该怎么解决呢?
Seventaxi 2018-06-19
  • 打赏
  • 举报
回复
引用 26 楼 schlafenhamster 的回复:
然后传递CHECKPTC值给处理函数,((CETBDlg*)GetParent())->CHECKPTC = 1; 要发自定义消息 否则 :OnBnChangedCheckPtc() 不会 运行, 因为这是 消息 处理函数。
直接用((CETBDlg*)GetParent())->CHECKPTC = 1;就解决了,是我想多了
向立天 2018-06-16
  • 打赏
  • 举报
回复
引用 17 楼 Seventaxi 的回复:
[quote=引用 15 楼 xianglitian 的回复:] [quote=引用 3 楼 Seventaxi 的回复:] 就是我得到bool 值为1.我可以将状态设置为选中,bool值为0,状态设置不选中。消息函数用哪个,该怎么写呢
要看你通过什么渠道来获取1或0啊 比如可以通过一个时钟消息不断的检测[/quote]
引用 15 楼 xianglitian 的回复:
[quote=引用 3 楼 Seventaxi 的回复:] 就是我得到bool 值为1.我可以将状态设置为选中,bool值为0,状态设置不选中。消息函数用哪个,该怎么写呢
要看你通过什么渠道来获取1或0啊 比如可以通过一个时钟消息不断的检测[/quote] 那如果我在处理函数里直接声明值为1,程序为何不执行操作。 void CETBDlg::OnBnClickedCheckPtc() { CHECKPTC=1 if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); } 是处理函数不对吗?[/quote] OnBnClickedCheckPtc 你这个函数是自定义函数么? 你通过什么方法触发的这个函数
schlafenhamster 2018-06-14
  • 打赏
  • 举报
回复
"根据下位机传来的数值来体现checkbox的选中或者不选中状态,比如设定判断变量CHECKPTC,值为1,则显示选中。值为0,不显示选中。 不就是 : if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); 、、 问题是 下位机 接受到 CHECKPTC 时 要 给 主程序 一个 CHECKPTC 消息, 如 WM_PTC_CHANGED ( #define WM_PTC_CHANGED (WM_APP + 10002 )) 主程序 响应 WM_PTC_CHANGED 的 代码 就是 上面代码
Seventaxi 2018-06-14
  • 打赏
  • 举报
回复
引用 10 楼 cvbtvbwu 的回复:
[quote=引用 9 楼 Seventaxi 的回复:] [quote=引用 8 楼 schlafenhamster 的回复:] 不明白 , 你说 清楚些 ! “想由自己传入一个值或者是模拟界面点击来响应事件”
就是我做的上位机,根据下位机传来的数值来体现checkbox的选中或者不选中状态,比如设定判断变量CHECKPTC,值为1,则显示选中。值为0,不显示选中。二checkbox没有BN_CHANGE事件,只有BN_CLICK事件,我写成下面的 void CETBDlg::OnBnClickedCheckPtc() { // TODO: 在此添加控件通知处理程序代码 if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); UpdateData(TRUE); } 这么写在BN_CLICK事件代码里是无效的,请问有其他解决方法吗?谢谢[/quote] if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); 上面这些代码是在收到串口数据时,判断CHECKPTC设置checkbox,不是在OnBnClickedCheckPtc[/quote] 是的,因为没有BN_CHANGE事件,所以我尝试写在BN_CLICK事件里。所以在考虑模拟一个checkbox的点击事件,来实现不通过界面点击就可以实现选中与非选中状态。请问有具体的解决方法吗
叶恭介叶恭介 2018-06-14
  • 打赏
  • 举报
回复
引用 9 楼 Seventaxi 的回复:
[quote=引用 8 楼 schlafenhamster 的回复:] 不明白 , 你说 清楚些 ! “想由自己传入一个值或者是模拟界面点击来响应事件”
就是我做的上位机,根据下位机传来的数值来体现checkbox的选中或者不选中状态,比如设定判断变量CHECKPTC,值为1,则显示选中。值为0,不显示选中。二checkbox没有BN_CHANGE事件,只有BN_CLICK事件,我写成下面的 void CETBDlg::OnBnClickedCheckPtc() { // TODO: 在此添加控件通知处理程序代码 if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); UpdateData(TRUE); } 这么写在BN_CLICK事件代码里是无效的,请问有其他解决方法吗?谢谢[/quote] if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); 上面这些代码是在收到串口数据时,判断CHECKPTC设置checkbox,不是在OnBnClickedCheckPtc
Seventaxi 2018-06-14
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
不明白 , 你说 清楚些 ! “想由自己传入一个值或者是模拟界面点击来响应事件”
就是我做的上位机,根据下位机传来的数值来体现checkbox的选中或者不选中状态,比如设定判断变量CHECKPTC,值为1,则显示选中。值为0,不显示选中。二checkbox没有BN_CHANGE事件,只有BN_CLICK事件,我写成下面的 void CETBDlg::OnBnClickedCheckPtc() { // TODO: 在此添加控件通知处理程序代码 if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); UpdateData(TRUE); } 这么写在BN_CLICK事件代码里是无效的,请问有其他解决方法吗?谢谢
schlafenhamster 2018-06-14
  • 打赏
  • 举报
回复
不明白 , 你说 清楚些 ! “想由自己传入一个值或者是模拟界面点击来响应事件”
Seventaxi 2018-06-14
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
m_BTarchive.SetCheck(1);
我是想由自己传入一个值或者是模拟界面点击来响应事件。来实现选中或未选中。就相当于编辑框类型的EN_CHANGE功能。但是checkbox只有BN-CLICK事件。没有BN_CHANGE事件。请问该如何实现呢?
Seventaxi 2018-06-14
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
参考

BOOL CShowdirDlg::GetTypes2(string &str)
{
	str="";// ID=1002 -> 1006
	char tmp[20];// long enough for ".doc.docx."
	for (UINT n=IDC_CHECK1;n<=IDC_CHECK5; n++) 
	{
		if(((CButton*)GetDlgItem(n))->GetCheck() == 1)
		{
			tmp[0]=0;
			GetDlgItem(n)->GetWindowText(tmp,19);// "doc/docx"
			char *at=strchr(tmp,'/');
			if(at) *at='.';// '/' changed to '.'
			str +='.';     // seperator '.doc.docx.'
			str += tmp;    // 
		}
	}
	if(str.compare("")==0) return FALSE;// no one checked
	str += '.';// seperater
	//afxDump << str.c_str() << "\n";
	return TRUE;
}
我是想由自己传入一个值或者是模拟界面点击来响应事件。来实现选中或未选中。就相当于编辑框类型的EN_CHANGE功能。但是checkbox只有BN-CLICK事件。没有BN_CHANGE事件。请问该如何实现呢?
Seventaxi 2018-06-14
  • 打赏
  • 举报
回复
·
引用 1 楼 zgl7903 的回复:
GetCheck m_Button::GetCheck()
我是想由自己传入一个值或者是模拟界面点击来响应事件。来实现选中或未选中。就相当于编辑框类型的EN_CHANGE功能。但是checkbox只有BN-CLICK事件。没有BN_CHANGE事件。请问该如何实现呢?
schlafenhamster 2018-06-14
  • 打赏
  • 举报
回复
根据下位机传来的数值来体现checkbox的选中或者不选中状态," 下位机发现CHECKPTC改变时(在接受线程中吧?)必须 发这个消息 给 主程序。 WM_PTC_CHANGED ( #define WM_PTC_CHANGED (WM_APP + 10002 )) 即 SendMessage(WM_PTC_CHANGED,CHECKPTC,0);
Seventaxi 2018-06-14
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
"你的意思是自己自定义一个消息和消息处理函数来处理是吗?" 对 会写 吗? 1 。h //}}AFX_MSG afx_msg LRESULT OnSnapExit(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnUserMsg(WPARAM wParam, LPARAM lParam); 2. cpp //}}AFX_MSG_MAP ON_MESSAGE(WM_SNP_EXIT,OnSnapExit) ON_MESSAGE(WM_USER_MESSAGE,OnUserMsg) 3 响应 LRESULT CMainFrame::OnUserMsg(WPARAM wParam, LPARAM lParam) { // pane text m_wndStatusBar.SetPaneText((int)wParam,(char*)lParam); return 0; }
这个是只对CHECKPTC这个消息做处理的吗? 我这下面代码 if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); } 感觉一直没有执行。请问是什么原因呢?
Seventaxi 2018-06-14
  • 打赏
  • 举报
回复
引用 15 楼 xianglitian 的回复:
[quote=引用 3 楼 Seventaxi 的回复:] 就是我得到bool 值为1.我可以将状态设置为选中,bool值为0,状态设置不选中。消息函数用哪个,该怎么写呢
要看你通过什么渠道来获取1或0啊 比如可以通过一个时钟消息不断的检测[/quote]
引用 15 楼 xianglitian 的回复:
[quote=引用 3 楼 Seventaxi 的回复:] 就是我得到bool 值为1.我可以将状态设置为选中,bool值为0,状态设置不选中。消息函数用哪个,该怎么写呢
要看你通过什么渠道来获取1或0啊 比如可以通过一个时钟消息不断的检测[/quote] 那如果我在处理函数里直接声明值为1,程序为何不执行操作。 void CETBDlg::OnBnClickedCheckPtc() { CHECKPTC=1 if (CHECKPTC==1) ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(1); else ((CButton*)GetDlgItem(IDC_CHECK_PTC))->SetCheck(0); } 是处理函数不对吗?
schlafenhamster 2018-06-14
  • 打赏
  • 举报
回复
"你的意思是自己自定义一个消息和消息处理函数来处理是吗?" 对 会写 吗? 1 。h //}}AFX_MSG afx_msg LRESULT OnSnapExit(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnUserMsg(WPARAM wParam, LPARAM lParam); 2. cpp //}}AFX_MSG_MAP ON_MESSAGE(WM_SNP_EXIT,OnSnapExit) ON_MESSAGE(WM_USER_MESSAGE,OnUserMsg) 3 响应 LRESULT CMainFrame::OnUserMsg(WPARAM wParam, LPARAM lParam) { // pane text m_wndStatusBar.SetPaneText((int)wParam,(char*)lParam); return 0; }
加载更多回复(7)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧