子窗口如何转发它的控件消息给父窗口?

a99899s1 2016-02-21 11:45:12
我创建了一个MyCDialog对话框,添加了一个列表资源,从CListCtrl派生了一个MyCListCtrlEx类.跟这个列表资源关联,
在MyCListCtrlEx这个类里创建了一个下拉列表框MyCComboBox ,以便鼠标点击列表某个项的时候,在那个项位置
以项的大小显示出来,
我想在MyCDialog类处理MyCComboBox下拉和关闭消息,问下大神们怎么才能像添加消息映射那样添加这个下拉列表的消息,
我试过了,MyCComboBox的消息只能传给父窗口MyCListCtrlEx类,MyCDialog跟本收不到这个控件消息,
我知道可以再发送消息给MyCDialog,或者传MyCDialog的指针..都可以做到,可这个列表类我要用在多个不同的对话框上,
并且下拉列表的内容会根据上一个选的内容改变,我知道的只能用发送消息给对话框了,但我想如果能在对话框里直接处理这
个列表上的下拉列表消息,那就更好了,请问下大神们有什么办法吗?
再说下它们的关系,(父)MyCDialog->MyCListCtrlEx->MyCComboBox(子),求在MyCDialog类里能直接处理MyCComboBox消息.
代码就不用贴了吧,好像没必要,也没什么可贴的,最后谢谢了.
...全文
347 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨笨仔 2016-02-23
  • 打赏
  • 举报
回复
引用 楼主 a99899s1 的回复:
我创建了一个MyCDialog对话框,添加了一个列表资源,从CListCtrl派生了一个MyCListCtrlEx类.跟这个列表资源关联, 再说下它们的关系,(父)MyCDialog->MyCListCtrlEx->MyCComboBox(子),求在MyCDialog类里能直接处理MyCComboBox消息. 代码就不用贴了吧,好像没必要,也没什么可贴的,最后谢谢了.
你可以在MyCListCtrlEx类中放一个Public函数,处理向其父窗口转发消息,需要时MyCComboBox通过GetParent()调用函数。或者直接使用内部消息控制,整个过程对外是透明的,你可以直接打包。
a99899s1 2016-02-23
  • 打赏
  • 举报
回复
谢谢大神们的解答,因为父窗口不确定,调用也不确定,内容也不确定,我倒是挺想就像通过向导添加消息响应那样添 加在对话框里列表类里的下拉列表消息,看来做到这样不是个容易事,哎,还是用发消息吧, ,感觉现在只有发消息适合了,无论重载消息处理还是在响应时都是发的消息,感觉1楼的比较简单合适了, 我也不知道这分干麻用的,分平均给1.2.8楼了. 谢谢了
redui 2016-02-23
  • 打赏
  • 举报
回复
通知消息前转必须通过中间的MyCListCtrlEx完成,可以在OnWndMsg虚函数里做这件事,针对下面的消息,原样发送给父窗口

BOOL MyCListCtrlEx::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    switch(message)
    {
	case WM_COMMAND:
	case WM_NOTIFY:
	case WM_PARENTNOTIFY:
	case WM_DRAWITEM:
	case WM_MEASUREITEM:
	case WM_COMPAREITEM:
	case WM_DELETEITEM:
	case WM_VKEYTOITEM:
	case WM_CHARTOITEM:
	case WM_HSCROLL:
	case WM_VSCROLL:
	case WM_CTLCOLORBTN:
	case WM_CTLCOLORDLG:
	case WM_CTLCOLOREDIT:
	case WM_CTLCOLORLISTBOX:
	case WM_CTLCOLORMSGBOX:
	case WM_CTLCOLORSCROLLBAR:
	case WM_CTLCOLORSTATIC:
            *pResult = dlgParent->SendMessage(message, wParam, lParam); // 注意:这里要处理一下,pResult可能传递NULL进来
            return TRUE;
    }
    return FALSE;
}
zgl7903 2016-02-22
  • 打赏
  • 举报
回复
CBN_DROPDOWN CBN_CLOSEUP CBN_SELCHANGE 等消息通过WM_COMMAND 传递 因此控件中可以重载WindowProc 处理 WM_COMMAND 或 重载 OnCommand 在句柄为ComboBox时 SendMessage 给父窗口
xie169268 2016-02-22
  • 打赏
  • 举报
回复
我用的比较笨的方法,自定义消息,下面是复制来的自定义消息的方法 第一步在stdafx.h声明消息: #define WM_MYMSG WM_USER+8 第二步在主窗口MyCDialog类声明中声明消息映射: DECLARE_MESSAGE_MAP() 第三步在类声明中定义消息处理函数: afx_msg LRESULT MyMsgHandler(WPARAM,LPARAM); 第四步实现消息映射: BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) ON_MESSAGE(WM_MYMSG,OnMyMsgHandler) END_MESSAGE_MAP() 第五步要实现消息处理函数(当然可以不实现): LRESULT CMainFrame::OnMyMsgHandler(WPARAM w,LPARAM l) { AfxMessageBox("Hello,World!"); return 0; } 在引发或发出消息的地方如MyCComboBox写上: ::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0); 因为我也是初学,目前能想到的就这么个方法,有没有大神有更好的办法,同求
sumos 2016-02-22
  • 打赏
  • 举报
回复
我觉得通过消息传递不方便,不如使用std::function typedef std::function<void(int)> OnDropItemSelect; 初始化,将MyCDialog的成员函数绑定为一个OnDropItemSelect,保存在MyCListCtrlEx。 当MyCListCtrlEx收到下拉框的选中消息后,直接触发callback。
RealPIRO 2016-02-22
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
CBN_DROPDOWN CBN_CLOSEUP CBN_SELCHANGE 等消息通过WM_COMMAND 传递 因此控件中可以重载WindowProc 处理 WM_COMMAND 或 重载 OnCommand 在句柄为ComboBox时 SendMessage 给父窗口
CComboBox在CListCtrl下创建
a99899s1 2016-02-22
  • 打赏
  • 举报
回复
1楼2楼的方法我都想过了,在MyCListCtrlEx类里响应MyCComboBox消息的时候发送个自定义消息给MyCDialog, 和重载OnCommand ..再发送没什么区别, 我是想将.MyCComboBox控件消息通过MyCListCtrlEx直接转给MyCDialog,比如在响应下拉消息的时候直接 由MyCDialog来处理,我试过在MyCDialog里创建.MyCComboBox,创建出来显示后发现这个下拉列表被 MyCListCtrlEx列表框盖住了.不太理想,所以想以MyCListCtrlEx做父窗口,这样下拉列表框就不会被盖住了, 这样一来又有问题了,下拉列表的控件消息主对话框收不到,消息只能传给它的父MyCListCtrlEx,所以来发贴问问 神们有什么更好的办法,相信很多人用过CListCtrl类,也在CListCtr列表里用过CComboBox, 3楼的方法不行,如果只有这一个列表,怎么着也好说,这个列表类要重用的,它的父窗口不一样,要显示的内容类型 也不一样,下拉列表要随着前一项的内容改变,或显示编辑框...不适合传主对话框指针,
Eleven 2016-02-22
  • 打赏
  • 举报
回复
创建的时候直接将对话框的HWND的窗口句柄传递给子控件不就行了, HWND-》CMyListCtrl->CMyComboBox,当然你需要修改CMyListCtrl类 和CMyComboBox类的构造函数,添加一个HWND用来接收对话框的HWND句柄。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧