2

我创建了一个带有树控件的 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));
}

并使用移动:

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));
}

没有运气。我错过了什么?

4

1 回答 1

1

解决方案

我很高兴我找到了它,因为这也是我将来必须做的事情,您需要使用CWnd::SetWindowPos来更改CMFCOutlookBar的大小,在更改大小后查看包含更多信息的本教程CMFCOutlookBar您将不得不使用包含CMFCOutlookBar的框架的CFrameWndEx::RecalcLayout方法。

为什么使用CWnd::SetWindowPos

我不知道,这是唯一对我有用的

为什么使用CFrameWndEx::RecalcLayout而不仅仅是调用CMFCOutlookBar的 RecalcLayout() ?

因为如果您只是重新计算 CMFCOutlookBar 的布局,只有CMFCOutlookBar被更新,然后如果您有任何附加到CMFCOutlookBar它不会收到更改,因此您可能会以您的CMFCOutlookBar与其他一些控件或文档视图重叠结束,调用CFrameWndEx::RecalcLayout将使整个框架重新计算,因此如果您有选项卡式文档视图,它们将相应地更新/调整大小。

你的情况

您将不得不计算树的整个宽度,不仅是项目,然后使用CMFCOutlookBar上的CWnd::SetWindowPos更新值宽度值,但保持CMFCOutlookBar的高度。

newDimbar.GetWindowRect(pos);
ScreenToClient(&pos);
UINT flags = SWP_NOZORDER | SWP_NOMOVE;
newDimbar.SetWindowPos(NULL, 0, 0, iNewWidth, pos.Height(), flags);
于 2014-11-12T14:41:51.897 回答