ComboBox 多选问题

wg961423 2009-06-19 08:22:04
工程上在用Rz的系列套件,但现在有个问题,RzComboBox中不能多选,即在下拉框中出现Check框,请问有什么方法可以解决?
不能用其他的套件,因为Rz系列是可以统一风格的,自画应该可以,但不知道应该怎么做,不知道各位大大能否给出代码以参考!
...全文
261 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2009-06-21
  • 打赏
  • 举报
回复
恩,你要这样的效果? 我专门在ComboBox中的Edit中绘制出那个Check图像的.

看你自己的需求吧.
wg961423 2009-06-21
  • 打赏
  • 举报
回复
谢谢妖哥了。
wg961423 2009-06-21
  • 打赏
  • 举报
回复
to 妖哥:

嘿嘿,我又改了一下你的代码,看起来效果好像有一点。


void __fastcall TForm1::RzComboBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
TRzComboBox *rcbx = dynamic_cast <TRzComboBox *>(Control);
if (!rcbx) return;

// 如果当前项处于选择状态
if (State.Contains(odSelected))
{
// 以高亮色填充背景
rcbx->Canvas->Brush->Color = TColor(0x00FF9933);
rcbx->Canvas->FillRect(Rect);
}
else
{
// 非选中项的背景色填充
rcbx->Canvas->Brush->Color = rcbx->Color;
rcbx->Canvas->FillRect(Rect);
}

// 判断当前项的Check状态并决定是否绘制Check图像
bool bChecked = bool(rcbx->Items->Objects[Index]);
if (bChecked || State.Contains(odComboBoxEdit))
{
RECT rctButton =
{
Rect.Left + 2,
Rect.Top + 2,
Rect.Left + RzComboBox1->ItemHeight - 2,
Rect.Top + RzComboBox1->ItemHeight - 2
};

// 63 63 72 75 6E 2E 63 6F 6D
DrawFrameControl(rcbx->Canvas->Handle,
&rctButton,
DFC_BUTTON,
DFCS_CHECKED | DFCS_FLAT); // DFCS_BUTTONCHECK
}
else
{
RECT rctButton =
{
Rect.Left + 2,
Rect.Top + 2,
Rect.Left + RzComboBox1->ItemHeight - 2,
Rect.Top + RzComboBox1->ItemHeight - 2
};

// 63 63 72 75 6E 2E 63 6F 6D
DrawFrameControl(rcbx->Canvas->Handle,
&rctButton,
DFC_BUTTON,
DFCS_FLAT); // DFCS_BUTTONCHECK
}

// 字体颜色
rcbx->Canvas->Font->Color = clBlack;

// 如果当前项是组合框的编辑状态就绘制出以逗号分隔的项目文本串
if (State.Contains(odComboBoxEdit))
{
String strText;
for (int i = 0; i < RzComboBox1->Items->Count; i++)
{
if (bool(rcbx->Items->Objects[i]))
{
if (strText == "")
strText = rcbx->Items->Strings[i];
else
strText += "," + rcbx->Items->Strings[i];
}
}

rcbx->Canvas->Brush->Color = rcbx->Color;
rcbx->Canvas->FillRect(Rect);
rcbx->Canvas->TextOutA(Rect.Left+3,Rect.Top + (Rect.Height() - rcbx->Canvas->TextHeight("A")) / 2,strText);
}
else // 普通项目
{
rcbx->Canvas->TextOutA(Rect.Left + rcbx->ItemHeight,
Rect.Top + (Rect.Height() - rcbx->Canvas->TextHeight("A")) / 2,
rcbx->Items->Strings[Index]);
}
}
ccrun.com 2009-06-21
  • 打赏
  • 举报
回复
我又来了!!!

修正版的代码:
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
RzComboBox1->Items->AddObject("111", (TObject *)true);
RzComboBox1->Items->AddObject("222", (TObject *)true);
RzComboBox1->Items->AddObject("333", (TObject *)false);
RzComboBox1->Items->AddObject("444", (TObject *)true);
RzComboBox1->Items->AddObject("555", (TObject *)false);

RzComboBox1->ItemIndex = 0;

RzComboBox1->Style = csOwnerDrawFixed;
RzComboBox1->ItemHeight = 18;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RzComboBox1DrawItem(TWinControl *Control,
int Index, TRect &Rect, TOwnerDrawState State)
{
TRzComboBox *rcbx = dynamic_cast <TRzComboBox *>(Control);
if (!rcbx) return;

// 如果当前项处于选择状态
if (State.Contains(odSelected))
{
// 以高亮色填充背景
rcbx->Canvas->Brush->Color = TColor(0x00FF9933);
rcbx->Canvas->FillRect(Rect);
}
else
{
// 非选中项的背景色填充
rcbx->Canvas->Brush->Color = rcbx->Color;
rcbx->Canvas->FillRect(Rect);
}

// 判断当前项的Check状态并决定是否绘制Check图像
bool bChecked = bool(rcbx->Items->Objects[Index]);
if (bChecked || State.Contains(odComboBoxEdit))
{
RECT rctButton =
{
Rect.Left + 2,
Rect.Top + 2,
Rect.Left + RzComboBox1->ItemHeight - 2,
Rect.Top + RzComboBox1->ItemHeight - 2
};

// 63 63 72 75 6E 2E 63 6F 6D
DrawFrameControl(rcbx->Canvas->Handle,
&rctButton,
DFC_BUTTON,
DFCS_CHECKED | DFCS_FLAT); // DFCS_BUTTONCHECK
}

// 字体颜色
rcbx->Canvas->Font->Color = clBlack;

// 如果当前项是组合框的编辑状态就绘制出以逗号分隔的项目文本串
if (State.Contains(odComboBoxEdit))
{
String strText;
for (int i = 0; i < RzComboBox1->Items->Count; i++)
{
if (bool(rcbx->Items->Objects[i]))
{
if (strText == "")
strText = rcbx->Items->Strings[i];
else
strText += "," + rcbx->Items->Strings[i];
}
}

rcbx->Canvas->TextOutA(Rect.Left + RzComboBox1->ItemHeight,
Rect.Top + (Rect.Height() - rcbx->Canvas->TextHeight("A")) / 2,
strText);
}
else // 普通项目
{
rcbx->Canvas->TextOutA(Rect.Left + RzComboBox1->ItemHeight,
Rect.Top + (Rect.Height() - rcbx->Canvas->TextHeight("A")) / 2,
rcbx->Items->Strings[Index]);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RzComboBox1Click(TObject *Sender)
{
TRzComboBox *rcbx = dynamic_cast <TRzComboBox *>(Sender);
if (!rcbx || rcbx->ItemIndex == -1) return;

bool bChecked = bool(rcbx->Items->Objects[rcbx->ItemIndex]);
rcbx->Items->Objects[rcbx->ItemIndex] = (TObject *)!bChecked;
}


修正版的效果图:
wg961423 2009-06-21
  • 打赏
  • 举报
回复
是的,以“,”分割。
ccrun.com 2009-06-21
  • 打赏
  • 举报
回复
你是想把当前Check的所有项目显示在ComboBox的Edit中?
我先确定你的需求,再给你写相应的代码.
wg961423 2009-06-21
  • 打赏
  • 举报
回复
to 妖哥:

先感谢一下你的代码,不过还有点问题,就是选择后的显示,我在你的代码上加了一点,显示的东东是一闪就没有了,这个是为什么?请帮我看看:


void __fastcall TForm1::RzComboBox1Click(TObject *Sender)
{
TRzComboBox *rcbx = dynamic_cast <TRzComboBox *>(Sender);
if (!rcbx) return;

bool bChecked = bool(rcbx->Items->Objects[rcbx->ItemIndex]);
rcbx->Items->Objects[rcbx->ItemIndex] = (TObject *)!bChecked;

AnsiString Str;
for(int i=0;i<RzComboBox1->Items->Count;i++)
{
if(bool(rcbx->Items->Objects[i]))
{
if(Str=="")
Str=rcbx->Items->Strings[i];
else
Str+=","+rcbx->Items->Strings[i];
}
}
rcbx->ItemIndex=-1;
rcbx->Canvas->TextOutA(2,2,Str);;

}
ccrun.com 2009-06-21
  • 打赏
  • 举报
回复
我来了!!!
以下代码虽然是针对Raize组件中的RzComboBox写的,但是对于TComboBox同样适用,只作一些很小的修改就可以了
在Form上添加一个RzComboBox,并在其OnDrawItem和OnClick事件添加以下代码:
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
RzComboBox1->Items->AddObject("111", (TObject *)true);
RzComboBox1->Items->AddObject("222", (TObject *)true);
RzComboBox1->Items->AddObject("333", (TObject *)false);
RzComboBox1->Items->AddObject("444", (TObject *)true);
RzComboBox1->Items->AddObject("555", (TObject *)false);

RzComboBox1->Style = csOwnerDrawFixed;
RzComboBox1->ItemHeight = 18;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RzComboBox1DrawItem(TWinControl *Control,
int Index, TRect &Rect, TOwnerDrawState State)
{
TRzComboBox *rcbx = dynamic_cast <TRzComboBox *>(Control);
if (!rcbx) return;

// 如果当前项处于选择状态
if (State.Contains(odSelected))
// 或焦点状态或者是组合框的编辑状态
// || State.Contains(odSelected) || State.Contains(odComboBoxEdit))
{
// 以高亮色填充背景
rcbx->Canvas->Brush->Color = TColor(0x00FF9933);
rcbx->Canvas->FillRect(Rect);
}
else
{
// 非选中项的背景色填充
rcbx->Canvas->Brush->Color = rcbx->Color;
rcbx->Canvas->FillRect(Rect);
}

// 判断当前项的Check状态并决定是否绘制Check图像
bool bChecked = bool(rcbx->Items->Objects[Index]);
if (bChecked)
{
RECT rctButton =
{
Rect.Left + 2,
Rect.Top + 2,
Rect.Left + RzComboBox1->ItemHeight - 2,
Rect.Top + RzComboBox1->ItemHeight - 2
};

// 63 63 72 75 6E 2E 63 6F 6D
DrawFrameControl(rcbx->Canvas->Handle,
&rctButton,
DFC_BUTTON,
DFCS_CHECKED | DFCS_FLAT); // DFCS_BUTTONCHECK
}

// 字体颜色
rcbx->Canvas->Font->Color = clBlack;

// 绘出项目文本
rcbx->Canvas->TextOutA(Rect.Left + RzComboBox1->ItemHeight,
Rect.Top + (Rect.Height() - rcbx->Canvas->TextHeight("A")) / 2,
rcbx->Items->Strings[Index]);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RzComboBox1Click(TObject *Sender)
{
TRzComboBox *rcbx = dynamic_cast <TRzComboBox *>(Sender);
if (!rcbx) return;

bool bChecked = bool(rcbx->Items->Objects[rcbx->ItemIndex]);
rcbx->Items->Objects[rcbx->ItemIndex] = (TObject *)!bChecked;
}


效果图在这里:
futurecn 2009-06-20
  • 打赏
  • 举报
回复
帮顶一下
wg961423 2009-06-19
  • 打赏
  • 举报
回复
用Object来存放Check状态,这个我会,但显示Check框不会啊,老大能不能给点画框的代码?
ccrun.com 2009-06-19
  • 打赏
  • 举报
回复
可以用RzComboBox->Items的Object来存放Check状态,至于每一项前面显示Check框,可以在自画事件中,用API:DrawFrameControl来实现.
时间关系我就不写详细代码了.
周药师 2009-06-19
  • 打赏
  • 举报
回复
用RzChecklistBox进行多选吧
xabcxyz 2009-06-19
  • 打赏
  • 举报
回复
还不如自己用RzEdit, RzChecklistBox, RzButton自己组合一下.

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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