2 y330197352 y330197352 于 2015.06.16 11:26 提问

MFC父窗口控制子窗口CListCtrl控件刷新的问题

目标:
父窗口单击按钮,向子窗口发送一个消息;子窗口的消息处理函数中,调用列表显示函数来刷新列表数据。

我的代码:

// 父窗口
void CDlg4::OnButtonClick()
{
CDlg43 *dlg = new CDlg43();
dlg->Create(IDD_DIALOG_43,this);
if (NULL == dlg)
{
AfxMessageBox("failed");
delete dlg;
return;
}

        dlg->SendMessage(WM_SHOWLIST);

        delete dlg;
}

// 消息响应函数
afx_msg LRESULT CDlg43::OnShowlist(WPARAM wParam, LPARAM lParam)
{
ListAll_arc();

return 0;

}

段点调试显示可以正常进入消息处理函数,也正常调用了列表刷新函数,但列表并没有被刷新。

猜测:是不是不能用create创建一个新对话框的指针?而是要获得已经创建的子窗口的指针?我是小白,虚心求大神指点!

我不知道怎么能够获取到已经创建的子窗口的指针,如果我的猜测正确的话,能不能告诉获取已经创建的子对话框的方法?

6个回答

y330197352
y330197352   2015.06.16 16:52
已采纳

感谢大家的帮助,我的问题自己解决了。
跟大家分享一下解决方法:

首先来说一下我之前的方法为什么不可行:
从代码来看,我先新建了一个子对话框指针,并用create创建了一个窗口,也就是说,即使正确调用了更新控件列表的函数,它也仅仅是更新了新创建的窗口中的列表控件,之后窗口删除。整个过程对先后的状态没有任何的改变。

修改方法:
既然要更改现有(在修改前已经被创建)的子窗口中的控件,就需要的到现有子窗口的对象指针。于是我想到,创建一个全局的窗口对象的指针m_pWnd, 在子窗口初始化时,把this指针赋值给m_pWnd。
当按钮按下时,创建子窗口指针CDlgSun* pDlg = ( CdlgSun*)m_pWnd; 此时即可用pDlg调用子窗口中的更新列表函数了。

当然这也不是最优的办法,如果有更好的办法请不吝赐教,谢谢大家!

ycg514230
ycg514230   Rxr 2015.06.16 11:31

你的猜测是对的。你新创建的这个对话框刚刚创建就被删除了,而最开始创建的根本没有收到消息。
至于获取已经创建的对话框,你在创建的时候应该会保存这个对象的指针或者成员。直接用就可以了。

希望能帮到你。

y330197352
y330197352 父窗口中有个TAB控件,这个子窗口是在TAB页面上(我不知道叫子窗口是不是合适=。=)。在整个应用程序初始化的时候,所有的界面就已经被创建了。
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.06.16 12:01

ListCtrl的刷新你是否把数据更新了。正确触发ListCtrl控件去更新数据

u013147600
u013147600   2015.06.16 13:46

你可以通过classWizard 类向导 给你的子窗口添加一个类呀。然后通过父窗口去调用子窗口类的对象

和我下面的有点类似。我是实现在服务标签页 跳转到 进程标签页,并且把进程ID传过去。

//跳转到进程页面
CPropSheet pParent=(CPropSheet)GetParent();
pParent->SetActivePage(&pParent->Prop_process); //激活进程标签页

//发送设置控件选中行的消息
pParent->Prop_process.SendMessage(WM_CTRLFOCES,procID,0);

Prop_process是进程标签页,他是标签表单类的成员变量。

y330197352
y330197352   2015.06.16 15:18

我直接上图吧,图片说明

目标:单击左侧按钮3,实现右侧的列表2数据更新。本质就是父窗口与tab标签页的通讯。

y330197352
y330197352   2015.06.16 16:54

我发现我的方法跟帘卷西风讲的一样O_O,非常感谢他!

Csdn user default icon
上传中...
上传图片
插入图片