下午在用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,另外按钮等其他控件步骤与思想是大同小异的。

|