CTreeView和CFromView问题

yaly 2000-07-23 06:39:00
小弟编了一个程序:把窗口分成两部分,左边TreeView,右边FromView,通过选择TreeView的项目,来更新右边的视(假定View1,View2),当选择TreeView的项目后,Tree控件发TVN_SELCHANGED,这时我可以得到所选项目,但如何更新视呢?这个问题已困扰小弟多日,特此求教,请各位大虾指点.分数100,先到先得,决不食言.
...全文
287 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzl 2000-07-25
  • 打赏
  • 举报
回复

应该放在CMainFrame类中,在Tree响应TVN_SELCHANGED时,可利用AfxGetMainWnd()
函数获得CMainFrame指针,向CMainFrame发个消息,或直接调用就行了。
dzl 2000-07-25
  • 打赏
  • 举报
回复

if (!m_wndSplitter.CreateView(0, 1,RUNTIME_CLASS(CSwitchView1), CSize
~
(100,100), NULL))
m_wndSplitter.RecalcLayout( );

1.为什么要"!"? 有"!"的话则成功创建分隔视时不会执行下面的m_wndSplitter.RecalcLayout( );语句,

2.检查需要更新的视类(右面)是否为CSwitchView1

我试过一下你的代码,把!删除后结果就正常了,
应该没问题了,如果还不行,把CSize(100,100)改成CSize(0,0)试试。

另:我觉得独揽分数有点过意不去,longx也应该得分。
yaly 2000-07-25
  • 打赏
  • 举报
回复
dzl:
为什莫还未能如愿呢?听起来有些伤感.
小弟用过代码了,只不过更新视图是左上角,把原来的Tree环城了CMyView1,不过变动窗口又恢复到原来的正确情况,而我想要更新的视图并未更新.以下是我编的TurnView():
void CMainFrame::TurnView()
{
m_wndSplitter.DeleteView(0, 1);
if (!m_wndSplitter.CreateView(0, 1,RUNTIME_CLASS(CSwitchView1), CSize(100,100), NULL))

m_wndSplitter.RecalcLayout( );
m_wndSplitter.UpdateWindow( );}
能帮我再看看吗?我这人有些后脸皮,不过分数一奉上.
dzl:100分.
多谢了,朋友!!!!
dzl 2000-07-25
  • 打赏
  • 举报
回复

yaly过奖了,dzl渴望当回真正的程序员,可惜至今仍未如愿。

1.可以发个自定义消息,在CMainFrame中响应这条消息,把代码放进该函数即可,
具体看看有关自定义消息的资料。

2.直接在CMainFrame中加一成员函数(声明为public),如:
public:
void Refresh();
并把代码放进去:
void CMainFrame::Refresh()
{
......
}

在Tree响应TVN_SELCHANGED时:
((CMainFrame *)AfxGetMainWnd())->Refresh();

yaly 2000-07-25
  • 打赏
  • 举报
回复
小弟还想问:
1:如何向CMainFrame发个消息.发哪个消息,是ON_PAINT吗?
2:AfxGetMainWnd()如何用.
多谢了!!!
yaly 2000-07-25
  • 打赏
  • 举报
回复
dzl:
高手!
问一个个人问题,是程序员吗?
longx 2000-07-24
  • 打赏
  • 举报
回复
用了CSplitterWnd类分割视没有?如果用的话参考下面的代码即可
wndSplitter.DeleteView(0,1);
wndSplitter.CreateView(0, 1, RUNTIME_CLASS(视类), CSize(100, 100), NULL);
wndSplitter.RecalcLayout();
mhd 2000-07-24
  • 打赏
  • 举报
回复
若使用文档/视图模式,可以通过GetDocument()得到当前的文档类,然后通过GetViewPosition()和GetNextView()获得对应的视图类,详见MSDN.
yaly 2000-07-24
  • 打赏
  • 举报
回复
dzl:
多多感谢!!!但小弟的问题说的有些模糊.
问题是:通过选择Tree的项目显示图形View1,View2,第一次显示图形View1,这时选择Tree的项目2,显示图形View2.
longx:
朋友,能不能说清楚一些,小弟不知把这些函数放在何处,如何响应.
dzl 2000-07-24
  • 打赏
  • 举报
回复

利用单文档/多视的机制。

1.对应所有视类的成员变量,在文档类中加入成员变量,
如View1中有m_sStr1对应IDC_EDIT1,View2中有m_sStr2对应IDC_EDIT2,
则在文档类中加入
CString m_sStr1,m_sStr2;

2.为了在Tree控件发TVN_SELCHANGED时,得到所选项的数据来更新View1、View2,
但不可能把数据加在Tree的Item中,可以这样:
把数据封装成一个类(如CItemData),加入成员
Public:
CString m_sStr1,m_sStr2;
这样在向Tree加入新项时先创建项目的对应数据:
CItemData* m_pItemData=new CItemDate;
m_pItemData->m_sStr1="IDC_EDIT1内容";
m_pItemData->m_sStr2="IDC_EDIT2内容";
把指针加入到该项:
TV_INSERTSTRUCT tvinsert;
......
tvinsert.item.lParam = (UINT)m_pItemData;
......

3.响应TVN_SELCHANGED
HTREEITEM m_hItem;
CItemData* m_pItemData;
CYourDoc* pDoc = (CYourDoc *)GetDocument();
if ((m_hItem=m_pViewTree->GetSelectedItem())!=NULL){
m_pItemData=(CItemData *)m_pViewTree->GetItemData(m_hItem);
//得到指向数据的指针
pDoc->m_sStr1=m_pItemData->m_sStr1;
pDoc->m_sStr2=m_pItemData->m_sStr2; //更新文档数据
pDoc->UpdateAllViews(this); //通知更新View1、View2
}

4.更新View1、View2

void CxxxxView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
CYourDoc* pDoc=(CYourDoc*)GetDocument();
m_sStr1=pDoc->m_sStr1;
UpdateData(FALSE); //因为此View由FormView派生
}
View2的也一样,只是把m_sStr1=pDoc->m_sStr1;改成m_sStr2=pDoc->m_sStr2;

OK?
WHQ 2000-07-23
  • 打赏
  • 举报
回复
右边FORMVIEW中的各控件的内容总应该是由左边的TREEVIEW决定的吧,你根据左边的选择重设右边各控件的内容不就成了,有必要的话可再刷新一下右边的显示。

16,471

社区成员

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

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

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