List控件上的4态Checkbox

  
MFC ListCtrl提供这样的属性:可以在每一行的第一列绑定一个Checkbox(set LVS_EX_CHECKBOXES style)。一般情况下,Checkbox 显示2个状态: Checked/ UnChecked。
如果有这样的需求:
ListCtrl要求4 个状态的Checkbox,多加Enable/Disable属性。
目前来说,我没有找到方法来取得这些Checkbox对象句柄,对其进行Enable/Disable操作。但是发现
http://www.codeproject.com/listctrl/xlistctrl.asp 有通过OnCustomDraw来实现
// ------------draw the ourside checkbox region---------------------/
// COLORREF crBkgnd: get current item/subitem bakcgroud
pDC -> FillSolidRect( & rect, crBkgnd); 
 
// ------------calculate the checkbox rect ---------------------/
CRect chkboxrect;
chkboxrect 
=  rectItem;
chkboxrect.bottom 
-=   1 ;
chkboxrect.left 
+=   9 ;        
chkboxrect.right 
=  chkboxrect.left  +  chkboxrect.Height();     //  width = height

//  center the checkbox 
chkboxrect.left  =  rect.left  +  rect.Width() / 2   -  chkboxrect.Height() / 2   -   1 ;
chkboxrect.right 
=  chkboxrect.left  +  chkboxrect.Height();

// ------------draw the inside checkbox region---------------------/
pDC -> FillSolidRect( & chkboxrect, ::GetSysColor(COLOR_WINDOW));
 
// ------------draw the checkbox frame border ---------------------/
COLORREF clrFrame;
if  (pItemData[ 0 ].bEnabled) 
{
    clrFrame 
= RGB(51,102,153);  //color for (Checked ||UnChecked) & enable
}

else
    clrFrame 
=  RGB( 225 , 225 , 225 );  // color for(Checked|| UnChecked) & Disable
CBrush brush(clrFrame);
pDC
-> FrameRect( & chkboxrect,  & brush);  // fill frame


// ------------draw the check mark---------------------/
int  x  =  chkboxrect.left  +   9 ;
int  y  =  chkboxrect.top  +   3 ;
int  i;
for  (i  =   0 ; i  <   4 ; i ++ )
{
    pDC
->MoveTo(x, y);
    pDC
->LineTo(x, y+3);
    x
--;
    y
++;
}

for  (i  =   0 ; i  <   3 ; i ++ )
{
    pDC
->MoveTo(x, y);
    pDC
->LineTo(x, y+3);
    x
--;
    y
--;
}

你可能感兴趣的:(List控件上的4态Checkbox)