请教大虾:提供了响应函数,为什么对话框工具栏按钮仍然是灰的?

jackiux 2008-08-31 11:53:25
在一个多文档程序中,点击主界面的工具栏按钮,弹出对话框,这个对话框含有另一个工具栏B。
已经通过向导在对话框类中添加了这个工具栏按钮的响应函数,但是运行时,对话框工具栏按钮老是显示为灰的(不可点)。
请大侠帮忙看看,究竟是什么原因?难道消息没有映射上?

BEGIN_MESSAGE_MAP(CDialog1, CDialog)
//{{AFX_MSG_MAP(CDialog1)
ON_WM_CREATE()
ON_WM_SIZE()
ON_COMMAND(ID_BUTTON_TEST1, OnButtonTest1) //工具栏按钮1的响应函数
ON_COMMAND(ID_BUTTON_TEST2, OnButtonTest2) //工具栏按钮2的响应函数
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDialog1 message handlers

int CDialog1::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}


return 0;
}

void CDialog1::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
m_wndToolBar.MoveWindow(0, 0, cx, 25);

}

void CDialog1::OnButtonTest1()
{
AfxMessageBox("Button1 is pressed!");

}

void CDialog1::OnButtonTest2()
{
AfxMessageBox("Button2 is pressed!");
}

...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
liumeiqinyang 2008-08-31
  • 打赏
  • 举报
回复
学习一下
jackiux 2008-08-31
  • 打赏
  • 举报
回复
给了我不少提示,谢谢了。
yueyucanyang 2008-08-31
  • 打赏
  • 举报
回复
对话框程序是不能直接用ON_UPDATE_COMMAND_UI机制的
因为ON_UPDATE_COMMAND_UI是在CWinApp的WM_KICKIDLE消息处理中实现的

应该是这样的,具体细节我也不是特别清楚!
jackiux 2008-08-31
  • 打赏
  • 举报
回复
确实没有菜单和响应函数关联,只与工具栏按钮有关联。

那为什么框架窗口的工具栏不是这样的呢?我试了将与框架窗口的工具栏按钮的ID一直的菜单项去掉,不显式调用EnableButton,工具栏按钮没有变灰啊。

这一块儿,MFC的机制究竟是怎样的?
yueyucanyang 2008-08-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jackiux 的回复:]
谢谢提醒!在对话框的OnInitDialog函数中设置工具栏按钮可用,可以解决这个问题:
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_TEST1, TRUE);
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_TEST2, TRUE);
但是为什么还需要这么显示的设置呢?按说有响应函数,按钮就应该可用啊。
[/Quote]

你这个响应函数是与菜单相关联的吗?如果不是的话,可能需要显示的调用。
jackiux 2008-08-31
  • 打赏
  • 举报
回复
谢谢提醒!在对话框的OnInitDialog函数中设置工具栏按钮可用,可以解决这个问题:
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_TEST1, TRUE);
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_TEST2, TRUE);
但是为什么还需要这么显示的设置呢?按说有响应函数,按钮就应该可用啊。
yueyucanyang 2008-08-31
  • 打赏
  • 举报
回复
m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_TEST1,TRUE
yueyucanyang 2008-08-31
  • 打赏
  • 举报
回复
你这样试试

int CDialog1::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}

m_wndToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_TEST1,TRUE); return 0;
}

wangyaosuper 2008-08-31
  • 打赏
  • 举报
回复
应该可以通过函数设置按钮是否可用 。
你查一查相关的资料,看看工具栏类有没有这样的接口函数。

15,979

社区成员

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

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