Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对话框控件-检测更改_C++_Winapi_Modal Dialog - Fatal编程技术网

C++ 对话框控件-检测更改

C++ 对话框控件-检测更改,c++,winapi,modal-dialog,C++,Winapi,Modal Dialog,我想检测对话框上的任何控件何时被用户操作更改。例如,在文本框中输入数据时,在日期时间选择器中输入日期,选中或取消选中复选框等。到目前为止,我忽略了此类通知,只是在用户按下某个按钮时检索控件的状态,但现在我想知道发生了更改(我想启用属性表上的应用按钮)。我并不关心发生了什么变化,我只想知道发生了什么变化。所谓变化,我不是指焦点的变化,而是指用户改变控件的实际操作 我使用普通的旧C++,没有MFC或任何幻想。 如何执行此操作?您可以测试复选框是否已通过WM_命令获得的通知代码进行了检查 switch

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

我使用普通的旧C++,没有MFC或任何幻想。


如何执行此操作?

您可以测试复选框是否已通过WM_命令获得的通知代码进行了检查

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的一个示例。您可以打开LPRAM或
LOWORD(wParam)
来确定哪个按钮。

您可以测试复选框是否已使用通过WM_命令获得的通知代码选中

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的一个示例。您可以打开LPRAM或
LOWORD(wParam)
确定哪个按钮。

如果不是MFC,您是否在GUI中使用Win32 API?@jaywalker:是的,一个Win32 API。如果不是MFC,您是否在GUI中使用Win32 API?@jaywalker:是的,一个Win32 API。因此,我必须针对每种类型的控件执行特定操作?知道如何检测文本框已更改吗?您可以检查EN_更改以进行编辑继续如果你不在乎哪个按钮或哪个文本框被点击/编辑,只需要去掉If()不同类型的控件往往具有不同的更改通知代码,因此您只需等待WndProcMy小演示中的任何更改。在其属性页中有两个选项卡。在处理WM_命令通知时,我添加了以下if(HIWORD(wParam)==EN_CHANGE){SendMessage(GetParent(hDlg),PSM_CHANGED,0,0);返回FALSE;}因此,如果我更改出现的第一个选项卡中的编辑框,应用按钮将被启用,但是如果我首先切换到第二个选项卡,然后返回到第一个选项卡b4,我更改编辑框,应用按钮将不会被启用。知道会发生什么吗?据我所知,在切换选项卡A->B->A之后,hDlg是相同的。我修改了SendM要阅读的消息如下,一切正常。SendMessage(GetParent(hDlg),PSM_已更改,(WPARAM)hDlg,0);属性表的文档确实很糟糕!所以我必须针对每种类型的控件做一些特定的操作?知道如何检测文本框已更改吗?您可以检查编辑控件的EN_更改。如果您不关心单击/编辑了哪个按钮或文本框,请去掉If()不同类型的控件往往具有不同的更改通知代码,因此您只需等待WndProcMy小演示中的任何更改。在其属性页中有两个选项卡。在处理WM_命令通知时,我添加了以下if(HIWORD(wParam)==EN_CHANGE){SendMessage(GetParent(hDlg),PSM_CHANGED,0,0);返回FALSE;}因此,如果我更改出现的第一个选项卡中的编辑框,应用按钮将被启用,但是如果我首先切换到第二个选项卡,然后返回到第一个选项卡b4,我更改编辑框,应用按钮将不会被启用。知道会发生什么吗?据我所知,在切换选项卡A->B->A之后,hDlg是相同的。我修改了SendM要阅读的消息如下,一切都很好。SendMessage(GetParent(hDlg),PSM_CHANGED,(WPARAM)hDlg,0);属性表的文档确实很糟糕!