如何让MFC的CComboBox的下拉选项保持一直显示状态? 一直保持下拉状态,那不如放在CListBox控件在CComboBox下面,需要的时候显示出来,不需要的时候隐藏 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你好,这个方法我也想过,但是考虑到2个问题没有采用1.控件的相互遮挡问题,如果是ComboBox,则下拉条不会被其他控件遮挡,而ListBox会被遮挡,如图所示2.Combox的选项在鼠标滑动时就会更改焦点,而ListBox要单击才会更改焦点选项总之最好还是用一个ComboBox控件能解决最好,实在没办法再看吧 你好,我现在是用Edit、Button、ListBox一起实现,但是碰到个最麻烦的问题:1.这个组合的控件的正下方刚好是一个自绘的按钮,按钮类里设定了鼠标滑过时会将焦点设置在按钮上,并且带有按钮外观上的特效2.但是我为了模拟组合框的效果,给Edit响应了SETFOCUS消息,在得到焦点时显示List,又给响应了KILLFOCUS消息,让他在失去焦点的时候把List隐藏起来现在就是上面2点冲突了:我单击Edit时候,List出来了,我想去点击List中的项,但是刚好List的项比较多,鼠标移动到下方的时候到达那个自绘按钮的地盘了,于是焦点转移,List消失!!!附图一张先说明一下,界面的布局不好改动了,已经很紧凑了,所以不能打那个自绘按钮的主意,求助啊各路大神!! 你不能在KILLFOUCS里先判断一下当前正在操作哪个窗口吗?如果当前正在操作LISTBOX,就不隐藏啊。WindowFormPoint() 也不行,不过我是这样做的,if(GetFocus() == GetDlgItem(IDC_LIST_HISTORY))结果一样,还是在鼠标到自绘按钮的区域的时候LISTBOX就消失了后面我发现那个自绘按钮的MouseMove里用了SetCapture和SetFocus,但是如果把这2个去掉,那个自绘按钮又表现不正常了。现在我是又用ComboBox来做了,用DropList风格,再重绘,去掉右边的下拉箭头,这样是好的只不过下拉选项在第一次单击Combo的时候才会出现,若要再让 出现就可以移到其他按钮上,再单击Combo 我的建议,重写这个ComboBox类:这个ComboBox类继承Dialog,里面有个ListBox,将ListBox显示在这个ComboBox下面,当LButtonDown的时候,显示ListBox,在你想收起的时候,再隐藏这个ListBox,选择完某一个项,再在这个Dialog(ComboBox)上DrawText。至于右边的ComboBox特有的下拉按钮,可以DrawIcon呀。LRESULT CCustomComboBox::OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled){ bHandled = FALSE; if (!m_bTracking) { TRACKMOUSEEVENT stTraceMouseEvent; stTraceMouseEvent.cbSize = sizeof(TRACKMOUSEEVENT); stTraceMouseEvent.dwFlags = TME_LEAVE; stTraceMouseEvent.hwndTrack = m_hWnd; stTraceMouseEvent.dwHoverTime = 0; if (TrackMouseEvent(&stTraceMouseEvent) && m_uComboBoxState != BUTTONSTATE_PUSHED) { m_bTracking = TRUE; m_uComboBoxState = BUTTONSTATE_HOT; ::InvalidateRect(m_hWnd, NULL, FALSE); } } return 0;}LRESULT CCustomComboBox::OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled){ bHandled = FALSE; m_bTracking = FALSE; if (m_uComboBoxState != BUTTONSTATE_PUSHED) { m_uComboBoxState = BUTTONSTATE_NORMAL; ::InvalidateRect(m_hWnd, NULL, FALSE); } return 0;}LRESULT CCustomComboBox::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled){ bHandled = FALSE; if (::IsWindowVisible(m_clstComboBox.m_hWnd) == FALSE) { m_uComboBoxState = BUTTONSTATE_PUSHED; ::ShowWindow(m_clstComboBox.m_hWnd, SW_SHOW); } ::InvalidateRect(m_hWnd, NULL, FALSE); return 0;}LRESULT CCustomComboBox::OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled){ bHandled = FALSE; if (m_uComboBoxState != BUTTONSTATE_PUSHED) { m_uComboBoxState = BUTTONSTATE_HOT; ::InvalidateRect(m_hWnd, NULL, FALSE); } return 0;} 感谢你的回答,你是说相当于在那个地方放一个对话框了,对话框包括一个Combo和一个ListBox那样啊,对话框上放对话框,好像挺麻烦的 感谢你的回答,你是说相当于在那个地方放一个对话框了,对话框包括一个Combo和一个ListBox那样啊,对话框上放对话框,好像挺麻烦的感谢你的回答,你是说相当于在那个地方放一个对话框了,对话框包括一个Combo和一个ListBox那样啊,对话框上放对话框,好像挺麻烦的不是,是你的自定义的Combo继承dialog(我这WTL的程序,自定义的ComboBox就是继承CWindowImpl的,成员变量里有个ListBox,MFC的话应该差不多),不是将Combo放在Dialog上。如果用Eidt和ListBox组合操控性上有点不方便 大牛们请进....? 如何设置一个List Control 的底色,在线等,解决就结, 先到先得 VC_colordialog得简单问题 菜鸟求助:在VC ADO 中如何不建数据源直接连数据库? 关于VC++6.0里数值读取的问题,急! ADO数据库操作问题 一个关于网络协议的问题 为什么C++中的模板类的定义和实现要在同一文件中,不然在连接时会出错 编程风格浅谈 为什么codeinsight的功能在有的函数里可以,有的就不行啊?能解决吗?谢谢。 修改注册表启动类型后 无法启动服务 有做过的不?? EM_POSFROMCHAR不能用在描画前???为什么返回的位置不对?
1.控件的相互遮挡问题,如果是ComboBox,则下拉条不会被其他控件遮挡,而ListBox会被遮挡,如图所示
2.Combox的选项在鼠标滑动时就会更改焦点,而ListBox要单击才会更改焦点选项
总之最好还是用一个ComboBox控件能解决最好,实在没办法再看吧
你好,我现在是用Edit、Button、ListBox一起实现,但是碰到个最麻烦的问题:
1.这个组合的控件的正下方刚好是一个自绘的按钮,按钮类里设定了鼠标滑过时会将焦点设置在按钮上,并且带有按钮外观上的特效
2.但是我为了模拟组合框的效果,给Edit响应了SETFOCUS消息,在得到焦点时显示List,又给响应了KILLFOCUS消息,让他在失去焦点的时候把List隐藏起来现在就是上面2点冲突了:我单击Edit时候,List出来了,我想去点击List中的项,但是刚好List的项比较多,鼠标移动到下方的时候到达那个自绘按钮的地盘了,于是焦点转移,List消失!!!
附图一张
先说明一下,界面的布局不好改动了,已经很紧凑了,所以不能打那个自绘按钮的主意,求助啊各路大神!!
WindowFormPoint()
if(GetFocus() == GetDlgItem(IDC_LIST_HISTORY))
结果一样,还是在鼠标到自绘按钮的区域的时候LISTBOX就消失了
后面我发现那个自绘按钮的MouseMove里用了SetCapture和SetFocus,但是如果把这2个去掉,那个自绘按钮又表现不正常了。
现在我是又用ComboBox来做了,用DropList风格,再重绘,去掉右边的下拉箭头,这样是好的只不过下拉选项在第一次单击Combo的时候才会出现,若要再让 出现就可以移到其他按钮上,再单击Combo
{
bHandled = FALSE; if (!m_bTracking)
{
TRACKMOUSEEVENT stTraceMouseEvent; stTraceMouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
stTraceMouseEvent.dwFlags = TME_LEAVE;
stTraceMouseEvent.hwndTrack = m_hWnd;
stTraceMouseEvent.dwHoverTime = 0;
if (TrackMouseEvent(&stTraceMouseEvent) && m_uComboBoxState != BUTTONSTATE_PUSHED)
{
m_bTracking = TRUE;
m_uComboBoxState = BUTTONSTATE_HOT;
::InvalidateRect(m_hWnd, NULL, FALSE);
}
} return 0;
}LRESULT CCustomComboBox::OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled = FALSE;
m_bTracking = FALSE; if (m_uComboBoxState != BUTTONSTATE_PUSHED)
{
m_uComboBoxState = BUTTONSTATE_NORMAL;
::InvalidateRect(m_hWnd, NULL, FALSE);
} return 0;
}LRESULT CCustomComboBox::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled = FALSE; if (::IsWindowVisible(m_clstComboBox.m_hWnd) == FALSE)
{
m_uComboBoxState = BUTTONSTATE_PUSHED;
::ShowWindow(m_clstComboBox.m_hWnd, SW_SHOW);
} ::InvalidateRect(m_hWnd, NULL, FALSE); return 0;
}LRESULT CCustomComboBox::OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled = FALSE; if (m_uComboBoxState != BUTTONSTATE_PUSHED)
{
m_uComboBoxState = BUTTONSTATE_HOT;
::InvalidateRect(m_hWnd, NULL, FALSE);
} return 0;
}
不是,是你的自定义的Combo继承dialog(我这WTL的程序,自定义的ComboBox就是继承CWindowImpl的,成员变量里有个ListBox,MFC的话应该差不多),不是将Combo放在Dialog上。如果用Eidt和ListBox组合操控性上有点不方便