在OnInitDialog()中弹出模态对话框解决办法
在OnInitDialog()中弹出模态对话框
【问题描述】

我在主界面的OnInitDialog()函数中弹出模态对话框,就是登录界面,因为我是先做的主界面,然后才想添加一个登录界面,
如上图所示,点击登录按钮,我把帐号密码作为SendMessage()函数的参数lParam发送到主窗口,让主窗口去访问服务器 验证账号密码是否正确,然后返回信息给登录窗口,当然,登录界面是模态对话框,如果没有关闭,是不是OnInitDialog就无法执行下面的语句?如果验证成功,就自定义一个消息发送给登录界面,登陆界面接收这个消息,自己调用自己的CDialogEx::OnOK(),就关闭了登录界面。但是这样的话,编译运行几次,就会出现Debug Assert Faild!

有人说是因为SendMessage()函数是发送过去要等待处理结果的,改成PostMessage(),我改成了以后又跳出另一个Assert

登录界面登录按钮事件
//主窗口接收消息
------解决思路----------------------
1:用sendmessage,点重试看下调用堆栈
2:用postmessage,你要知道postmessage是异步的,参数buf依赖局部变量password,你postmessage后局部变量析构,消息接收的参数就是一个无效的指针。strcpy_s(Password,(char*)lParam);这里lparam已经无效了,调用后会一直找到\0,然后把数据填充到password里,但不幸的是找到\0的位置已经大于password的缓冲区大小,所以崩溃显示buffer small
------解决思路----------------------
判断密码正确与否肯定要在登陆对话框的OK按钮中做处理才行啊。
最简单的办法就是用全局指针了。无需传什么消息。
主对话框cpp中添加CMainDlg *g_pMainDlg;
构造函数中将this赋予该全局指针。
g_pMainDlg = this;
登陆对话框cpp中添加:
登陆按钮中:
【问题描述】
我在主界面的OnInitDialog()函数中弹出模态对话框,就是登录界面,因为我是先做的主界面,然后才想添加一个登录界面,
如上图所示,点击登录按钮,我把帐号密码作为SendMessage()函数的参数lParam发送到主窗口,让主窗口去访问服务器 验证账号密码是否正确,然后返回信息给登录窗口,当然,登录界面是模态对话框,如果没有关闭,是不是OnInitDialog就无法执行下面的语句?如果验证成功,就自定义一个消息发送给登录界面,登陆界面接收这个消息,自己调用自己的CDialogEx::OnOK(),就关闭了登录界面。但是这样的话,编译运行几次,就会出现Debug Assert Faild!
有人说是因为SendMessage()函数是发送过去要等待处理结果的,改成PostMessage(),我改成了以后又跳出另一个Assert
登录界面登录按钮事件
//登录界面提交按钮
void CUserLoginDlg::OnBnClickedBtnSubmit()
{
CString password;
GetDlgItem(IDC_EDIT_PASSWORD)->GetWindowTextA(password);
char *buf=NULL;
buf=password.GetBuffer(13);
//向主窗口发送登录消息
::PostMessage(this->hParent,WM_USERLOGIN,0,(LPARAM)buf);
}
//主窗口接收消息
LRESULT CtestAPIDlg::userLoginNotice(WPARAM wParam,LPARAM lParam)
{
strcpy_s(Password,(char*)lParam);
//获取帐号
GetTextFromLoginDlg();
return 0;
}
------解决思路----------------------
1:用sendmessage,点重试看下调用堆栈
2:用postmessage,你要知道postmessage是异步的,参数buf依赖局部变量password,你postmessage后局部变量析构,消息接收的参数就是一个无效的指针。strcpy_s(Password,(char*)lParam);这里lparam已经无效了,调用后会一直找到\0,然后把数据填充到password里,但不幸的是找到\0的位置已经大于password的缓冲区大小,所以崩溃显示buffer small
------解决思路----------------------
判断密码正确与否肯定要在登陆对话框的OK按钮中做处理才行啊。
最简单的办法就是用全局指针了。无需传什么消息。
主对话框cpp中添加CMainDlg *g_pMainDlg;
构造函数中将this赋予该全局指针。
g_pMainDlg = this;
登陆对话框cpp中添加:
#include "MainDlg.h"
extern CMainDlg *g_pMainDlg;
登陆按钮中:
void CLoginDlg::OnOK()
{
//获取密码...
BOOL bOk = g_pMainDlg->ThePasswordIsOk(密码);
if (!bOk)
{
MessageBox("密码已存在,请重新输入!");
return;
}
CDialog::OnOK();
}