用VC实现自定义LISTBOX控件

翻译|其它|编辑:郝浩|2005-01-20 09:23:00.000|阅读 1996 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


下午在用EVC在ARM开发板上开发应用程序,需要将LISTBOX控件上的项目放大显示,我先用VC模拟出来,但是很不幸,EVC上LISTBOX不支持OWNER DRAW。不过还好,总算在VC上做了点东西,下面把过程记录下来:

1、在对话框中添加一个LISTBOX控件,将其属性改为“FIXED”(属性说明请参阅MSDN)。
2、建立一个断承CListBox的类CCustomListBox,重载(Override)它的几个函数。
3、在CCustomListBox在PreSubclassWindow函数中添加如下代码:
CRect rect;
GetClientRect(rect);
this->SetItemHeight(-1,rect.Height()/4); //将LISTBOX的子项目高度设置为LISTBOX高度的1/4
4、如果LISTBOX控件选择了“FIXED”属性后不做任何修改,那么用AddString等函数添加的子项将不会被系统自动显示,原因是用户选择了自绘属性。这个属性由CCustomListBox里的DrawItem和MesureItem函数完成。DrawItem用来绘制子项目,MesureItem用来修改项目的一些属性(一般不用更改)。在DrawItem里添加如下代码:
COLORREF clrItemText;

switch ( lpDIS->itemAction ) //lpDIS为一个LPMEASUREITEMSTRUCT(记录控件信息)

{
case ODA_SELECT:
case ODA_DRAWENTIRE:

// Is the item selected?
if ( lpDIS->itemState & ODS_SELECTED )
{
clrItemText = GetSysColor( COLOR_HIGHLIGHTTEXT );
// Clear the rectangle
FillRect( lpDIS->hDC,
&lpDIS->rcItem,
(HBRUSH)(COLOR_ACTIVECAPTION+1) );
}
else
{
clrItemText = GetSysColor( COLOR_WINDOWTEXT );
// Clear the rectangle
FillRect( lpDIS->hDC,
&lpDIS->rcItem,
(HBRUSH)(COLOR_WINDOW+1) );
}
}


CDC dc;
dc.Attach(lpDIS->hDC);
CRect rectFull = lpDIS->rcItem;
CRect rect = rectFull;
rect.left = rect.Width();
CRect rect2 = rectFull;
rect2.right = rect.left - 1;
UINT nIndex = lpDIS->itemID;

if (nIndex != (UINT) -1)
{

LOGFONT lf;

dc.GetCurrentFont()->GetLogFont(&lf);

CFont font, *pOldFont;

lf.lfCharSet=134;

lf.lfHeight=25;

lf.lfWidth=0;

strcpy(lf.lfFaceName, "隶书");

font.CreateFontIndirect(&lf);

pOldFont=dc.SelectObject(&font);

CString sss;
this->GetText(nIndex,sss);

dc.SetBkMode(TRANSPARENT);
dc.DrawText(sss,CRect(rect2.left+3,rect2.top+3,
rect2.right-3,rect2.bottom+3),
DT_LEFT | DT_SINGLELINE);
}
dc.Detach();

完成上述步骤后,即可看见更改后的LISTBOX,另外按钮等其他控件步骤与思想是大同小异的。
 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP