我创建了一个带有树控件的Outlook栏,并希望自动调整大小以始终完全显示树控件的文本。理想情况下,图片中的边框会移动,以便“医疗保健商品推销”完全可见。
newDimbar是在CMainFrame中创建的CMFCOutlookBar对象。
我试过拉伸它:
void CTreeDrill::OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
RECT treeRect;
GetItemRect(GetChildItem(hItem), &treeRect, FALSE);
CMainFrame *pMain = (CMainFrame*)AfxGetMainWnd();
int iStretch = treeRect.right;
pMain->m_ctlNewDimBar.StretchPane(iStretch, FALSE);
EnsureVisible(GetChildItem(hItem));
}
并使用move:
void CTreeDrill::OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult)
{
RECT treeRect;
RECT newRect;
RECT dimRect;
GetItemRect(GetChildItem(hItem), &treeRect, FALSE);
CMainFrame *pMain = (CMainFrame*)AfxGetMainWnd();
pMain->m_ctlNewDimBar.GetWindowRect(&dimRect);
newRect = dimRect;
newRect.right = treeRect.right;
pMain->m_ctlNewDimBar.MoveWindow(newRect);
EnsureVisible(GetChildItem(hItem));
}
没有运气。我错过了什么?
答案 0 :(得分:1)
我很高兴我发现它因为这是我将来必须要做的事情,你需要使用CWnd::SetWindowPos来改变CMFCOutlookBar的大小,检查一下{{3更改tutorial that has more infos的大小后,您必须使用包含CMFCOutlookBar的框架的CFrameWndEx::RecalcLayout方法。
我不知道,这是唯一一个适合我的人
因为如果您只是重新计算CMFCOutlookBar的布局,只会更新CMFCOutlookBar,如果您有任何附加到CMFCOutlookBar的内容,它将无法接收更改,因此您可能以CMFCOutlookBar重叠其他控件或文档视图结束,调用CMFCOutlookBar将使整个框架重新计算,因此如果您有选项卡式文档视图,则会相应地更新/调整大小。
您必须计算树的整个宽度,而不仅仅是项目,然后使用CFrameWndEx::RecalcLayout上的CWnd::SetWindowPos更新值宽度值,但保持{{{ 3}}
newDimbar.GetWindowRect(pos);
ScreenToClient(&pos);
UINT flags = SWP_NOZORDER | SWP_NOMOVE;
newDimbar.SetWindowPos(NULL, 0, 0, iNewWidth, pos.Height(), flags);