【问题标题】:How do you disable a CComboBox in C++?如何在 C++ 中禁用 ComboBox?
【发布时间】:2017-12-06 22:46:08
【问题描述】:

我对此进行了广泛的搜索,我想出大约 20 次的答案是使用 CWnd::EnableWindow(FALSE)。目前,我有:

GetDlgItem(myComboBox)->EnableWindow(FALSE);

现在整个 Dialog 没有显示,而不是禁用 ComboBox,而且由于它是一个模态对话框(或者至少我猜这是原因),整个程序被锁定,因为我无法关闭如果不存在对话框。

有没有办法在不让它完全消失的情况下禁用对该框的编辑;类似于 SetReadOnly() 对 CEdit 所做的操作?

编辑: 突然,上面的语法在第二天早上就开始起作用了。我仍然不完全确定为什么它一开始就不起作用。

【问题讨论】:

  • 您是否从 UI 线程以外的其他线程调用该 API?
  • 很遗憾,我无法自信地回答这个问题。这是一个庞大的代码库,我现在只是在编辑 2-3 个类。
  • 想法:检查你的资源文件并检查资源ID是否正确分配和唯一。我记得在遗留 MFC 代码库中这是一个问题。
  • @ChristianG 在对 ID 进行更彻底的调查后,我发现 ComboBox 的 ID 号与 4 个 other 窗口共享,但它们都不是来自同一个窗口对话框。这应该有所作为吗?
  • @LLS2:不,因为窗口 ID 仅在其各自的对话框中是唯一的,因此多个对话框可以重用相同的 ID。 GetDlgItem() 与调用它的对话框相关。

标签: c++ mfc dialog modal-dialog


【解决方案1】:

您似乎试图从与对话框不同的线程调用EnableWindow()

你可以试试这个,看看它是否适合你:

GetDlgItem(myComboBox)->PostMessage(WM_ENABLE, (WPARAM)FALSE);

【讨论】:

    【解决方案2】:

    EnableWindow(FALSE) 是要调用的正确函数,但您的语法看起来可能不正确(但很难用这样一个最小的例子来说明)。

    myComboBoxCComboBox 的实例吗?如果是这样,我希望看到:

    myComboBox.EnableWindow(FALSE);
    

    或者,使用关联的资源 ID:

    ((CComboBox*)GetDlgItem(IDC_MY_COMBO_BOX))->EnableWindow(FALSE);
    

    线程问题或重复的资源 ID 也可能导致奇怪的问题。

    【讨论】:

    • 我为缺乏明确性表示歉意。 “myComboBox”是资源 ID。
    • 如果您需要 OP 的澄清,评论是合适的工具。除此之外,(CComboBox*)-cast 是不必要的。
    • 那么你应该确保组合框的资源ID不与主窗口的ID冲突
    • 我最初没有演员表,但即使有了演员表,我也看到了相同的结果。父窗口不再可见,程序冻结。
    • 另外,主窗口和 ComboBox 的 ID 不同,所以这应该不是问题。
    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2019-01-09
    • 2012-11-15
    相关资源
    最近更新 更多