首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于左侧是树视图,点击树视图条目,右边动态生成一个列表视图,对右边视图切换之后视图内容不见了

2012-09-07 
关于左边是树视图,点击树视图条目,右边动态生成一个列表视图,对右边视图切换之后视图内容不见了做了个项目

关于左边是树视图,点击树视图条目,右边动态生成一个列表视图,对右边视图切换之后视图内容不见了
做了个项目,左边是动态的树形视图,点击一个条目,右边就调用OpenDocumentFile自动生成一个列表视图(在里面有内容),我前面对树形视图和文档进行了绑定,现在的问题是点击左边的条目,右边可以生成动态生成列表视图,但是当我切换右边的视图的时候,右边视图内容消失了,但是移动分割条的时候,视图里面的内容又能看到,并且视图并没有随着分割条的移动而移动 现在列出部分代码,求高人指教啊
我再左边的树形视图响应双击事件void CLeftView::OnDblclkTree(NMHDR* pNMHDR, LRESULT* pResult)
{
HTREEITEM m_hTreeItem = m_treeEx.GetSelectedItem();  
CString S1 = m_treeEx.GetItemText(m_hTreeItem);  
AfxGetMainWnd()-> SendMessage(WM_USER_VIEW);
}
 然后再CMainFrame响应这个消息
void CMainFrame::ShowDockingPanePopupMenu(CXTPDockingPane* pPopupPane, CPoint pt, LPRECT lprcExclude)
{
CMenu menu;
VERIFY(menu.LoadMenu(IDR_POPUP_PANES));
CMenu* pPopup = menu.GetSubMenu(0);


if (pPopupPane->IsHidden())
{
pPopup->CheckMenuItem(ID_POPUP_AUTOHIDE, MF_BYCOMMAND|MF_CHECKED);
pPopup->EnableMenuItem(ID_POPUP_FLOATING, MF_BYCOMMAND|MF_DISABLED);
pPopup->EnableMenuItem(ID_POPUP_DOCKABLE, MF_BYCOMMAND|MF_DISABLED);
}
else if (pPopupPane->GetOptions() & xtpPaneNoDockable)
{
pPopup->CheckMenuItem(ID_POPUP_FLOATING, MF_BYCOMMAND|MF_CHECKED);
}
else
{
pPopup->CheckMenuItem(ID_POPUP_DOCKABLE, MF_BYCOMMAND|MF_CHECKED);
}

TPMPARAMS tpm;
tpm.cbSize = sizeof(TPMPARAMS);
tpm.rcExclude = lprcExclude ? *lprcExclude : CRect(0, 0, 0, 0);

int nCommand = GetCommandBars()->TrackPopupMenuEx(pPopup, TPM_RIGHTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD, pt.x, pt.y, NULL, &tpm);

switch (nCommand)
{
case ID_POPUP_HIDE:
pPopupPane->Close();
break;

case ID_POPUP_AUTOHIDE:
m_paneManager.ToggleAutoHide(pPopupPane);
break;

case ID_POPUP_DOCKABLE:
if (pPopupPane->GetOptions() & xtpPaneNoDockable)
{
pPopupPane->SetOptions(pPopupPane->GetOptions() & ~xtpPaneNoDockable);
}
break;

case ID_POPUP_FLOATING:
if ((pPopupPane->GetOptions() & xtpPaneNoDockable) == 0)
{
if (!pPopupPane->IsFloating())
m_paneManager.ToggleDocking(pPopupPane);

pPopupPane->SetOptions(pPopupPane->GetOptions() | xtpPaneNoDockable);
}

break;
}
}
LRESULT CMainFrame::OnUpgradeView(WPARAM wparam, LPARAM lparam)
{

CMainApp *pApp = (CMainApp*)AfxGetApp();
m_pListDoc = (CMainDoc*)(pApp->pListDocTemplate->OpenDocumentFile(NULL));

CListCtrl*m_pListCtrl;
m_pListCtrl = new CListCtrl;
CRect rcChild;
//CFrameWnd* pFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
CWnd* pFrameWnd = GetWindow(GW_CHILD); //获取窗体子控件指针

pFrameWnd-> GetWindowRect(rcChild); 
ScreenToClient(rcChild);  
pFrameWnd-> MoveWindow(rcChild,FALSE);  


rcChild.left += 50;
rcChild.right +=100;
rcChild.bottom += 50;
rcChild.top += 100;
m_pListCtrl->CreateEx(WS_CHILD,
WS_VISIBLE |WS_BORDER |WS_CAPTION| LVS_REPORT|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_ONECLICKACTIVATE
,rcChild,this,0);
//m_pListCtrl.SubclassDlgItem(IDC_LIST_VIEW, AfxGetMainWnd());
//向列表视图中添加数据
m_pListCtrl->InsertColumn(0, _T("姓名"), LVCFMT_LEFT , 80);
m_pListCtrl->InsertColumn(1, _T("语文"), LVCFMT_LEFT, 60);
m_pListCtrl->InsertColumn(2, _T("数学"), LVCFMT_LEFT, 60);
m_pListCtrl->InsertColumn(3, _T("英语"), LVCFMT_LEFT, 60);
m_pListCtrl->InsertColumn(4, _T("政治"), LVCFMT_LEFT, 60);
m_pListCtrl->InsertColumn(5, _T("历史"), LVCFMT_LEFT, 60);

//向列表视图中添加数据
m_pListCtrl->InsertItem(0, _T("王男"));
m_pListCtrl->InsertItem(1, _T("王1"));
m_pListCtrl->InsertItem(2, _T("王2"));
m_pListCtrl->InsertItem(3, _T("王3"));


m_pListCtrl->InsertItem(4, _T("王4"));
 return TRUE;
}

[解决办法]
OpenDocumentFile如果函数调用成功,返回CDocument对象的指针这里是文档对象,不是窗口类,不是视图,不知道你是怎么理解的。

实现视图切换的方法:
1. 向父框架类发送切换视图消息(自定义消息);
2. 在父框架类中添加相应函数;响应函数的作用就是向主窗口(CMainFrame)发送WM_COMMAND 消息

在左侧树视图中添加发送消息
AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND, ID_FIRST_VIEW);

AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND, ID_SECOND_VIEW);

3. 在相应函数内使用DeleteView 删除原来的视,使用CreateView 关联新的
视,再调用RecalcLayout 重绘视图区。
消息响应函数:
void CMainFrame::OnSwitchToFirst()
{
m_SplitterWnd.DeleteView(0,1);
m_SplitterWnd.CreateView(0,1,RUNTIME_CLASS(CFirstView), CSize(0,0),NULL);
m_SplitterWnd.RecalcLayout();
}
void CMainFrame::OnSwitchToSecond()
{
m_SplitterWnd.DeleteView(0,1);
m_SplitterWnd.CreateView(0,1,RUNTIME_CLASS(CSecondView), CSize(0,0),NULL);
m_SplitterWnd.RecalcLayout();
}

热点排行