// MyListCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "MyListCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl
CMyListCtrl::CMyListCtrl()
{
m_pFont=new CFont();
m_pFont->CreatePointFont(90,_T("Arial"));
m_bOverImage = FALSE;
m_bOverVedio = FALSE;
m_bOverMobile = FALSE;
m_hTailIconA = NULL;
m_hTailIconB = NULL;
m_hTailIconC = NULL;
m_hBackBitmap = NULL;
m_hDll = AfxLoadLibrary(".\\sqDll\\GeneralTools.dll");
}
CMyListCtrl::~CMyListCtrl()
{
delete m_pFont;
if(m_hTailIconA)
::DestroyIcon(m_hTailIconA);
if(m_hTailIconB)
::DestroyIcon(m_hTailIconB);
if(m_hTailIconC)
::DestroyIcon(m_hTailIconC);
if(m_hBackBitmap)
DeleteObject(m_hBackBitmap);
if(m_hDll)
AfxFreeLibrary(m_hDll);
}
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CMyListCtrl)
ON_WM_PAINT()
ON_WM_DRAWITEM()
ON_WM_MOUSEMOVE()
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
ON_WM_ERASEBKGND()
ON_WM_VSCROLL()
ON_WM_HSCROLL()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyListCtrl message handlers
void CMyListCtrl::OnPaint()
{
CPaintDC dc(this);
CRect rcClip, rcClient;
dc.GetClipBox( &rcClip );
GetClientRect(&rcClient);
// Create a compatible memory DC
CDC memDC;
if(!memDC.CreateCompatibleDC( &dc ))
return;
// Select a compatible bitmap into the memory DC
CBitmap bitmap, bmpImage;
if(!bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height()))
{
memDC.DeleteDC();
return;
}
CBitmap *OldBitmap = memDC.SelectObject(&bitmap );
memDC.BitBlt(rcClient.left,rcClient.top,rcClient.Width(), rcClient.Height(),&dc,rcClient.left,rcClient.top,SRCCOPY);
// First let the control do its default drawing.
//CListCtrl::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
if( m_hBackBitmap )
{
DrawBitmap(m_hDll,&memDC,m_hBackBitmap,rcClient);
}
//DrawItem here
int nItemCount = GetItemCount();
int nItem = 0;
CRect rcItem,rcText,rcIcon;
POINT pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
while ((nItem < nItemCount) && (nItem >=0))
{
GetItemRect(nItem,rcItem, LVIR_BOUNDS); //get Rectangle of the icon and Lable
GetItemRect(nItem,rcText, LVIR_LABEL);
GetItemRect(nItem,rcIcon, LVIR_ICON);
//对非在线用户的图像进单色处理
DWORD nStyle = GetItemData(nItem);
//if (!(nStyle & TVS_ONLINEUSER))
//{
CImageList* pImageList=NULL;
pImageList = GetImageList(LVSIL_SMALL);
if(pImageList !=NULL)
{
HICON hIcon=NULL;
hIcon = pImageList->ExtractIcon(nItem);
HBITMAP hbitmap,hBitmapMask;
ICONINFO* iconinfo = new ICONINFO;
if(::GetIconInfo(hIcon, iconinfo))
{
hbitmap = iconinfo->hbmColor;
hBitmapMask = iconinfo->hbmMask;
if (!(nStyle & TVS_ONLINEUSER))
hbitmap = BitmapColorToGray(m_hDll,&memDC,hbitmap);
//hbitmap = (HBITMAP) CopyImage(hbitmap, IMAGE_BITMAP,0, 0,LR_COPYDELETEORG|LR_MONOCHROME);
DrawBitmap(m_hDll, &memDC,hbitmap,rcIcon);
DeleteObject(hbitmap);
DeleteObject(hBitmapMask);
}
delete iconinfo;
::DestroyIcon(hIcon);
}
//}
//对图像进行加边框处理
CBrush *pOldBrush = (CBrush*) memDC.SelectStockObject(NULL_BRUSH);
CPen imagePen;
if(rcIcon.PtInRect(pt))
{
imagePen.CreatePen(PS_SOLID, 2, RGB(192, 192, 200));
}
else
{
imagePen.CreatePen(PS_SOLID, 1, RGB(0, 0, 200));
}
CPen* pOldPen = memDC.SelectObject(&imagePen);
CRect rcImage(rcIcon);
rcImage.DeflateRect(1,1);
memDC.RoundRect(rcIcon,CPoint(10,10));
memDC.SelectObject(pOldPen);
memDC.SelectObject(pOldBrush);
imagePen.DeleteObject();
//文本输出
CRect rcNewText(rcText);
CString strText = GetItemText(nItem,0);
CSize size = memDC.GetTextExtent(strText);
rcNewText.top = rcNewText.top-2;
rcNewText.right = rcNewText.right +3;
if(!m_hBackBitmap)
memDC.BitBlt(rcNewText.left,rcNewText.top,rcNewText.Width()+2,rcNewText.Height()+2,&dc,rcNewText.left,rcNewText.top,SRCCOPY);
if(rcItem.PtInRect(pt))
{
memDC.SetTextColor(RGB(0,0,255));
}
else
{
memDC.SetTextColor(RGB(0,0,0));
}
memDC.SetBkMode(TRANSPARENT);
memDC.SelectObject(m_pFont);
rcNewText.OffsetRect(3,0);
memDC.DrawText(strText,rcNewText,DT_SINGLELINE|DT_LEFT|DT_END_ELLIPSIS);
LUSERITEM userInfo;
GetUserItemInfo(strText,&userInfo);
if(userInfo.szUserID !="")
{
strText = userInfo.szNoticeMsg;
rcNewText.top = rcNewText.top + size.cy + 2;
rcNewText.right = rcClient.right -10;
if(rcNewText.PtInRect(pt))
{
memDC.SetTextColor(RGB(10,255,10));
}
else
{
memDC.SetTextColor(GetSysColor(COLOR_BTNSHADOW));
}
memDC.DrawText(strText,rcNewText,DT_SINGLELINE|DT_LEFT|DT_END_ELLIPSIS);
}
//Draw Vedio and Mobile ICON
CRect rcVideo(rcText);
rcVideo.left = rcClient.right - 20;
rcVideo.right = rcVideo.left +14;
rcVideo.top = rcVideo.top + 2;
rcVideo.bottom = rcVideo.top + 14;
if ( (nStyle & TVS_VIDEO) && (m_hTailIconA !=NULL) )
{
if(!m_hBackBitmap)
memDC.FillSolidRect(rcVideo,RGB(255,255,255));
::DrawIconEx(memDC,rcVideo.left,rcVideo.top,m_hTailIconA,
12,12,0,NULL,DI_NORMAL);
if( rcVideo.PtInRect(pt) )
{
memDC.Draw3dRect(rcVideo,GetSysColor(COLOR_BTNSHADOW),GetSysColor(COLOR_BTNSHADOW));
m_bOverVedio =TRUE;
}
else
{
m_bOverVedio =FALSE;
}
}
CRect rcMobile(rcVideo);
rcMobile.OffsetRect(-16,0);
if ( (nStyle & TVS_MOBILEMSG) && (m_hTailIconB !=NULL) )
{
if(!m_hBackBitmap)
memDC.FillSolidRect(rcMobile,RGB(255,255,255));
::DrawIconEx(memDC,rcMobile.left+1,rcMobile.top+1,m_hTailIconB,
12,12,0,NULL,DI_NORMAL);
if( rcMobile.PtInRect(pt) )
{
memDC.Draw3dRect(rcMobile,GetSysColor(COLOR_BTNSHADOW),GetSysColor(COLOR_BTNSHADOW));
m_bOverMobile =TRUE;
}
else
{
m_bOverMobile =FALSE;
}
}
///////////////
nItem = GetNextItem(nItem,LVNI_ALL);
}
//DrawItem end
dc.BitBlt( rcClip.left, rcClip.top,
rcClient.Width(),
rcClient.Height(),
&memDC,
rcClip.left, rcClip.top, SRCCOPY );
//memDC.SelectObject(OldBitmap);
bitmap.DeleteObject();
memDC.DeleteDC();
}
void CMyListCtrl::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
CListCtrl::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
Invalidate(FALSE);
CListCtrl::OnMouseMove(nFlags, point);
}
void CMyListCtrl::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
ModifyStyle(0, BS_OWNERDRAW);
CListCtrl::PreSubclassWindow();
}
void CMyListCtrl::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct)
{
}
int CMyListCtrl::InsertItem(int nItem, LPCTSTR szItemText, int nImageIndex, LUSERITEM* UserInfo)
{
DEQUELVITEM* pDeqListItem = &m_DequeList;
if(UserInfo)
pDeqListItem ->push_back(*UserInfo);
nItem = CListCtrl::InsertItem(nItem,szItemText,nImageIndex);
return nItem;
}
void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMTVCUSTOMDRAW* pListHDR = (NMTVCUSTOMDRAW*)pNMHDR;
DWORD dwDrawStage;
*pResult = CDRF_DODEFAULT;
dwDrawStage = pListHDR->nmcd.dwDrawStage;
if(dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if(dwDrawStage == CDDS_ITEMPREPAINT)
{
}
}
BOOL CMyListCtrl::GetUserItemInfo(LPCTSTR szItemText,LUSERITEM* userInfo)
{
ASSERT(
商业编程-源码-让你的软件界面更漂亮(六)-- 仿Q.zip
版权申诉
170 浏览量
2022-06-23
11:02:59
上传
评论
收藏 11KB ZIP 举报
programxh
- 粉丝: 17
- 资源: 1万+
最新资源
- 三菱PLC(Mitsubishi)通讯协议的C#实现,支持FX、Q系列的ASCII-3E、BIN-3E、FX串口格式
- 五一建模20242024
- rainy-day.jpg
- IMG_20240501_171218.jpg
- Swift-内购封装swift版本
- 经典CNN网络之ResNet 图像分类网络实战项目:7种小麦叶片病害分类(迁移学习)
- Java毕设之ssm010基于ssm的新能源汽车在线租赁管理系统+vue.rar
- Java毕设之ssm009毕业生就业信息统计系统+vue.rar
- Java毕设之ssm008医院门诊挂号系统+jsp.rar
- Java毕设之ssm007亚盛汽车配件销售业绩管理统+jsp.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈