【问题标题】:dialog box controls - detect changes对话框控件 - 检测更改
【发布时间】:2011-10-01 07:12:58
【问题描述】:

我想检测对话框上的任何控件何时被用户操作更改。例如,当在文本框中输入数据时,在日期时间选择器中输入日期,选中或取消选中复选框等。到目前为止,我已经忽略了此类通知,只是在何时检索控件的状态用户按下一些按钮,但现在我想知道发生了变化(我想启用属性表上的应用按钮)。我真的不在乎发生了什么变化,我只想知道发生了什么变化。我所说的更改并不是指焦点的更改,而是用户更改控件的一些实际操作。

我使用普通的旧 c++,没有 MFC 或任何花哨的东西。

我该怎么做?

【问题讨论】:

  • 如果不是 MFC,您是否使用 Win32 API 作为 GUI?
  • @jaywalker:是的,一个 Win32 API。

标签: c++ winapi modal-dialog


【解决方案1】:

您可以使用通过 WM_COMMAND 获得的BN_CLICKED 通知代码来测试复选框是否已被选中。

switch( uMsg ) {
  ...
  case WM_COMMAND: {
    switch( HIWORD( wParam ) ) {
    case BN_CLICKED: {
      if( Button_GetCheck( lParam ) == BST_CHECKED ) {
        ...
      }

      break;
    }
    default:
      return false;
    }
    break;
  }
  default:
    return false;
}

return true;

这是一个如何设置 DialogProc 的示例。您可以打开 lParam 或LOWORD( wParam ) 来识别哪个按钮。

【讨论】:

  • 所以我必须针对每种类型的控件做一些特定的事情?知道如何检测文本框已更改吗?
  • 您可以检查 EN_CHANGE 以获取编辑控件。如果您不关心单击/编辑了哪个按钮或哪个文本框,只需摆脱 if() 部分。不同类型的控件往往有不同的更改通知代码,因此您需要做的就是等待 WndProc 中的任何一个
  • 我的小演示在其属性表中有两个选项卡。在处理 WM_COMMAND 通知时,我添加了以下内容 if (HIWORD(wParam) == EN_CHANGE) { SendMessage (GetParent(hDlg), PSM_CHANGED, 0, 0);返回错误;因此,如果我更改出现的第一个选项卡中的编辑框,则启用 APPLY 按钮,但如果我首先切换到第二个选项卡,然后返回到第一个选项卡 b4 我更改编辑框,则应用按钮不会启用。知道会发生什么吗?据我所知,在我切换选项卡 A->B->A 后,hDlg 是相同的。
  • 我将 SendMessage 修改为如下所示,一切正常。 SendMessage (GetParent(hDlg), PSM_CHANGED, (WPARAM) hDlg, 0);属性表的文档确实很糟糕!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多