右键菜单残影消失慢,该怎么办

上岸の鱼 2010-07-30 09:58:16
程序使用FormView分成左(LEFT),中(MIDDLE)两块区域。
左边是树(Tree),中间根据左边点击的选项显示不同的图片,或加载控件显示曲线、播放flash等。
现在为左边的树响应了右键菜单响应的消息函数,以及切换选择项的消息函数:
ON_NOTIFY(TVN_SELCHANGED,IDC_TREE_CATALOG,OnTreeSelChanged)
ON_NOTIFY(NM_RCLICK,IDC_TREE_CATALOG,OnNMRclickTree1)

右键消息弹出菜单,并同时选择选中新节点,就是说那个节点同时被选上了。这样在我右键点击的时候,同时响应了以上两个函数,即弹出菜单,又在MIDDLE里跟新显示界面。

结果问题就出在这里了,连续右键不同节点时,前面一个右键菜单的消失的比较慢,留下了残影。如果屏蔽TVN_SELCHANGED消息,则就不会有这样的问题,同时我在右键菜单函数或OnTreeSelChanged中UpdateData或InvalidDate都解决不了问题,
我又试过创建一个线程,将OnTreeSelChanged里的函数单独封在里面,企图通过sleep线程让右键菜单先响应结束再进行MIDDLE界面的更新,但很惊奇遗憾地发现之前一个右键菜单的残影一定会在MIDDLE界面更新完之后才消失。

我想这是问题的关键所在,想请教大家该如何解决这个菜单残影问题,是否有Windows函数可以在程序里先行对被摧毁的修菜单区域进行更新消除残影,使残影不会在我MIDDLE区域更新完之后在消失?

希望大家多帮我看看,非常感谢了
...全文
378 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
上岸の鱼 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xmzzy 的回复:]
来者有分,那我还是来吧
[/Quote]

太悲剧,没来人领分,比较喜欢你的头像,多给点
xmzzy 2010-08-02
  • 打赏
  • 举报
回复
来者有分,那我还是来吧
上岸の鱼 2010-08-02
  • 打赏
  • 举报
回复
唉。。。悲剧。。又没人来回答了。。散分了,,来者有分
上岸の鱼 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 vc_zsy 的回复:]
引用 7 楼 xx7330842 的回复:
没见过你描述的现象,不过肯定是你代码逻辑问题,你扯了半天也没怎么看懂,贴代码看看~[/Quote]
//右键菜单消息
void CCatalogDlg::OnNMRclickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
m_popMenu = new CMenu;
m_popMenu->LoadMenu(IDR_MENU_CATALOG);
CMenu *pSub = m_popMenu->GetSubMenu(0);
if(pSub)
{
.........
CPoint pt;
::GetCursorPos(&pt);
pSub->TrackPopupMenu(TPM_CENTERALIGN,pt.x+55,pt.y,this);
}
Invalidate(FALSE);
}

//树节点切换消息
void CCatalogDlg::OnTreeSelChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
.................
//获得MIDDLE视图的指针(自定义函数)
CMiddleFormView *pMiddle = GetSpecialWnd(GetFrm(),CMiddleFormView,IDD_FORMVIEW_MIDDLE);
if(pMiddle != NULL)
{
..................
//向MIDDLE视图发消息以使它根据左边节点选择的变化而进行更新显示。
pMiddle ->SendMessage(WM_BOTTOM_INFO,flag,catalogID);
}
}
上岸の鱼 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 vc_zsy 的回复:]
话说LZ你有没有调用DestroyMenu来删除你上次加载的菜单~~
[/Quote]
用了,但发现用跟没用表现上没有区别
VC_ZSY 2010-07-30
  • 打赏
  • 举报
回复
话说LZ你有没有调用DestroyMenu来删除你上次加载的菜单~~
VC_ZSY 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xx7330842 的回复:]

引用 4 楼 vc_zsy 的回复:
屏蔽TVN_SELCHANGED消息,则就不会有这样的问题
--------
你可以屏蔽了这个消息,没有必要一定要有这个消息啊 ~~你选中一项可以通过右键消息来实现


TVN_SELCHANGED消息中有进行对MIDDLE界面的更新显示的操作,我如果把它屏蔽了,那他里面更新MIDDLE的操作也要再得放到右键菜单和左键点击里面来了。同时,放到右键……
[/Quote]
没见过你描述的现象,不过肯定是你代码逻辑问题,你扯了半天也没怎么看懂,贴代码看看~
上岸の鱼 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 webipstin 的回复:]
pTree->UpdateWindow();
[/Quote]

我又试了一遍,发现UpdateWindow也不行,估计跟InvalidDate差不多
上岸の鱼 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vc_zsy 的回复:]
屏蔽TVN_SELCHANGED消息,则就不会有这样的问题
--------
你可以屏蔽了这个消息,没有必要一定要有这个消息啊 ~~你选中一项可以通过右键消息来实现
[/Quote]

TVN_SELCHANGED消息中有进行对MIDDLE界面的更新显示的操作,我如果把它屏蔽了,那他里面更新MIDDLE的操作也要再得放到右键菜单和左键点击里面来了。同时,放到右键菜单里面来因为MIDDLE区域仍然要更新所以仍在存在着MIDDLE先更新完了 再 右键菜单残影消失的情况。
而这我已经验证过了,我试过将这更新MIDDLE的操作放在这右键菜单消息函数里面过,仍存在问题
webipstin 2010-07-30
  • 打赏
  • 举报
回复
pTree->UpdateWindow();
VC_ZSY 2010-07-30
  • 打赏
  • 举报
回复
void CXXXXDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
{
CPoint pt;
UINT flag;
HTREEITEM hCurrentItem;
GetCursorPos(&pt);
m_tree.ScreenToClient(&pt);
hCurrentItem = m_tree.HitTest(pt, &flag);
m_tree.SelectItem(hCurrentItem);
}
VC_ZSY 2010-07-30
  • 打赏
  • 举报
回复
屏蔽TVN_SELCHANGED消息,则就不会有这样的问题
--------
你可以屏蔽了这个消息,没有必要一定要有这个消息啊 ~~你选中一项可以通过右键消息来实现
上岸の鱼 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bible_chou 的回复:]
取消右键改变选中结点,只让其弹出菜单试试。
[/Quote]

他们要求点击右键弹出菜单的时候也要改变选中的节点的呢。。
Bible_Chou 2010-07-30
  • 打赏
  • 举报
回复
取消右键改变选中结点,只让其弹出菜单试试。
上岸の鱼 2010-07-30
  • 打赏
  • 举报
回复
自己顶一下,八方神灵,路过的帮我看看,我想了好几天了这问题

15,979

社区成员

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

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