FormView窗体和Dialog间通信的解决方案.

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
这是我前段时间碰到的一个问题,当时是一个FormView+分割窗体的单文档,在那个FormView里生成一个Dialog,然后要在Dialog里对FormView进行操作,我开始并没把这个当成一个问题,然后用传统的对话框的方式进行操作,即用GetParent()或者是构造函数的方法来获取那个view的窗体指针,然后进行操作,结果发现,指针可以取到,但无法进行里面的操作(现在想想应该是指针取错了),没办法,我到CSDN寻求帮助,不过好象得到的也都是对话框的解决方案,依然是不行.

后来,我想到了用消息来解决,先自定义一个消息WM_MYMSG,这个消息的响应里包含了你要进行的操作.
接下来就是发消息了.这里我依然犯了个错误,我还是没意识到我的view指针取的出了问题,我用GetParent()->SendMessage(....)来发消息,结果当然的又失败了.
再仔细想想,我觉得应该是view的指针取错了,怎么获得正确的view的指针??
我先是想到用FindWindow来获得HWND,再用::SendMessage(hwnd,....)来发消息,写着写着突然发现,那个view是个子view,没有title的,这样的话,不好取hwnd了(能取到吗?哪位能来指正一下)
这个方法又杜绝了之后,我只好再想其他的方法了,既然是文档视图的结构,是不是可以用GetActiveView()来取得?
CMainFrame * pWnd =(CMainFrame *) AfxGetMainWnd();
 HWND hWnd = pWnd->GetSafeHwnd();
 pWnd->GetActiveView()->SendMessage(WM_MYMSG,....);
感觉应该可以了,运行一下,发个消息,终于成功了!

这个问题的解决我始终觉得不是太完美,而且为什么GetParent()或GetOwner()不能取到正确的指针,我一直不明白CFormView就是继承至CDialog的,为什么CDialog能取,而CFormView 不行?也许是style的问题(因为是分割窗体+view,我的view的风格是Child),不过哪位朋友能给个确切的解释?
MFC SplitterCtrl 进阶篇(三)---分屏,分组功能 *背景:**需要在 Diag 架构 、SDI 或者MDI的 childFrameWnd的 更低一层的view中有支持类似分屏分组的需求,希望有VisualStudioDemo 的分组功能 效果, 下面是VisualStudioDemo的效果演示:**MDI的选项卡文档的Tab分组功能缺陷:**是MDI独有的,且只能在顶层的MainFrame适用,管理的是 childfram-doc-view 的分组功能。无法在更底的view内适用。 阅读详情

相关推荐

对话框中使用FormView

论坛上有很多人使用对话框的scrollBar控制对话框中一部分的卷动,实现过程复杂而且逻辑混乱。这个例子里,直接在对话框中创建一个CFormView子窗口,子窗口自己管理卷动,各负其责,条理清晰

对话框,FormviewDialogBarsPropertyPages的布局管理器

为对话框表单提供自动布局控制的框架

CSplitterControl_对话框分割拖拉窗口控件封装类及使用例子.7z

1、 分割控件类:CSplitterControl SplitterControl.h SplitterControl.cpp 2、创建对象、增加资源 class xx { ... private: CSplitterControl m_wndSplitter1; // 上下分割 IDC_SPLITTER_TOP 分割线资源更改资源可见属性为不可见,防止出现2条线 void DoResize1(int delta); CSplitterControl m_wndSplitter2; // 左右分割 IDC_SPLITTER_LEFT void DoResize2(int delta); } 3、初始化 BOOL CT1Dlg::OnInitDialog() { ... // TODO: Add extra initialization here {//m_wndSplitter1 CRect rc; CWnd* pWnd; pWnd = GetDlgItem(IDC_SPLITTER_TOP); pWnd->GetWindowRect(rc); ScreenToClient(rc); m_wndSplitter1.Create(WS_CHILD | WS_VISIBLE, rc, this, IDC_SPLITTER_TOP); CRect rc2; GetDlgItem(IDOK)->GetWindowRect(&rc2); ScreenToClient(&rc2); CRect rc3; GetDlgItem(IDCANCEL)->GetWindowRect(&rc3); ScreenToClient(&rc3); m_wndSplitter1.SetRange(rc2.bottom, rc3.top); } {// m_wndSplitter2 CRect rc; CWnd* pWnd; pWnd = GetDlgItem(IDC_SPLITTER_LEFT); pWnd->GetWindowRect(rc); ScreenToClient(rc); m_wndSplitter2.Create(WS_CHILD | WS_VISIBLE, rc, this, IDC_SPLITTER_LEFT); CRect rc2; GetDlgItem(IDC_BUTTON1)->GetWindowRect(&rc2); ScreenToClient(&rc2); CRect rc3; GetDlgItem(IDC_BUTTON2)->GetWindowRect(&rc3); ScreenToClient(&rc3); m_wndSplitter2.SetRange(rc2.right+1, rc3.left-1); } return TRUE; // return TRUE unless you set the focus to a control } LRESULT CT1Dlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class if (message == WM_NOTIFY) { if (wParam == IDC_SPLITTER_TOP) { SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam; DoResize1(pHdr->delta); } else if (wParam == IDC_SPLITTER_LEFT) { SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam; DoResize2(pHdr->delta); } } return CDialog::DefWindowProc(message, wParam, lParam); } void CT1Dlg::DoResize1(int delta) { CSplitterControl::ChangeHeight(GetDlgItem(IDC_BUTTON1),delta); CSplitterControl::ChangeHeight(GetDlgItem(IDC_BUTTON2), -delta, CW_BOTTOMALIGN); Invalidate();

窗口消息的传递

声明:本文非本人所写,本文已经写在本人CSDN博客里。本原来源于一篇英文文章的翻译。         消息(Message)是窗口间通信的最重要的方式之一。传统的程序从main()函数处开始一行一行的执行直到退出,但是窗口的概念则不同。窗口对事件(event)进行响应,这种事件称为消息。事件由程序本身、其他程序或系统程序产生,这些事件又产生消息。鼠标移动、按键等都会产生事件。消息分为两种即窗

wt8220321的专栏 1241

MFC中CSplitter的应用以及在View中添加按钮

一、CSplitterWnd用于将MFC视图分为多个窗口,使窗口包含多个窗格。 具体使用过程如下: 1、建立MFC程序,这里以单文档程序为例 2、建立两个基类是CView的类,CViewLeft,CViewRight用于左边显示右边显示(这里也可以不建立这两个类,而是改用原先有的XXXView类) 3、在CMainFram类中添加CSplitterWnd类型的成员变量

发展是曲折的但也是前进的 1587

Splitter2

<br />一、关于CSplitterWnd类<br /><br />  我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中<br />窗口被分割为若干的区域,真正做到了窗口的任意分割。 那么我们自己如何创建类似的界面,也实现<br />窗口的任意的分割呢 ?在VC6.0中这就需要使用到CSplitterWnd类。CSplitterWnd看上去像是一种<br />特殊的框架窗口,每个窗口都被相同的或者不同的视图所填充。当窗口被切分后用户可以使用鼠标移动<br /

uda1985的专栏 744

对话框

1.IDD_DIALOGBAR                           对话条          2.IDD_FORMVIEW                             视图对话框          3.IDD_OLE_PROPPAGE_LARGE         OLE属性页对话框(大)          4.IDD_OLE_PROPPAGE_SMALL

CZQing_ze的专栏 1425

在ActiveX中使用DialogFormView

最近做ActiveX插件,以网上一位牛人的《基于MFC的ActiveX控件开发》这一系列文章入门,不过,他的文章主要介绍在ActiveX本身提供的框架内进行开发,如果我希望我的ActiveX插件本身就以Dialog或者FormView窗体的形式呈现,那该如何处理呢?本文就总结一下这个,并且附带总结一下vs2008下以及网页下如何调试ActiveX,作为上述系列文章的补充。一、在ActiveX中使用...

weixin_33907511的博客 186

功能强大的CSplitterCtrl示例程序

功能强大的CSplitterCtrl示例程序,自己根据教程创作。集合了MFC SDI SplitterCtrl 分割窗体 多视图切换等多种功能。是SDI多视图切换及分割不错的首选示例程序

splitterwnd实现不同位置的分割窗口的隐藏

splitterwnd实现不同位置的分割窗口的隐藏,对于想实现窗口隐藏的朋友有很大的帮助,是对CSplitterWnd类的应用。

mfc文档应用程序实现了formview界面切换dialog布局

控制了窗口的大小当拖动窗口缩小的添加的空间大小时,窗口不会再缩小了,实现了formview dialog对话框的布局,还有就是点击菜单项切换界面,

打造完美的DialogBar

打造完美的DialogBarJohn.Y    DialogBar相比Dialog有很多优势。因CDialogBar继承于CControlBar,因此其可以Docking在窗口一边,而把CView挤压开,但是 CDialogBar 的使用并不是很容易,因为 MFC 里面并没有提供直接可以使用的CDialogBar,我们需要自己动手,打造自己的完美的 DialogBar。首先,你需要建立一个CDia

西子湖畔 6106

MFC控件篇之DialogBar

Dialog Bar Dialog Bar类似一个静态的附在框架窗口上的对话框,由于Dialog Bar可以使用资源编辑器进行编辑所以使用起来就很方便,在设计时就可以对Dialog Bar上的子窗口进行定位。用于显示一些提示字符。MFC中使用CDialogBar类来Dialog Bar控件的各种操作。通过调用BO

JamesXing的专栏 2747
上一篇: 今天开始用CSDN的blog了!
下一篇: 有关钩子的一些东西.
vampireal
博客等级 码龄23年 5粉丝 12原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值