自绘控件继承于CCombobox,如何赋值

tjzzx888 2009-06-06 05:39:45
1、我继承CCombobox自绘控件
class MyCombobox : public CCombobox
{
...
}
2、在OnCtlColorListBox中子类化了m_listbox
3、在对话框中动态创建了一个实例,是DOWNLIST类型的
m_pCombo = new MyCombobox;
m_pCombo->Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN|CBS_HASSTRINGS|CBS_AUTOHSCROLL,CRect(0,0,200,300),this,nID);
4、并用AddString()函数添加了三条字符串
m_pCombo->AddString("red");
m_pCombo->AddString("green");
m_pCombo->AddString("blue");
5、问题是:
在运行界面中,选择三条中某一条记录时,所选择的文本不能成为本控件的文本,我在调试时发现控件内部的DrawItem中可以正确获得鼠标所选择的项,然后我在控件内部用SetWindowText(str)设置此控件的文本,却不成功
谢谢各位高手指点,不尽感谢!

...全文
125 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyxie 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tjzzx888 的回复:]
to skyxie:
我用m_pCombox->SetCurSel(0);这句了,控件外部m_pCombox->GetCurSel还是-1
[/Quote]

m_pCombox->SetCurSel(0);这句也是在控件外部吧?调用的时候AddString完成没有,也就是说,你的combo是不是空的?
tjzzx888 2009-06-06
  • 打赏
  • 举报
回复
还是不行呀,那位高人帮帮我呀
tjzzx888 2009-06-06
  • 打赏
  • 举报
回复
to skyxie:
我用m_pCombox->SetCurSel(0);这句了,控件外部m_pCombox->GetCurSel还是-1
skyxie 2009-06-06
  • 打赏
  • 举报
回复
那你就到ccombo上去选啊

combo没有选中的时候当然什么都看不到了

如果你像初始就看到那你就在初始化函数,比如dlg的OnInitUpdate中
m_pCombox->SetCurSel(0);
tjzzx888 2009-06-06
  • 打赏
  • 举报
回复
to skyxie:

我是说,在这个控件的外部获取文本用GetWindowText(比如选择完毕后,点击按钮);因为这时控件的GetCurSel永远是-1呀
skyxie 2009-06-06
  • 打赏
  • 举报
回复
倒,上面n个人给你说了combobox不是用GetWindowText,而是用 etLBText
tjzzx888 2009-06-06
  • 打赏
  • 举报
回复
to skyxie:
我先把OnPaint中的画文本这句先注释掉,主要是为了暂时不出异常,应该不会影响控件外部获取这个控件的文本吧,
但在控件外部,用m_pCombox->GetWindowText(strValue); strValue还是为空
skyxie 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tjzzx888 的回复:]
如果在OnPain中,直接调用GetLBText(GetCurSel(), sz);会出现异常
[/Quote]

1.
你的sz是怎么定义的?

2.
在初始化的时候你的combo可能没有sel,GetCurSel() 可能返回CB_ERR

你应该判断是否有选择,有选择的时候再
GetLBText
tjzzx888 2009-06-06
  • 打赏
  • 举报
回复
如果在OnPain中,直接调用GetLBText(GetCurSel(), sz);会出现异常
Ryanwen 2009-06-06
  • 打赏
  • 举报
回复
看来LZ对combo控件还不是很了解,combo控件是由edit,static,list控件组成的,用GetWindowText和SetWindowText的效果是不确定的,建议你去codepeoject下个实例看看
tjzzx888 2009-06-06
  • 打赏
  • 举报
回复
to:skyxie
用SetCurSel(nIndex);

因为是自绘控件,所以在OnPaint中,
OnPaint
{
...
CString sz;
GetWindowText(sz);//在这里sz的值还是为空
dc.DrawText(sz,&rc,DT_TOP | DT_SINGLELINE);
...
}
skyxie 2009-06-06
  • 打赏
  • 举报
回复
这样

CString str;

GetLBText(GetCurSel(), str);
warsour 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mengxianbo921 的回复:]
GetCurSel 取得组合框的列表框中当前选中项(如果有的话)的下标

GetLBText 从组合框的列表框中取得一个字符串

试下。
[/Quote]

取值别人已经给你说啦,不是用GetWindowText,这个和edit不一样
skyxie 2009-06-06
  • 打赏
  • 举报
回复
combo里面包含了一个 edit (drop-down)或者 static (drop-down list)

你直接getcombo的windowtext没有意义。
tjzzx888 2009-06-06
  • 打赏
  • 举报
回复
to:skyxie
SetCurSel(nIndex);后
我用GetWindowText(sz);sz还是为“”啊
arthur____ 2009-06-06
  • 打赏
  • 举报
回复
GetCurSel 取得组合框的列表框中当前选中项(如果有的话)的下标

GetLBText 从组合框的列表框中取得一个字符串

试下。
tjzzx888 2009-06-06
  • 打赏
  • 举报
回复
谢谢两位的回复,我先试一下
warsour 2009-06-06
  • 打赏
  • 举报
回复
是SetCurSel不是SetWindowText啦
skyxie 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 tjzzx888 的帖子:]
然后我在控件内部用SetWindowText(str)设置此控件的文本
[/Quote]

用CCOmboBox::SetCurSel

比如选择了第一行,就用 this->SetCurSel(0);

15,979

社区成员

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

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