非模态对话抗如何实现模态对话框的效果?
我创建了一个非模态对话框,先new,再Create,再ShowWindow,都好着。现在由于需要我想让它显示时候,跟模态对话框一样,再不关闭这个非模态对话框之前,不能点击...
我创建了一个非模态对话框,先new,再Create,再ShowWindow,都好着。现在由于需要我想让它显示时候,跟模态对话框一样,再不关闭这个非模态对话框之前,不能点击其他的按钮什么的。。。请教如何实现?不要问我为什么不用模态对话框,因为我只想要一个实例,那个模态对话框只能是局部变量,而无法多次DoModal(),必须定义为局部变量才能多次DoModal()。我这一个对话框对象里面有数据的,不能为局部的。
展开
2个回答
展开全部
你这就是用错误的方法解决问题,微软定义了模态和非模态那就应该按照他的思路来,如果你因要用非模态来实现模态这个从根本上是不行的,模拟或许可以但是肯定很不完整。
在MFC中,如果你需要保存模态对话框的数据和什么局部不局部的变量一点关系都没有,你这么做就可以了。先声明一个结构体,在你对话框类的头文件里写就行了,里面包括你所有要保存的数据:
typedef struct
{
int a;
double b;
CString c;
} Data;
然后你修改你的模态对话框的类,增加一个该结构体的指针,构造函数变成如下的样子
class CMyDialog:
{
public:
CMyDialog(Data* pData);
//...
protected:
Data* m_pData;
...
};
在CPP文件把构造函数实现的参数改成和声明一样,然后将指针m_pData初始化
m_pData = pData;
你可以在父窗口或者框架声明一个Data的结构体变量
Data m_data;
然后在要显示模态对话框的地方
CMyDialog dlg(&m_data);
你最后需要做的是在初始化对话框的虚函数OnInitDialog中将m_pData成员的值赋到对话框控件上,在虚函数OnOK,也就是点击确定之后对话框控件的值赋给m_pData的成员就可以了。
另外,如果你使用纯Windows API变成,则根本就没有你说的问题,反正一般调用DialogBox或者DialogBoxParam函数,基本上也是和上面的思路一样,搞一个全局变量储存数据然后通过DialogBoxParam将数据指针给他,模态对话框在收到WM_INITDIALOG的时候,就可以得到这个指针,然后可以调用SetWindowLongPtr将指针和对话框句柄关联起来,之后在处理其他消息的时候就可以直接调用GetWindowLongPtr重新获得指针。
在MFC中,如果你需要保存模态对话框的数据和什么局部不局部的变量一点关系都没有,你这么做就可以了。先声明一个结构体,在你对话框类的头文件里写就行了,里面包括你所有要保存的数据:
typedef struct
{
int a;
double b;
CString c;
} Data;
然后你修改你的模态对话框的类,增加一个该结构体的指针,构造函数变成如下的样子
class CMyDialog:
{
public:
CMyDialog(Data* pData);
//...
protected:
Data* m_pData;
...
};
在CPP文件把构造函数实现的参数改成和声明一样,然后将指针m_pData初始化
m_pData = pData;
你可以在父窗口或者框架声明一个Data的结构体变量
Data m_data;
然后在要显示模态对话框的地方
CMyDialog dlg(&m_data);
你最后需要做的是在初始化对话框的虚函数OnInitDialog中将m_pData成员的值赋到对话框控件上,在虚函数OnOK,也就是点击确定之后对话框控件的值赋给m_pData的成员就可以了。
另外,如果你使用纯Windows API变成,则根本就没有你说的问题,反正一般调用DialogBox或者DialogBoxParam函数,基本上也是和上面的思路一样,搞一个全局变量储存数据然后通过DialogBoxParam将数据指针给他,模态对话框在收到WM_INITDIALOG的时候,就可以得到这个指针,然后可以调用SetWindowLongPtr将指针和对话框句柄关联起来,之后在处理其他消息的时候就可以直接调用GetWindowLongPtr重新获得指针。
展开全部
问题1:
都分配了,
第一个是栈内存,函数体执行完成,窗口自动被关闭,所以根本显示不出来窗口,只是闪一下就被关掉(除非CDlg dlg; 放在主对话框类定义里面);
第二个是堆内城,对话框可一直显示,需要使用 delete dlg;才能关闭对话框。
问题2: 同问题一,一个是在堆空间,一个是栈空间,你编码试试就知道了。new 分配的需要 delete dlg;
问题3:2种方法都可以传递变量,但必须保证此对话框实体没有被释放,栈分配的那个定义成类的成员变量就可以了,一样使用。
都分配了,
第一个是栈内存,函数体执行完成,窗口自动被关闭,所以根本显示不出来窗口,只是闪一下就被关掉(除非CDlg dlg; 放在主对话框类定义里面);
第二个是堆内城,对话框可一直显示,需要使用 delete dlg;才能关闭对话框。
问题2: 同问题一,一个是在堆空间,一个是栈空间,你编码试试就知道了。new 分配的需要 delete dlg;
问题3:2种方法都可以传递变量,但必须保证此对话框实体没有被释放,栈分配的那个定义成类的成员变量就可以了,一样使用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询