关于父子窗口传递消息的问题


背景:我创建了一个SDI文档,CSplitter分割为左右两个部分。窗体使用TabView分两个页面(CFormView),左右窗体共用这两个页面。
目的:CFromView上有CButton控件和CStatic控件,我希望在触发CBN后能由主窗体响应该事件并且把文本传到Cedit。
问题:1. 实现CButton传递消息到主窗体上
               是否是在CFormView,OnBnClickedButton1()里写SendMessage;然后在MainFrm的BEGIN_MESSAGE_MAP里添加个自定义消息?我以前没用过父子窗口传递消息SendMessage,GetMessage。
            2. 主窗口把文本传回子窗体的Cedit
                因为我在实现TabView的时候,使用AddView添加CFormView页面。

15 个解决方案

#1


可以通过自定义消息实现
你的问题是什么

#2


你说的方式是可以的,不过不需要GetMessage,用消息响应函数

#3


我的问题就是,怎么写
1.能不能给我个实例看看?
2.用AddView后,如何获取该CFormView?


//Formview.cpp

BEGIN_MESSAGE_MAP(Formview, CFormView)
ON_BN_CLICKED(IDC_BUTTON_TEST, &Formview::OnBnClickedButtonTest)
END_MESSAGE_MAP()

void Formview::OnBnClickedButtonTest()
{
// TODO: 在此添加控件通知处理程序代码
SendMessage(ON_COMMAND_TEST, 0, 0);
}



//CMainFrame.cpp
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_COMMAND_TEST(WM_COMMAND_TEST, &CMainFrame::OnCommandTest)
END_MESSAGE_MAP()

void CMainFrame::OnCommandTest(WPARAM wParam, LPARAM lParam)
{
// TODO: 在此处添加消息处理程序代码
}

#4


GetParent()->SendMessage(ON_COMMAND_TEST, 0, 0);

#5


1>.\MainFrm.cpp(38) : error C2440: “static_cast”: 无法从“void (__thiscall CMainFrame::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
这个是添加了自定义消息出现的编译问题

#6


哦,上面的问题是返回类型。我用了ON_MESSAGE

#7


第二个问题没有人看到吗?
第一个问题是子窗体给父窗体传消息,第二个问题是想问父窗口如何给子窗体传消息。

#8


void Formview::OnBnClickedButtonTest()
{
    // TODO: 在此添加控件通知处理程序代码
    SendMessage(ON_COMMAND_TEST, 0, 0);//  消息发给谁 ?你这是 发给 Formview
// 你想 发给 CMainFrame 对吧 , 那就要 得到 CMainFrame (AfxGetMainWnd()) 才行
}
 
 
 
//CMainFrame.cpp
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_COMMAND_TEST(WM_COMMAND_TEST, &CMainFrame::OnCommandTest)
END_MESSAGE_MAP()

#9


是的,我最开始少了个hWnd参数。后来这个问题解决了。
可否教我如何在SDI分个页上获取指针以便我对其中一个页面进行操作?谢谢!

引用 8 楼 schlafenhamster 的回复:
void Formview::OnBnClickedButtonTest()
{
    // TODO: 在此添加控件通知处理程序代码
    SendMessage(ON_COMMAND_TEST, 0, 0);//  消息发给谁 ?你这是 发给 Formview
// 你想 发给 CMainFrame 对吧 , 那就要 得到 CMainFrame (AfxGetMainWnd()) 才行
}
 
 
 
//CMainFrame.cpp
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_COMMAND_TEST(WM_COMMAND_TEST, &CMainFrame::OnCommandTest)
END_MESSAGE_MAP()

#10


在 MainFrame 做 2个 函数 :
GetLeftPane()
GetRightPane()
GetMiddlePane()


就是 分割窗口的 GetPane(x,y) 函数。

#11


引用 7 楼 theme2002 的回复:
第二个问题没有人看到吗?
第一个问题是子窗体给父窗体传消息,第二个问题是想问父窗口如何给子窗体传消息。

创建子窗口时保存一下子窗口指针,通过发消息完成与子窗口的通信。

#12


我在创建项目的时候,默认分割了两个窗体。
而我现在把SDI分割成了8份
关键还有个问题,我也用了GetPane(x,y)函数,但我获取到的应该是CTabView的指针,而不是CFormView的吧?
我尝试过给获取到的指针画图,但没效果。所以我怀疑我用GetPane(x,y)应该没有获取到CFormView的指针。

CTabshadow* CMainFrame::GetRightPane()
{
CWnd* pWnd = m_Splitter->GetPane(0, 1);
CTabshadow* pView = DYNAMIC_DOWNCAST(CTabshadow, pWnd);
CPicture *m_page = (CPicture*)pView->GetTabControl().GetTabWndNoWrapper(1);
CClientDC dc(m_page);
CPen f_pen;

f_pen.CreatePen(PS_SOLID, 5, RGB( 255, 0, 255));
dc.SelectObject(f_pen);

dc.MoveTo(0, -255);
dc.LineTo(255, 0);

return pView;
}


引用 10 楼 schlafenhamster 的回复:
在 MainFrame 做 2个 函数 :
GetLeftPane()
GetRightPane()
GetMiddlePane()


就是 分割窗口的 GetPane(x,y) 函数。

#13


我的CTabView类中是这么写的,如何保留子窗口指针?
AddView(RUNTIME_CLASS(CFormView),"Display",101,&context);



引用 11 楼 wxhxj0268 的回复:
Quote: 引用 7 楼 theme2002 的回复:

第二个问题没有人看到吗?
第一个问题是子窗体给父窗体传消息,第二个问题是想问父窗口如何给子窗体传消息。

创建子窗口时保存一下子窗口指针,通过发消息完成与子窗口的通信。

#14


p.s  为了方便大家理解我的问题,代码里CPictrue类是CFormView的子类。

#15


    CWnd* pWnd = m_Splitter->GetPane(0, 1);
    CTabshadow* pView = DYNAMIC_DOWNCAST(CTabshadow, pWnd);
    CPicture *m_page = (CPicture*)pView->GetTabControl().GetTabWndNoWrapper(1);
可以啊, 哪个 ==0 ?
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告