我有一个给予SDI模式的界面程序,名为client, 现在在client.cpp的BOOL CclientApp::InitInstance()函数中弹出一个登录对话框:
DialogLogin login_in;
INT_PTR ret;
ret=login_in.DoModal();
现在我想做的是,只有登录成功后才取消login_in 这个对话框,所以我建立了一个登录线程,在点击原来的 OnOK函数相当于启动登录线程,并不执行真正的 OnOk操作。
void DialogLogin::OnBnClickedOk()
{
……
AfxBeginThread(LoginThread, NULL);
……
}
在登录线程成功登录后我想发送OnOK消息,但是出错, 屏蔽的语句都是出错的
UINT LoginThread(LPVOID lParam)
{
//g_hWndMain->SendMessage(WM_DESTROY,0,0);
//AfxGetMainWnd()->SendMessage(WM_DESTROY,0,0);
//GetForegroundWindow->SendMessage(WM_DESTROY,0,0);
//::SendMessage(theApp.) return 0;}
请问OnOK的消息机制到底怎么的?现在应该怎么做, 谢谢!
DialogLogin login_in;
INT_PTR ret;
ret=login_in.DoModal();
现在我想做的是,只有登录成功后才取消login_in 这个对话框,所以我建立了一个登录线程,在点击原来的 OnOK函数相当于启动登录线程,并不执行真正的 OnOk操作。
void DialogLogin::OnBnClickedOk()
{
……
AfxBeginThread(LoginThread, NULL);
……
}
在登录线程成功登录后我想发送OnOK消息,但是出错, 屏蔽的语句都是出错的
UINT LoginThread(LPVOID lParam)
{
//g_hWndMain->SendMessage(WM_DESTROY,0,0);
//AfxGetMainWnd()->SendMessage(WM_DESTROY,0,0);
//GetForegroundWindow->SendMessage(WM_DESTROY,0,0);
//::SendMessage(theApp.) return 0;}
请问OnOK的消息机制到底怎么的?现在应该怎么做, 谢谢!
再就是AfxGetMainWnd得到的是整个应用程序的主窗口,你给应用程序的主窗口发送销毁消息,
而你现在产生的又是模态对话框,此时只能处理你这个对话框线程的消息,其他的窗口的消息将无法处理,
这样也可能出错,建议使用GetParent()或者是CDialog::OnOk()
既然要登录后才能使用,则得等待登录的结果,因此在登录对话框里直接做登录的过程。在app里
if (dlg.DoModal() == IDOK)
{
//go on
}
不太清楚你的真实问题何在。如果是我我会这样:OnOK() //你的"登录"
{
if(登录成功)
CDialog::OnOK();
else
MessageBox(_T("登录失败!"));
//函数退出,对话框仍存在.
}OnCancel()
{
CDialog::OnCancel();
}外界只要判断 DoModal() 返回值就知道是不是登录成功了.建议把对话框的弹出放在 CApp 的初始化之中,而不是主窗口出现之后,这样你可以方便地不露痕迹地退出程序.