如何修改ComboBox的下拉列表框的边框的颜色?

collision 2004-11-30 09:41:33
我的想法大概如下:

1.子类化列表框
2.在自定义的ListBox里重载PreSubclassWindow函数,去掉WS_BORDER风格
3.在ListBox里重载OnPaint函数,画想要的边框

结果:

当下拉列表框里没有Item时能正确显示,即显示我自定义的列表框风格,但当列表框里Item时他只是显示一个没有边框的ListBox并且只能显示Item个数的高度的列表框.

跟踪分析:

当下拉列表框里有Item时,重画时没有调用我子类化的ListBox里的OnPaint函数,而是Windows自己为我剪裁了一个合适高度的列表框.

问题:

如果让Windows调用我自定义列表框的重画函数?

最好那位大虾能讲一讲MFC对于ComboBox的实现机制。
...全文
1511 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
collision 2004-12-15
  • 打赏
  • 举报
回复
还有一个问题,就是ListBox不能一直那么高,添加了一个字符串之后就变得很短了
collision 2004-12-15
  • 打赏
  • 举报
回复
lbird(★郑恒★) :
太谢谢你了, 不光代码给出了,还讲了一些基本的道理,受益非浅!!!
lbird 2004-12-07
  • 打赏
  • 举报
回复
在子类化后马上调用这句
m_wndMyListBox.SendMessage(WM_NCPAINT,0,0);可以弥补上面的不足
liuzq_78 2004-12-07
  • 打赏
  • 举报
回复
up
lbird 2004-12-07
  • 打赏
  • 举报
回复
把这些代码放到OnNcPaint中,原来都删掉
CWindowDC dc(this);
CRect rtWnd;
GetWindowRect( &rtWnd );
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *old_pen = dc.SelectObject(&pen);

int w = rtWnd.Width() - 1 ;
int h = rtWnd.Height() - 1;
dc.MoveTo(0,0);
dc.LineTo(w,0);
dc.LineTo(w,h);
dc.LineTo(0,h);
dc.LineTo(0,0);

dc.SelectObject(old_pen);

还有一个,就是子类化的时间不好,所以第一次弹出时并没有绘红线,
因为你子类化时,LIST窗口已经处理WM_NCPAINT了
lbird 2004-12-07
  • 打赏
  • 举报
回复
在ListBox的OnNcPaint应该调用
GetWindowRect而不是GetClientRect,低级错误
collision 2004-12-07
  • 打赏
  • 举报
回复
第三方控件控制起来不是很方便,另外我还要判断输入的是否合法,什么的,总之,我已经到了想把这个问题弄明白的地步了,呵呵!!
lbird(★郑恒★),我给你回了信,附件里有我的问题!!!
smallcrocodile 2004-12-07
  • 打赏
  • 举报
回复
找个三方控件
lbird 2004-12-07
  • 打赏
  • 举报
回复
收到了
只是你要做到的效果,但还不知道具体的问题,你上面说得还不清楚
collision 2004-12-06
  • 打赏
  • 举报
回复
我给你发过去了
lbird 2004-12-02
  • 打赏
  • 举报
回复
WM_DRAWITEM没用的,组合框不支持对下拉框重绘
我不太明白你的意思,你把EXE文件发给我看看lbird@tom.com
collision 2004-12-01
  • 打赏
  • 举报
回复
怎么样了,还没有搞出来
collision 2004-11-30
  • 打赏
  • 举报
回复
我还看了很多自己实现的ComboBox,如果只是继承自CComboBox能不能实现这些功能呢?
collision 2004-11-30
  • 打赏
  • 举报
回复
谢谢,添加了,结果一样!还有什么要注意的吗?
handwolf 2004-11-30
  • 打赏
  • 举报
回复
ListBox?ComboBox?

需要增加ownerdraw风格
collision 2004-11-30
  • 打赏
  • 举报
回复
我从在的ComboBox为CSMComboBox,重载的ListBox是CSMListBox,现在我遇到的问题是
当ListBox里有Item时,单击下拉按钮时不能显示CSMListBox的风格,而显示的是系统
自己生成的缺省风格的列表框,如果不能显示我自定义的列表框,我子类化ListBox岂
不是白费心机.
ShiGang(Sucess)详细说说你的想法阿!!!
ShiGang 2004-11-30
  • 打赏
  • 举报
回复
WM_DRAWITEM中重繪!
collision 2004-11-30
  • 打赏
  • 举报
回复
to:lbird(★郑恒★)谢谢
你说的很对,我试了,很好用,可是现在还有个问题是:
当下拉列表框里没有Item时能正确显示,即显示我自定义的列表框风格,但当列表框里Item时他只是显示系统生成的ListBox,并且只能显示Item个数的高度的列表框.怎样才能让他显示我的ListBox呢?
Aaron_Jerry 2004-11-30
  • 打赏
  • 举报
回复
你不妨试试响应WM_CTLCOLOR消息

HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
//添加代码...

// TODO: Return a different brush if the default is not desired
return hbr;
}

GOOD LUCK!!!^_^
lbird 2004-11-30
  • 打赏
  • 举报
回复
楼主的意思是要改变下拉框的边框颜色而不是组合框的边框?
我认为不要去掉WS_BORDER风格,边框的绘制放在ON_NCPAINT中

15,980

社区成员

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

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