对与有些应用场景,用户希望Blcok UI自动关闭。比如,子窗口选择完对象后。网上有通过内部函数关闭窗口,如下所示:
JAM_lookup_tag
class UGS::UIFW * UIFW_ask_uifw(void)
int UGS::UIFW::end_dialog(class UGS::UICOMP *,int)
但关闭后,UI界面中的输入值,并未保存上一次操作的,类似点击了关闭或者取消按钮。与内部函数DLG_call_cancel_cb执行效果差不多,但不如DLG_call_cancel_cb简洁。
在执行这些函数前,执行PerformApply或者调用ok_cb\apply_cb均不能保存界面参数。
通过测试,发现模拟鼠标点击效果可以实现既关闭窗口,又保存界面参数。Blcok UI的确定、取消、应用按钮,与自己添加的按钮属性不同。因此采用,类名和名称来遍历确定按钮的窗口句柄:
CWnd * GetChild(CWnd * cWnd, int *indx)
{
CWnd * tWnd = cWnd->GetWindow(GW_CHILD);
while (tWnd)
{
char className[MAX_PATH];
::GetClassName(tWnd->GetSafeHwnd(), className, 256);
char captionName[MAX_PATH];
::GetWindowText(tWnd->GetSafeHwnd(), captionName, 256);
if (0 == strcmp(className, "Button") && (0 == strcmp(captionName, "确定") || 0 == strcmp(captionName, "OK")))
{
if (*indx == 0) return tWnd;
(*indx)--;
}
CWnd * nWnd = GetChild(tWnd, indx);
if (nWnd != NULL) return nWnd;
tWnd = tWnd->GetNextWindow();
}
return NULL;
}
获取确定按钮窗口句柄后,发送点击消息:
::SendMessage(OKWnd->GetSafeHwnd(), BM_CLICK, 0, 0);
注意事项:
如果是主窗口,则遍历到的第一个即为所求,如果是子窗口,会存在多个确定按钮,因此要根据实际应用情况,来确定第几个。