对话框中菜单变灰的问题!

liwei84516 2009-09-08 10:35:40
问题如下:
对话框中添加了一个菜单,下面有两个子项分别为ID_MENU1,和ID_MENU2,初始的时候两个菜单都是可以点击的,即都没有变灰。点击ID_MENU1菜单后会弹出一个非模态的对话框,而此时ID_MENU2菜单是要求变灰的。当点击ID_MENU1菜单弹出的那个对话框中的OK按钮后,弹出的对话框销毁,此时要求ID_MENU2菜单变为可用,请问如何实现?

我问题应该描述清楚了吧!!!
...全文
264 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
luxintian 2012-09-10
  • 打赏
  • 举报
回复
对话框中要实现这个功能需在消息映射中添加ON_WM_INITMENUPOPUP 项,并在对话框类中添加OnInitMenuPopup成员函数(代码可以在WinFrm.cpp中)复制过来的)
muzizongheng 2009-09-08
  • 打赏
  • 举报
回复
提示的错误时 什么 ?哪个指针无效 ?? 你的 pTestDlg初始化赋为 NULL没 ?
liwei84516 2009-09-08
  • 打赏
  • 举报
回复
pTestDlg != NULL && pTestDlg->GetSafeHwnd() != NULL && pTestDlg->IsWindowVisible()



就这个地方挂的,代码比较多,不好贴出来

能给弄个demo不? 谢谢 liwei84516@163.com
muzizongheng 2009-09-08
  • 打赏
  • 举报
回复
挂哪了 ? 给出代码 , 我给你 看看 。
liwei84516 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 muzizongheng 的回复:]
if (pTestDlg->IsWindowVisible()) //pTestDlg,是按下menu1后弹出的非模态对话框


加上判断啊 , 呵呵 。 pTestDlg != NULL && pTestDlg->GetSafeHwnd() != NULL && pTestDlg->IsWindowVisible()
[/Quote]

加上判断以后还是一样,运行就挂掉了

他不可能总是循环查dlg的状态吧.所以应该这样,最好为菜单关联一个成员变量: 
在菜单命令的响应函数中让menu2变灰,在dlg的OK函数中让menu有效,用这个方法可以获得父窗口指针:
((父窗口类名*)(GetParent()))->m_Menu.


能来个实例就好了
fangchao918628 2009-09-08
  • 打赏
  • 举报
回复
你在处理的COMMAND消息的时候直接设置m_indexClA 值,不需要在里面判断IsWindowVisible

关闭的时候将m_indexClA 设置回来
路人乙2019 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 muzizongheng 的回复:]
引用 4 楼 liwei84516 的回复:
TO muzizongheng
不行呀!


哪儿不行?

if (dlg.IsWindowVisible())
{
pCmdUI->Enable(FALSE);
}
else
{
pCmdUI->Enable(TRUE);
}
[/Quote]他不可能总是循环查dlg的状态吧.所以应该这样,最好为菜单关联一个成员变量:
在菜单命令的响应函数中让menu2变灰,在dlg的OK函数中让menu有效,用这个方法可以获得父窗口指针:
((父窗口类名*)(GetParent()))->m_Menu.
muzizongheng 2009-09-08
  • 打赏
  • 举报
回复
if (pTestDlg->IsWindowVisible()) //pTestDlg,是按下menu1后弹出的非模态对话框


加上判断啊 , 呵呵 。 pTestDlg != NULL && pTestDlg->GetSafeWnd() != NULL && pTestDlg->IsWindowVisible()
liwei84516 2009-09-08
  • 打赏
  • 举报
回复
void CIMS_PCDlg::OnUpdateMenu2(CCmdUI* pCmdUI) 
{
// TODO: Add your command update UI handler code here
if (pTestDlg->IsWindowVisible()) //pTestDlg,是按下menu1后弹出的非模态对话框
{
pCmdUI->Enable(FALSE);
}
else
{
pCmdUI->Enable(TRUE);
}
}


运行的时候就挂掉了
liwei84516 2009-09-08
  • 打赏
  • 举报
回复


if (dlg.IsWindowVisible()) //这个dlg是非模态对话框,而不是主对话框吧!
{
pCmdUI->Enable(FALSE);
}
else
{
pCmdUI->Enable(TRUE);
}


用上面的程序直接挂掉了
fangchao918628 2009-09-08
  • 打赏
  • 举报
回复
处理ID_MENU2的UPDATE_COMMAND_UI消息

void CMainFrame::OnUpdateMENU2
{
if(m_indexClA == 0)
pCmdUI->Enable(0);
else
pCmdUI->Enable(1);
}

你想使他变灰或可用设置indexClA值
muzizongheng 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liwei84516 的回复:]
TO muzizongheng
不行呀!
[/Quote]

哪儿不行?

if (dlg.IsWindowVisible())
{
pCmdUI->Enable(FALSE);
}
else
{
pCmdUI->Enable(TRUE);
}
liwei84516 2009-09-08
  • 打赏
  • 举报
回复
TO muzizongheng
不行呀!
muzizongheng 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 muzizongheng 的回复:]
第一步:Menu1菜单项响应ON_COMMAND消息
在消息处理函数里

create你要的非模态对话框。


[/Quote]

dlg.create(..);
...
muzizongheng 2009-09-08
  • 打赏
  • 举报
回复
第一步:Menu1菜单项响应ON_COMMAND消息
在消息处理函数里

create你要的非模态对话框。



第二步: Menu2菜单项响应ON_UPDATE_COMMAND_UI消息。

在Menu2菜单项的 消息处理函数里:
if (dlg.IsWindowVisible())
{
pCmdUI->Enable(FALSE);
}
pornographer 2009-09-08
  • 打赏
  • 举报
回复
非模态的对话框 中存储一个主窗体的句柄
在关闭的时候向主窗体postmessage就可已了
WFORLS 2009-09-08
  • 打赏
  • 举报
回复
偶是菜鸟,飘过学习

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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