TreeCtrl 在展开某一项时,如何设置滚动条不移动

huanmeng2008 2010-05-15 05:42:43
当选中展开某个节点,而这个节点下有很多子项的时候,这个时候出现滚动条,并且会自动下移把选中项显示在窗口最上方。
我现在需要的是选中展开某个节点的时候, 选中节点的位置不移动,就在当前位置展开。 应该如何设置?
知道的帮帮忙,不知道的帮忙顶下,谢谢~~~!!!!!。
...全文
180 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
EYIIJIUIUI 2010-05-17
  • 打赏
  • 举报
回复
没分吗 我可是冲着100分来的
打个8折也行啊
huanmeng2008 2010-05-15
  • 打赏
  • 举报
回复
额。。。 搞定了, 上面不行应该是执行弹出右键菜单造成的,应该是弹出菜单的时候没选择菜单 程序不返回后面就没调用EnsureVisible(hItem);这个函数了。

我改成下面方法就可以了。

void
XXX::OnTvnItemexpanding(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
this->first_visible_item_ = GetFirstVisibleItem();
*pResult = 0;
}

void
XXX::OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
EnsureVisible(this->first_visible_item_);
*pResult = 0;

}

谢谢你们~~~~!!!!
不说害怕 2010-05-15
  • 打赏
  • 举报
回复
EnsureVisible(hItem);
CTreeCtrl::OnRButtonDown(nFlags, point);

这两句调换一下?


主要是你啥时候展开的? 必须的展开操作之后调用EnsureVisible
不说害怕 2010-05-15
  • 打赏
  • 举报
回复
HTREEITEM hItem = GetFirstVisibleItem();
// 处理。。。

EnsureVisible(hItem)

理论上应该可以.

就是找到当前第一个可见..然后在展开后..再使刚才第一个可见保持第一个可见.
huanmeng2008 2010-05-15
  • 打赏
  • 举报
回复
大哥。。。还是不行。

void XXXXX::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

HTREEITEM hItem = GetFirstVisibleItem();

this->select_item_ = HitTest(point, &nFlags);
if ( this->select_item_ )
{
SelectItem(this->select_item_);
创建右键菜单
。。。。。。。。。。。。。。。。
}

EnsureVisible(hItem);
CTreeCtrl::OnRButtonDown(nFlags, point);

}

树形风格:WS_VISIBLE | WS_BORDER | TVS_HASLINES | TVS_FULLROWSELECT | TVS_SINGLEEXPAND
右键首先先展开, 由于子项过多,出现滚动条,同时滚动条下移 选中项出现在窗口最上方
EYIIJIUIUI 2010-05-15
  • 打赏
  • 举报
回复
HTREEITEM hItem = GetFirstVisibleItem();
// 处理。。。

EnsureVisible(hItem)
huanmeng2008 2010-05-15
  • 打赏
  • 举报
回复
不行 没效果,是不是要设置控件的某些属性
EYIIJIUIUI 2010-05-15
  • 打赏
  • 举报
回复
是的阿
huanmeng2008 2010-05-15
  • 打赏
  • 举报
回复
就是说 EnsureVisible(GetRootItem())的话 根节点就一直显示第一个?
EYIIJIUIUI 2010-05-15
  • 打赏
  • 举报
回复
GetFirstVisibleItem得到第一个Visible Item, hItem
EnsureVisible(hItem)
huanmeng2008 2010-05-15
  • 打赏
  • 举报
回复
this->select_item_ = HitTest(point, &nFlags);
if ( this->select_item_ )
{
EnsureVisible(this->select_item_);
SelectItem(this->select_item_);
}

在 OnRButtonDown()中调用这个 也一样那个的没效果,右键的时候显示项目已经选中了。 滚动条还是动。
EYIIJIUIUI 2010-05-15
  • 打赏
  • 举报
回复
GetSelectedItem()没有选中项目
huanmeng2008 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yulinxie 的回复:]
pmyTreeCtrl->Expand(hParent, TVE_EXPAND);

// Ensure the item is visible.
pmyTreeCtrl->EnsureVisible(hmyItem);
[/Quote]

我在OnTvnItemexpanding 中调用 EnsureVisible(GetSelectedItem()); 没效果.
快乐鹦鹉 2010-05-15
  • 打赏
  • 举报
回复
真是不太清楚,没有做过。
EYIIJIUIUI 2010-05-15
  • 打赏
  • 举报
回复
给分啊
EYIIJIUIUI 2010-05-15
  • 打赏
  • 举报
回复
pmyTreeCtrl->Expand(hParent, TVE_EXPAND);

// Ensure the item is visible.
pmyTreeCtrl->EnsureVisible(hmyItem);
EYIIJIUIUI 2010-05-15
  • 打赏
  • 举报
回复
调用EnsureVisible()函数就可以了

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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