程序使用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区域更新完之后在消失?希望大家多帮我看看,非常感谢了
左边是树(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区域更新完之后在消失?希望大家多帮我看看,非常感谢了
--------
你可以屏蔽了这个消息,没有必要一定要有这个消息啊 ~~你选中一项可以通过右键消息来实现
{
CPoint pt;
UINT flag;
HTREEITEM hCurrentItem;
GetCursorPos(&pt);
m_tree.ScreenToClient(&pt);
hCurrentItem = m_tree.HitTest(pt, &flag);
m_tree.SelectItem(hCurrentItem);
}
TVN_SELCHANGED消息中有进行对MIDDLE界面的更新显示的操作,我如果把它屏蔽了,那他里面更新MIDDLE的操作也要再得放到右键菜单和左键点击里面来了。同时,放到右键菜单里面来因为MIDDLE区域仍然要更新所以仍在存在着MIDDLE先更新完了 再 右键菜单残影消失的情况。
而这我已经验证过了,我试过将这更新MIDDLE的操作放在这右键菜单消息函数里面过,仍存在问题
我又试了一遍,发现UpdateWindow也不行,估计跟InvalidDate差不多
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);
}
}