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);属性表的文档确实很糟糕!