从全局函数访问对话框控件

问题描述 投票:0回答:1

为什么这个表达式的计算结果总是为“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 个语句是从全局函数调用的,而全局函数又是从线程调用的。据我了解,线程必须是全局的。真的吗?

mfc dialog handle
1个回答
0
投票
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()
调用。

© www.soinside.com 2019 - 2024. All rights reserved.