VC关于子窗口中的LIST控件在主窗口中调用问题!加分++

2025-06-21 02:43:09
推荐回答(6个)
回答1:

1.假设你的窗口是模态窗口

你的方法有很大问题

按下KEY,显示对话框

那么主线程就执行到子对话框中的代码

你的所谓"KEY回调函数"被阻塞

等子对话框终止后

"KEY回调函数"才恢复执行

那个时候对话框都没有了

做什么也没有效果了

在"KEY回调函数"内子对话框窗口类中的个变量还是有效的

但是子对话框中的子控件"List"已经销毁了

解决办法:

在子对话框的OnInitDialog函数中初始化你的List

而非在"KEY回调函数"中

2.如果是非模态对话框

那么"KEY回调函数"不会阻塞

你可以设置List内容

但是必须经过动态创建对话框类的实例并且调用Create创建对话框

如果这些没有做

那么仍旧是访问异常

3.DoDataExchange用于控件和某数据成员间建立一种隐射关系

不应该将它作为初始化函数使用

初始化一般数据可以使用构造函数

初始化子窗口可以使用OnInitDialog

4.关于ListCtrl

Dlg1.m_List.InsertItem(0,"行");//插入行

Dlg1.m_List.SetItemText(0,1,"列");//插入列

在SetItemText之前

请务必使用InsertColumn函数插入一列

不然你想插入的那一列根本不存在

或许也是一个访问异常的原因(我不确定会否异常,但这样做是不对的)

回答2:

啊哈,有想法,这样子对话框窗口这样创建
if(blCreateDlg) //表示事先没有创建过这样的对话框
{CXXXDialog dlg(CWnd::GetDesktopWindow());
blCreateDlg=FALSE; //只能创建一个
Dlg.hwnd=m_hWnd; //把主对话框的句柄给CXXXDIALOG类的工有变量
Dlg.DoModal();//显示对话框
}

在CXXXDIALOG类的INITDIALOG中将子对话框句柄送给主对话框
::SendMessage(hwnd,WM_MYSELF,0,(LPARAM)m_hWnd);
一定要有::hwnd是主对话框柄柄,WM_MYSELF是自己的消息然后在主对话框类中
ON_MESSAGE(WM_MYSELF,XXXX) xxx是回调的函数
声明如下
afx_msg LRESULT xxxx(WPARAM ,LPARAM);
嗯明白了么,现在两边的对话框都有对方的柄柄hwnd了
用GetDlgItem...是API的要加::就能得到列表句柄了,用CWnd::FromHandle...就能得到CWnd指针转换成CListCtrl 就能用了,

回答3:

我觉得你程序的架构存在问题。
你不比在KEY下面使用回调函数,而应该在按下KEY之后,向对话框DLG1发送一个消息(SendMessage),其中的窗口句柄,你可以从DLG1类的对象中获得,也就是m_hWnd。如此一来,你的程序将会大大的降低耦合度,这也是MFC所倡导的。
至于回调函数的使用问题,如果你准确的将函数指针传递至DLG1中,这种调用应该不会存在问题。

补充:既然你一定要这样用,那么我再给你提供一个简单易行的方法:
1. 首先,你必须承认,你有能力在住主窗口中获得DLG1的指针。
2. 既然有了指针,那么什么事情都变的简单了,你可以利用这个指针去调用DLG1中的函数,也可以利用这个指针,向DLG1传递参数。

回答4:

list 的初始化有问题的,

你在dlg1中做个公共接口,

int Initlist(param1,param2);

你在key中调用Dlg1.Initlist()进行初始化,再显示对话框,这个方案不是很简单。。

看来你经验不够呀

回答5:

1.我敢肯定你的DoDataExchange里肯定没有ListCtrl数据交换.
也就是说你的ListCtrl 窗口根本就没有出来.
2.你只要把ListCtrl删除,重新添加上去试试看

回答6:

1.假设你的窗口是模态窗口

你的方法有很大问题

按下KEY,显示对话框

那么主线程就执行到子对话框中的代码

你的所谓"KEY回调函数"被阻塞

对话框终止后

"KEY回调函数"才恢复执行

那个时候对话框都没有了

做什么也没效果了

在"KEY回调函数"内子对话框窗口类中的个变量还是有效的

但是子对话框中的子控件"List"已经销毁了

解决办法:

在子对话框的OnInitDialog函数中初始化你的List

而非在"KEY回调函数"中

2.如果是非模态对话框

那么"KEY回调函数"不会阻塞

你可以设置List内容

但是必须经过动态创建对话框类的实例并且调用Create创建对话框

如果这些没有做

那么仍旧是访问异常

3.DoDataExchange用于控件和某数据成员间建立一种隐射关系

不应该将它作为初始化函数使用

初始化一般数据可以使用构造函数

初始化子窗口可以使用OnInitDialog

4.关于ListCtrl

Dlg1.m_List.InsertItem(0,"行");//插入行

Dlg1.m_List.SetItemText(0,1,"列");//插入列

在SetItemText之前

请使用InsertColumn函数插入一列

不然你想插入的那一列根本不存在

或许也是一个访问异常的原因