自绘ListBox,却怎么也不成功,运行程序后列表框没有反应,请高手看看ListBox属性 Owner draw:Variable
自定义类CMyListBox:CListBox
部分代码如下:
typedef struct
{
UINT nImageID;
char strText[64];
} CONTENT_ITEMS, *pCONTENT_ITEMS;void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
if((m_pContents == NULL) || (m_nNumItems == 0)) {
return ;
} CDC * pDC = CDC::FromHandle(lpDIS->hDC); CRect rcItem(lpDIS->rcItem);
CRect rClient(rcItem);
CRect rText;
CPoint Pt(((rcItem.Width() - 32) /2 ), rcItem.top + 15);
pCONTENT_ITEMS pContents = &m_pContents[lpDIS->itemID]; CBitmap * bmp = new CBitmap;
bmp->LoadBitmap(pContents->nImageID); pDC->SetBkMode(TRANSPARENT); rClient.DeflateRect(5,10);
rcItem.CopyRect(rClient);
rText.CopyRect(rClient);
rText.top += 35; if (lpDIS->itemAction & ODA_DRAWENTIRE)
{
DrawIcon(pDC,Pt,bmp);
pDC->DrawText(pContents->strText, rText, DT_CENTER|DT_WORDBREAK);
} if (m_bLBDown)
{
Pt.x += 2;
Pt.y += 2;
rcItem.OffsetRect(2,2);
rText.OffsetRect(2,2);
} if ((lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
if(m_bHilight)
{
pDC->FillSolidRect(rClient,RGB(225,225,255); if (m_bLBDown)
pDC->Draw3dRect(rClient,GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_BTNHIGHLIGHT));
else
pDC->Draw3dRect(rClient,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_3DSHADOW));
} DrawIcon(pDC,Pt,bmp);
pDC->DrawText(pContents->strText, rText, DT_CENTER|DT_WORDBREAK);
} if (!(lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & ODA_SELECT))
{
pDC->FillSolidRect(rClient,GetSysColor(COLOR_WINDOW));
DrawIcon(pDC,Pt,bmp);
pDC->DrawText(pContents->strText, rText, DT_CENTER|DT_WORDBREAK);
}
}void CMyListBox::OnTimer(UINT nIDEvent)
{
BOOL bOutSide;
CRect rItem;
CPoint CurPt;
CRect rWindow;
int nIndex; GetWindowRect(rWindow);
GetCursorPos(&CurPt); if (!rWindow.PtInRect(CurPt))
{
if (!m_bLBDown)
{
SetCurSel(-1);
m_bHilight = false;
} KillTimer(1);
return;
} m_bHilight = true;
nIndex = ItemFromPoint(m_Point, bOutSide); if (nIndex != GetCurSel() && !bOutSide)
SetCurSel(nIndex);
}void CMyListBox::DrawIcon(CDC *pDC, CPoint pt, CBitmap *bmp)
{
CDC dcMemory;
CBitmap* pOldBmp ; dcMemory.CreateCompatibleDC(pDC);
pOldBmp = dcMemory.SelectObject(bmp); pDC->BitBlt(pt.x, pt.y,
32, 32, &dcMemory, 0, 0, SRCCOPY);
dcMemory.SelectObject(pOldBmp);
}
自定义类CMyListBox:CListBox
部分代码如下:
typedef struct
{
UINT nImageID;
char strText[64];
} CONTENT_ITEMS, *pCONTENT_ITEMS;void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
if((m_pContents == NULL) || (m_nNumItems == 0)) {
return ;
} CDC * pDC = CDC::FromHandle(lpDIS->hDC); CRect rcItem(lpDIS->rcItem);
CRect rClient(rcItem);
CRect rText;
CPoint Pt(((rcItem.Width() - 32) /2 ), rcItem.top + 15);
pCONTENT_ITEMS pContents = &m_pContents[lpDIS->itemID]; CBitmap * bmp = new CBitmap;
bmp->LoadBitmap(pContents->nImageID); pDC->SetBkMode(TRANSPARENT); rClient.DeflateRect(5,10);
rcItem.CopyRect(rClient);
rText.CopyRect(rClient);
rText.top += 35; if (lpDIS->itemAction & ODA_DRAWENTIRE)
{
DrawIcon(pDC,Pt,bmp);
pDC->DrawText(pContents->strText, rText, DT_CENTER|DT_WORDBREAK);
} if (m_bLBDown)
{
Pt.x += 2;
Pt.y += 2;
rcItem.OffsetRect(2,2);
rText.OffsetRect(2,2);
} if ((lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
if(m_bHilight)
{
pDC->FillSolidRect(rClient,RGB(225,225,255); if (m_bLBDown)
pDC->Draw3dRect(rClient,GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_BTNHIGHLIGHT));
else
pDC->Draw3dRect(rClient,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_3DSHADOW));
} DrawIcon(pDC,Pt,bmp);
pDC->DrawText(pContents->strText, rText, DT_CENTER|DT_WORDBREAK);
} if (!(lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & ODA_SELECT))
{
pDC->FillSolidRect(rClient,GetSysColor(COLOR_WINDOW));
DrawIcon(pDC,Pt,bmp);
pDC->DrawText(pContents->strText, rText, DT_CENTER|DT_WORDBREAK);
}
}void CMyListBox::OnTimer(UINT nIDEvent)
{
BOOL bOutSide;
CRect rItem;
CPoint CurPt;
CRect rWindow;
int nIndex; GetWindowRect(rWindow);
GetCursorPos(&CurPt); if (!rWindow.PtInRect(CurPt))
{
if (!m_bLBDown)
{
SetCurSel(-1);
m_bHilight = false;
} KillTimer(1);
return;
} m_bHilight = true;
nIndex = ItemFromPoint(m_Point, bOutSide); if (nIndex != GetCurSel() && !bOutSide)
SetCurSel(nIndex);
}void CMyListBox::DrawIcon(CDC *pDC, CPoint pt, CBitmap *bmp)
{
CDC dcMemory;
CBitmap* pOldBmp ; dcMemory.CreateCompatibleDC(pDC);
pOldBmp = dcMemory.SelectObject(bmp); pDC->BitBlt(pt.x, pt.y,
32, 32, &dcMemory, 0, 0, SRCCOPY);
dcMemory.SelectObject(pOldBmp);
}
你的ListBox属性是不是Owner draw属性没有更改~~~