自绘CCheckListBox,那个checkbox还是显露出来好像,我是在DrawItem里绘制的
解决方案 »
- 高分求一个ListView_GetItemRect问题
- 在ListCtrl中,如何能做到始终有item处于选择状态?
- GetWindowLongPtr这个函数怎么会没有定义呢?Windows核心编程中的例子
- 请教一个比较普通的问题:如何获得服务管理器中所有服务列表
- 请问openurl会造成内存泄露吗?
- 请教问题,谢谢!!
- 关于内存映射文件的问题,很奇怪……………………
- 大家讨论一下,搜索引擎是什么原理???
- 已知pdf文件的地址,如何打印pdf
- 请问:程序中怎样预先拦截一切鼠标/键盘信息?
- unsigned char 对象 new
- 关于WM_TIMER,WM_MOUSEMOVE消息的问题,向各位高手求解
在DrawItem里绘制那个默认的checkbox还是会显露出来
想自己绘制都不行
猜一下吧
1、checkbox是不是有句柄的控件所以不受父窗口绘制的影响,是不是应该子类化
2、在OnPaint中试试,或许可以实现完全自绘
之所以我不想从CListBox直接派生自绘是因为我不想自己来维护那个
每一项的勾选状态
我看了下CCheckListBox的源码,里面在调用DrawItem前会把checkbox画好了
所以在DrawItem画里已经迟了,现在我直接在OnPaint里画,但是遇到一个小的问题
我稍后把源码上传到CSDN资源,大家帮我看看Item选中状态(不是指checkBox的勾选状态)
为什么会是:选中第一项,后面的所有项都同时被着上选中的颜色了。基本代码:void CSkinCheckListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = 20;
}void CSkinCheckListBox::PreSubclassWindow()
{
ModifyStyle(0, LBS_OWNERDRAWFIXED|LBS_HASSTRINGS);
CCheckListBox::PreSubclassWindow();
}BOOL CSkinCheckListBox::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}void CSkinCheckListBox::OnPaint()
{
CPaintDC dc(this);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CBitmap bmp;
CRect rect;
GetClientRect(&rect);
bmp.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
MemDC.SelectObject(&bmp);
MemDC.FillSolidRect(&rect,RGB(255,194,192)); int nFirstIndex = GetTopIndex();
int nItemCount = GetCount();
int nHeight = 0;
int nItemHeight;
CRect rcTemp;
CString strItemText;
int nItemState; CFont font;
VERIFY(font.CreateFont(
12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体"))); // lpszFacename MemDC.SelectObject(&font);
int nSelItem = GetCurSel();
int yPos;
for (int i= nFirstIndex;i<nItemCount&&nHeight< rect.Height(); i++)
{
nHeight += GetItemHeight(i);
GetItemRect(i,&rcTemp);
rcTemp.left = rect.left+2;
rcTemp.right = rect.right;
//选中Item着色
nItemHeight = GetItemHeight(i);
if (i == nSelItem)
{
CRect rc = rcTemp;
rc.bottom = rc.top+nItemHeight;
MemDC.FillSolidRect(&rc,RGB(0,0,255));
}
GetText(i,strItemText);
nItemState = GetCheck(i); //画CheckBox
CImage img;
img.LoadFromResource(AfxGetResourceHandle(),IDB_BITMAP4);
yPos = rcTemp.top+nItemHeight/2 - 5;
img.Draw(MemDC,rcTemp.left,yPos,11,11,nItemState*11,0,11,11); //画文本
rcTemp.left+=13;
MemDC.DrawText(strItemText,&rcTemp,DT_VCENTER|DT_SINGLELINE); } dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
}BOOL CSkinCheckListBox::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
{ switch (message)
{
case WM_DRAWITEM:
ASSERT(pLResult == NULL); // no return value expected
Invalidate(FALSE);
break;
case WM_MEASUREITEM:
ASSERT(pLResult == NULL); // no return value expected
PreMeasureItem((LPMEASUREITEMSTRUCT)lParam);
break;
case WM_COMPAREITEM:
ASSERT(pLResult != NULL); // return value expected
*pLResult = PreCompareItem((LPCOMPAREITEMSTRUCT)lParam);
break;
case WM_DELETEITEM:
ASSERT(pLResult == NULL); // no return value expected
PreDeleteItem((LPDELETEITEMSTRUCT)lParam);
break;
default:
return CListBox::OnChildNotify(message, wParam, lParam, pLResult);
}
return TRUE;
}
//选中Item着色
nItemHeight = GetItemHeight(i);
if (i == nSelItem)
{
CRect rc = rcTemp;
rc.bottom = rc.top+nItemHeight;
MemDC.FillSolidRect(&rc,RGB(0,0,255));
}上面这段代码有神马问题? 难道是这个rc超出了范围?