为什么这个表达式的计算结果总是为“true”?即使复选框控件 -
IDC_LANE1
- 未选中。
CMeetSetup MeetSetup;
if (IsDlgButtonChecked(MeetSetup.m_hWnd, IDC_LANE1) == BST_CHECKED);
CMeetSetup
是一个对话框窗口类。 MeetSetup
是该类的一个实例(显然)。我正在尝试从全局函数访问IDC_LANE1
。我没有收到编译器错误,但当我执行程序时,这些语句的计算结果始终为“true”。代码是Visual Studio 2022,MFC的。
如果未检查控件
IDC_LANE1
,我预计这 2 个语句将评估为“假”。也尝试过 (HWND)phWndView
而不是 MeetSetup.m_hWnd
但没有成功。
所讨论的 2 个语句是从全局函数调用的,而全局函数又是从线程调用的。据我了解,线程必须是全局的。真的吗?
CMeetSetup MeetSetup;
if (IsDlgButtonChecked(MeetSetup.m_hWnd, IDC_LANE1) == BST_CHECKED)
{
m_IDC_VLANE1.SetCheck(BST_CHECKED);
...
}
由于 MFC 的工作方式,这段代码没有任何意义。
当你用
CMeetSetup MeetSetup;
声明对话框时,对话框窗口实际上还不存在,除了设置成员变量之外的任何尝试都是徒劳的。
特别是在您的情况下,
MeetSetup.m_hWnd
始终为NULL,因为对话框窗口尚未创建。它只会在 DoModal
方法期间创建。
您需要做的是重写特殊方法
OnInitDialog
方法并完成所有初始化那里。此方法将在对话框窗口创建后但在实际显示之前由 DoModal()
调用。