例程中采用如下方法在ToolBar上增加一个ComboBox:
1、增加两个分隔条,置第一个分隔条的宽度为100,第二个为12;
2、增加其它4个ToolBar按钮;
3、取得第一个分隔条的Rect区域,以此区域为界,以该ToolBar为父,动态创建一个ComboBox;
4、设置该ComboBox的内容和字体;
问题:每次当我选择ComboBox中的内容时,例如第N项,那么ComboBox后面的第N个ToolBar按钮将同时被选中。很奇怪,没有任何代码相关联。
这里是不是涉及到消息传递的问题,该ComboBox的消息传递到父窗体后是如何处理的?
3 个解决方案
#1
当然有关联。
在BOOL CCtrlbarsApp::OnIdle(LONG lCount)里:
SendMessage(hWnd, WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0L);
在BOOL CCtrlbarsApp::OnIdle(LONG lCount)里:
SendMessage(hWnd, WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0L);
#2
yu_hl(卖火柴的小男孩), 感谢你的解答。
为了验证,我特意去掉了CCtrlbarsApp对于OnIdle的处理,结果:< 关联依然存在!
请问这是何故?谢谢。
为了验证,我特意去掉了CCtrlbarsApp对于OnIdle的处理,结果:< 关联依然存在!
请问这是何故?谢谢。
#3
呵呵,原因查明:
在mainfrm.cpp文件开头存在这样的消息映射:
ON_COMMAND_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnChangeStyle)
ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnUpdateStyle)
这里的ID_STYLE_LEFT...ID_STYLE_JUSTIFIED分别表示相应菜单和工具栏按钮的Command ID.
然后mainfrm.cpp定义了以下消息处理函数:
void CMainFrame::OnChangeStyle(UINT nID)
{
m_wndStyleBar.m_comboBox.SetCurSel((int)(nID-ID_STYLE_BASE));
}
void CMainFrame::OnUpdateStyle(CCmdUI* pCmdUI)
{
UINT nIndex = m_wndStyleBar.m_comboBox.GetCurSel();
pCmdUI->SetCheck((UINT)(ID_STYLE_BASE+nIndex) == pCmdUI->m_nID);
}
当选中菜单时或者工具栏按钮时,消息传递给OnChangeStyle()函数进行处理,该函数置ComboBox为指定值。然后OnUpdateStyle()函数被调用,用来处理菜单条和工具栏的显示!
可是,如果我们只选择ComboBox下拉框,会怎么样?系统并没有定义任何的消息处理!仔细想一下应该是这样,ComboBox的父窗体是工具栏m_wndStyleBar,那么ComboBox的所有消息一定先派发到m_wndStyleBar中,这样同样激发了OnUpdateStyle()函数调用!
OK,今天很高兴,即使没有答对,同样给分!
在mainfrm.cpp文件开头存在这样的消息映射:
ON_COMMAND_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnChangeStyle)
ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnUpdateStyle)
这里的ID_STYLE_LEFT...ID_STYLE_JUSTIFIED分别表示相应菜单和工具栏按钮的Command ID.
然后mainfrm.cpp定义了以下消息处理函数:
void CMainFrame::OnChangeStyle(UINT nID)
{
m_wndStyleBar.m_comboBox.SetCurSel((int)(nID-ID_STYLE_BASE));
}
void CMainFrame::OnUpdateStyle(CCmdUI* pCmdUI)
{
UINT nIndex = m_wndStyleBar.m_comboBox.GetCurSel();
pCmdUI->SetCheck((UINT)(ID_STYLE_BASE+nIndex) == pCmdUI->m_nID);
}
当选中菜单时或者工具栏按钮时,消息传递给OnChangeStyle()函数进行处理,该函数置ComboBox为指定值。然后OnUpdateStyle()函数被调用,用来处理菜单条和工具栏的显示!
可是,如果我们只选择ComboBox下拉框,会怎么样?系统并没有定义任何的消息处理!仔细想一下应该是这样,ComboBox的父窗体是工具栏m_wndStyleBar,那么ComboBox的所有消息一定先派发到m_wndStyleBar中,这样同样激发了OnUpdateStyle()函数调用!
OK,今天很高兴,即使没有答对,同样给分!
#1
当然有关联。
在BOOL CCtrlbarsApp::OnIdle(LONG lCount)里:
SendMessage(hWnd, WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0L);
在BOOL CCtrlbarsApp::OnIdle(LONG lCount)里:
SendMessage(hWnd, WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0L);
#2
yu_hl(卖火柴的小男孩), 感谢你的解答。
为了验证,我特意去掉了CCtrlbarsApp对于OnIdle的处理,结果:< 关联依然存在!
请问这是何故?谢谢。
为了验证,我特意去掉了CCtrlbarsApp对于OnIdle的处理,结果:< 关联依然存在!
请问这是何故?谢谢。
#3
呵呵,原因查明:
在mainfrm.cpp文件开头存在这样的消息映射:
ON_COMMAND_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnChangeStyle)
ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnUpdateStyle)
这里的ID_STYLE_LEFT...ID_STYLE_JUSTIFIED分别表示相应菜单和工具栏按钮的Command ID.
然后mainfrm.cpp定义了以下消息处理函数:
void CMainFrame::OnChangeStyle(UINT nID)
{
m_wndStyleBar.m_comboBox.SetCurSel((int)(nID-ID_STYLE_BASE));
}
void CMainFrame::OnUpdateStyle(CCmdUI* pCmdUI)
{
UINT nIndex = m_wndStyleBar.m_comboBox.GetCurSel();
pCmdUI->SetCheck((UINT)(ID_STYLE_BASE+nIndex) == pCmdUI->m_nID);
}
当选中菜单时或者工具栏按钮时,消息传递给OnChangeStyle()函数进行处理,该函数置ComboBox为指定值。然后OnUpdateStyle()函数被调用,用来处理菜单条和工具栏的显示!
可是,如果我们只选择ComboBox下拉框,会怎么样?系统并没有定义任何的消息处理!仔细想一下应该是这样,ComboBox的父窗体是工具栏m_wndStyleBar,那么ComboBox的所有消息一定先派发到m_wndStyleBar中,这样同样激发了OnUpdateStyle()函数调用!
OK,今天很高兴,即使没有答对,同样给分!
在mainfrm.cpp文件开头存在这样的消息映射:
ON_COMMAND_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnChangeStyle)
ON_UPDATE_COMMAND_UI_RANGE(ID_STYLE_LEFT, ID_STYLE_JUSTIFIED, OnUpdateStyle)
这里的ID_STYLE_LEFT...ID_STYLE_JUSTIFIED分别表示相应菜单和工具栏按钮的Command ID.
然后mainfrm.cpp定义了以下消息处理函数:
void CMainFrame::OnChangeStyle(UINT nID)
{
m_wndStyleBar.m_comboBox.SetCurSel((int)(nID-ID_STYLE_BASE));
}
void CMainFrame::OnUpdateStyle(CCmdUI* pCmdUI)
{
UINT nIndex = m_wndStyleBar.m_comboBox.GetCurSel();
pCmdUI->SetCheck((UINT)(ID_STYLE_BASE+nIndex) == pCmdUI->m_nID);
}
当选中菜单时或者工具栏按钮时,消息传递给OnChangeStyle()函数进行处理,该函数置ComboBox为指定值。然后OnUpdateStyle()函数被调用,用来处理菜单条和工具栏的显示!
可是,如果我们只选择ComboBox下拉框,会怎么样?系统并没有定义任何的消息处理!仔细想一下应该是这样,ComboBox的父窗体是工具栏m_wndStyleBar,那么ComboBox的所有消息一定先派发到m_wndStyleBar中,这样同样激发了OnUpdateStyle()函数调用!
OK,今天很高兴,即使没有答对,同样给分!