CTreeCtrl控件,单文档添加新的CFormView视图

qinjingluan 2008-11-20 06:08:26
情况详述如下:
1,我的程序本身是基于单文档的MFC应用程序,原始的VIEW是CVIEW类型,使用了背景图片,程序的整个框架都应用了皮肤文件!所以外观比较漂亮.程序有登录界面对话框(带Access),有MSComm通信控件通信功能.

2,现在我向该程序添加了一个新的视图VIEW,新添加的VIEW是CFormView类型的(基类是CFormView).现在已经实现了原视图与新视图之间的转换.

3,我在新视图中添加了一个树形控件TreeCtrl(因为该新的VIEW是继承CFormView,所以具有对话框的功能),并关联了一个控件变量m_mytree.

4,假设新VIEW对应的类名为CNewView那么重写该类中的OnInitialUpdate()成员函数.

void CNewView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
m_mytree.SetBkColor(RGB(0,0,255));

// TODO: 在此添加专用代码和/或调用基类
}


5,结果是树形控件TreeCtrl的背景色并没有变化.

请知道的高手帮帮忙!

我试过如果是在SDI中,原视图类直接从CFormView类继承的话(在生成向导时修改最后一步),在该视图中就能成功实现.
此问题困扰我太久了,请指点!
...全文
713 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinjingluan 2008-11-26
  • 打赏
  • 举报
回复
Tinary3v0

能不能再帮我想想办法!


谢谢了!

其它人呢?
yunjianfeilai 2008-11-25
  • 打赏
  • 举报
回复
学习
qinjingluan 2008-11-25
  • 打赏
  • 举报
回复
CMyFormView* pFmView=(CMyFormView*) GetActiveView();
qinjingluan 2008-11-25
  • 打赏
  • 举报
回复
主界面是程序一启动就显示的继承CView类的view视图,就是普通的视图,也是主界面.其它四个都是继承CFormView的视图,现在实现了从主界面向其它四个视图的切换,以及四个视图之间的相互切换,但是没有办法切换回主界面.

按你8楼的回复,我不知道中间的红色部分应该写成什么,因为我有四个其它的视图,我想让每一个都可以随时切回主界面.所以很郁闷.不好意思,本人比较菜,还请你再教教我!谢谢了!
void CMainFrame::OnRechangeview() 
{
CMyFormView* pFmView=(CMyFormView*) GetActiveView(); //此时AvtiveView已经编程FormView了。

SetActiveView(pVView);
pVView->ShowWindow(SW_SHOW); //变量是CVView窗口的指针,而且在程序当中没有被销毁重新生成过。 所以任何位置pVView都是那个Ciew类
//视图指针。
pFmView->ShowWindow(SW_HIDE);

RecalcLayout();
}
qinjingluan 2008-11-24
  • 打赏
  • 举报
回复


//响应这些命令,视图相互转化,
//一共有四个界面,连主界面是五个.现在由主界面转其它四个以及其它四个之间的相互转换都很顺利,但是没有办法转回主界面.
//第一个是BasicOp视图.
void CMainFrame::OnBasicOp()
{
// TODO: 在此添加命令处理程序代码
CView* pOldActiveView=(CView*) GetActiveView();
CBasicOpView* pNewActiveView=(CBasicOpView*) new CBasicOpView();
CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,IDD_BASIC_OP_VIEW,&context);
pNewActiveView->OnInitialUpdate(); /**/

SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
}
//这是第另一个ControlOp视图
void CMainFrame::OnControlOp()
{
CView* pOldActiveView=(CView*) GetActiveView();
CControlOpView* pNewActiveView=(CControlOpView*) new CControlOpView();
CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,IDD_CONTROL_OP_VIEW,&context);
pNewActiveView->OnInitialUpdate(); /**/

SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();

// TODO: 在此添加命令处理程序代码
}
//这是RealviewOp视图
void CMainFrame::OnRealviewOp()
{
CView* pOldActiveView=(CView*) GetActiveView();
CRealViewOpView* pNewActiveView=(CRealViewOpView*) new CRealViewOpView();
CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,IDD_REALVIEW_OP_VIEW,&context);
pNewActiveView->OnInitialUpdate(); /**/

SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
// TODO: 在此添加命令处理程序代码
}
//这是SetOp视图
void CMainFrame::OnSetOp()
{
CView* pOldActiveView=(CView*) GetActiveView();
CSetOpView* pNewActiveView=(CSetOpView*) new CSetOpView();
CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,IDD_SET_OP_VIEW,&context);
pNewActiveView->OnInitialUpdate(); /**/

SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
// TODO: 在此添加命令处理程序代码
}



用您上面的方法,我只能实现四个之一与主界面之间的转换,多个就不知道该怎么做!不好意思,还得你来帮帮我~谢谢!
qinjingluan 2008-11-24
  • 打赏
  • 举报
回复
TO:TINARY3V0
谢谢你!

非常感谢您!周末休息了没有回来看看.

您的解答我要慢慢地消化消化.谢谢~
Tinary3v0 2008-11-24
  • 打赏
  • 举报
回复
主界面是那个界面啊?
你上面的代码是四个界面吧? 主界面总不可能是MainFrame吧,也得有一个View或FormView的东西才叫主界面吧。
Tinary3v0 2008-11-21
  • 打赏
  • 举报
回复
另外我这个函数里面可是确切的调用了OnInitialUpdate,你的切换视图调用了么?
void CMainFrame::OnChangeview()
{
CVView* pOldActiveView=(CVView*) GetActiveView();
CMyFormView* pNewActiveView=(CMyFormView*) new CMyFormView();
CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,IDD_FORMVIEW,&context);
pNewActiveView->OnInitialUpdate();

SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
}
Tinary3v0 2008-11-21
  • 打赏
  • 举报
回复
看来问题没有我想的那么复杂

你把你切换视图的代码对好贴出来 我们看看。

我觉得你主要问题在切换视图的时候Formview本身并不需要执行OnInitialUpdate这个函数,说明你每次切换视图的时候 并不是将CNewView重新创建一次。
而可能只是简单的隐藏之类的。CNewView在切换视图代码执行之前已经有窗口在显示了。

你不妨把你的代码贴到别的消息处理函数里面去试试,比如WM_SIZE WM_PAINT 之类的消息处理里面; 找一个经常会出现的消息 OnInitialUpdate一般只执行一次啊!!
qinjingluan 2008-11-21
  • 打赏
  • 举报
回复
我试过了一楼的方法,但是还是不行,不过后来我在界面上添加了一个BUTTON
然后再响应按钮按下的命令中写

void CNewView::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_mytree.SetBkColor(RGB(0,0,255));
}

然后当切换好视图后要单击BUTTON后可以产生背景效果,这样看来应该是我的OnInitialUpdate()这个函数没有起到作用.而且我的这OnInitialUpdate()原来是没有的,是我手动添加的(也是向导完成的).啊,狂晕!请再帮我分析分析!

谢谢!
Tinary3v0 2008-11-21
  • 打赏
  • 举报
回复
class CMainFrame : public CFrameWnd
{
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;

CVView* pVView; //声明一个变量

void CMainFrame::OnChangeview()
{
CVView* pOldActiveView=(CVView*) GetActiveView();
pVView = pOldActiveView; //变量赋值

CMyFormView* pNewActiveView=(CMyFormView*) new CMyFormView();
CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,IDD_FORMVIEW,&context);
pNewActiveView->OnInitialUpdate();

SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);

RecalcLayout();
}

void CMainFrame::OnRechangeview()
{
CMyFormView* pFmView=(CMyFormView*) GetActiveView(); //此时AvtiveView已经编程FormView了。

SetActiveView(pVView);
pVView->ShowWindow(SW_SHOW); //变量是CVView窗口的指针,而且在程序当中没有被销毁重新生成过。 所以任何位置pVView都是那个Ciew类
//视图指针。
pFmView->ShowWindow(SW_HIDE);

RecalcLayout();
}


不是所有的类创建都需要ID的,而且要不是因为现在是在做试验给你看,我也不会把OnChangeview()中的CMyFormView* pNewActiveView=(CMyFormView*) new CMyFormView();声明成临时变量的。而且在这样的用户操作函数中调用Creat。
我会把创建放在CMainFrame类的OnCreat里面去做。 以后在用的时候都操作各自的指针就行了。

记住一点 既然是窗口 就不要临时创建 或创建很多此 到用指针的时候或者操作窗口上的其他自窗体的时候就麻烦了。 所以最好是一次性生成,给一个指针。
然后在整个程序运行期间就一直操作这些指针。
qinjingluan 2008-11-21
  • 打赏
  • 举报
回复
上面的问题是解决了,谢谢Tinary3v0.是您提到的问题.
我有另一个疑问,如果我要切换到原来的视图怎么办.原视图是CView的派生类!

我想用主界面上的主菜单"返回主界面"来实现应该怎么写!

因为切换到新视图中的代码用到
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,IDD_CARDFORMVIEW,&context);
那么切回主界面怎么办.主界面没有ID号!
请指教! 其它人知道的也可以发表一下意见!
Tinary3v0 2008-11-20
  • 打赏
  • 举报
回复
郁闷 里面带[color=#FF0000]标签的地方是我想加红色显示的地方
Tinary3v0 2008-11-20
  • 打赏
  • 举报
回复
1.我也建了一个你说的这个样子的程序,在添加FormView的时候 我不是选择的MFC Class 而是选择的Form Class 我这样建立了以后
只是一开始程序运行的时候会让我选择要使用那中类型的窗体来建立视图区域。 我选择FormView的时候没有发现你说的那种不能改变颜色的问题。

2.我后来又建立一个MFC的Class 继承自CFormView 由于没有窗体 所以ClassWizard给我添加了一个不存在的资源ID。于是我就在资源中添加了一个
IDD_FORMVIEW[English(U.S.)]的FormView窗体。并将这个窗体的ID考到了新建类的相应位置:
class CMyFormView : public CFormView
{
protected:
DECLARE_DYNCREATE(CMyFormView)
// Form Data
public:
//{{AFX_DATA(CMyF)
enum { IDD = IDD_FORMVIEW };
CTreeCtrl m_My; //添加了控件
//}}AFX_DATA
// Attributes
public:
CMyFormView(); //改为公有函数

重载了Creat函数,防止出现私有成员无法调用。
BOOL CMyFormView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
// TODO: Add your specialized code here and/or call the base class
return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}


然后使用了下面的代码完成了视图切换:
void CMainFrame::OnChangeview() 
{
CVView* pOldActiveView=(CVView*) GetActiveView();
CMyFormView* pNewActiveView=(CMyFormView*) new CMyFormView();
CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,IDD_FORMVIEW,&context);
pNewActiveView->OnInitialUpdate();

SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
}


在你说的位置设置背景颜色:
void CMyFormView::OnInitialUpdate() 
{
CFormView::OnInitialUpdate();

m_My.SetBkColor(RGB(255,0,0));
}


按照我这样的步骤下来,控件背景颜色改变了 ,没有出现你说的问题。

我觉得你的主要问题可能出在视图切换的地方,一个是CCreateContext是否使用了? 另外一个就是父窗口指针是不是MainFrame。
如果出现父窗口不对的情况,那么很有肯能有些消息处理就出现问题。

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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