MFC SDI框架程序,拆分成两个view, 其中一个是 CFormView, 在这个view中我 建了个 toolbar,
我的问题是,当鼠标点击 另一个view时, 这个FormView中 toolbar 的按钮 变灰了,我再在 这个FormView上点击鼠标,按钮又恢复为正常状态。现在我想不管焦点在哪,都让toolbar按钮一直有效,该怎么办?
我的问题是,当鼠标点击 另一个view时, 这个FormView中 toolbar 的按钮 变灰了,我再在 这个FormView上点击鼠标,按钮又恢复为正常状态。现在我想不管焦点在哪,都让toolbar按钮一直有效,该怎么办?
解决方案 »
- VC++ 视频数据的存储与转发
- 在做一个串口通信程序,不过又没有串口接受的硬件
- 在ActiveX下,做一个方法接口函数,想通过参数返回一个字符串,参数要什么类型啊?????????????????急啊。。。。。。
- 获取硬盘分区信息的问题
- DLL动态调用出错
- 请问:在win32 application 做的程序中怎样显示对话框? (要能利用资源编辑器最好)
- 送分喽!!!!关于 CFileDialog的问题!
- 怎样由配置文件动态生成菜单
- VC++对数据表之间的关系如何操作?
- 兄弟们,有没有什么好方法,使木马程序可以突破防火墙。
- 如何把图片数据转化成Base64数据格式?
- 每当打开网页如何记录IE打开的网址
//=============================================================================
// 一个经典的函数, 让工具按钮/菜单在所有的多视/分割视图都可用(而不是灰化),可以响应
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if ( CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) )
return TRUE;
CSkillBookDoc * pDoc = ( CSkillBookDoc* ) GetActiveDocument ();
POSITION pos=NULL;
if ( pDoc != NULL )
pos = pDoc->GetFirstViewPosition ();
while ( pos != NULL )
{
CView* pNextView = pDoc->GetNextView ( pos );
if ( pNextView != GetActiveView() )
{
if ( pNextView->OnCmdMsg ( nID, nCode, pExtra, pHandlerInfo ) )
return TRUE;
}
}
return FALSE;
// return CNewFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
有个前提,如果程序在消息处理列表内没有找到对应的消息响应函数,菜单/工具按钮肯定是灰化的.
在默认的情况下,消息处理顺序大致为VIEW/DOC/FRAME/APP/系统(可能不是很准确),但有一点可以确认,就是这里的VIEW是当前激活的VIEW,没有激活的VIEW是不会进入消息处理链表的,这样有些消息虽然处理了,但程序在运行的时候没有检测到,所以是灰化的.上述代码把没有激活的VIEW也加到了消息处理列表中,这样你的以前灰化的消息处理顺序如下:
激活的VIEW(没有处理)/DOC(没有处理)/然后交给FRAME(也没有对应的响应函数,也不处理),但是此时FRAME做了重要的决定,就是代码实现了把没有处理的消息交给所有没有激活的视图,看看这些视图有没有做对应的消息响应,有(因为你做了)则不会灰化,没有那就可能是灰化了.以上为个人的理解,错误之处在所难免.但楼主问了,尽个人能力,我是这么理解的.另外,利用这个函数,还可以把一些其它的如停靠栏等其它的UI工具也处理消息,只要把窗口按照上述方法加入到消息处理链表即可.