// FriendList.cpp : 实现文件
//
#include "stdafx.h"
#include "FriendList.h"
#include "resource.h"
#define ITEMOFFSET 5 //元素偏移
#define Height 60 //图像高度
#define Width 125 //图像宽度
// CFriendList
IMPLEMENT_DYNAMIC(CFriendList, CListCtrl)
CFriendList::CFriendList()
:m_bmpUnSel2(NULL)
{
numFlag = 0;
}
CFriendList::~CFriendList()
{
for (int i=0; i<theApp.m_RoomsNum; ++i)
{
m_bmpUnSel2[i].DeleteObject();
}
}
BEGIN_MESSAGE_MAP(CFriendList, CListCtrl)
ON_WM_LBUTTONDBLCLK()
ON_WM_MEASUREITEM_REFLECT()
ON_WM_LBUTTONDOWN()
ON_WM_KEYDOWN()
ON_WM_RBUTTONDOWN()
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CFriendList::OnNMCustomdraw)
ON_WM_NCCALCSIZE()
ON_WM_VSCROLL()
END_MESSAGE_MAP()
void CFriendList::PreSubclassWindow()
{
CDC dcMem;
CClientDC dc(this);
CBrush hBrushBack,hBrushGray;
CPen hPen,hPenWrite;
hBrushBack.CreateSolidBrush(RGB(255,255,255));
hBrushGray.CreateSolidBrush(GRAY_BRUSH);
hPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
hPenWrite.CreatePen(PS_SOLID,1,RGB(255,255,255));
CFont font;
font.CreatePointFont(90,TEXT("宋体"),NULL);
// 设置列表项高度
m_bmpPortrait.CreateBitmap(1,Height + 2 * ITEMOFFSET,0,0,NULL);
m_imgPortrait.Create(1,Height + 2 * ITEMOFFSET - 1,ILC_COLOR24,1,1);
m_imgPortrait.Add(&m_bmpPortrait,RGB(11,11,11));
SetImageList(&m_imgPortrait,2);
CRect rect;
GetWindowRect(&rect);
InsertColumn(0,TEXT("PID"),LVCFMT_LEFT);
SetColumnWidth(0,rect.right - rect.left-4);
SetExtendedStyle( LVS_EX_FULLROWSELECT
|LVS_OWNERDRAWFIXED
|LVS_EX_SUBITEMIMAGES
|LBS_OWNERDRAWVARIABLE);
CListCtrl::PreSubclassWindow();
hBrushBack.DeleteObject();
hBrushGray.DeleteObject();
hPen.DeleteObject();
hPenWrite.DeleteObject();
}
void CFriendList::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rectBottom,rectList;
GetItemRect(GetItemCount()-1,&rectBottom,LVIR_BOUNDS);
GetWindowRect(&rectList);
LVHITTESTINFO LVHTestInfo;
LVHTestInfo.pt = point;
HitTest(&LVHTestInfo);
int nRow=LVHTestInfo.iItem; //行数
SubItemHitTest(&LVHTestInfo);
int nCol=LVHTestInfo.iSubItem; //列数
if (nRow == -1)
{
CListCtrl::OnLButtonDblClk(nFlags, point);
return;
}
CListCtrl::OnLButtonDblClk(nFlags, point);
}
void CFriendList::AddNewUser(int index, CString str )
{
//int nCount = GetItemCount();
HBITMAP bitmap;
try
{
if (index == 0)
{
if (m_bmpUnSel2 != NULL)
{
delete[] m_bmpUnSel2;
m_bmpUnSel2 = NULL;
}
numFlag = 0;
int m = theApp.m_RoomsNum;
m_bmpUnSel2 = new CBitmap[m];
}
m_bmpUnSel2[numFlag].Detach();
//从文件路径加载图片
bitmap =(HBITMAP)::LoadImage(NULL,_T("res\\temp.bmp"), IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION|LR_LOADFROMFILE|LR_DEFAULTSIZE);
if(!m_bmpUnSel2[numFlag].Attach(bitmap))
{
MessageBox(_T("图片加载失败"));
}
numFlag ++;
}
catch(...)
{
MessageBox(_T("图片加载失败"));
}
InsertItem(index,str,0);
}
void CFriendList::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = Height;
}
void CFriendList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
int m_Position = 0;
m_Position = GetScrollPos(SB_VERT);
// SCROLLINFO sinfo;
// sinfo.cbSize = sizeof(SCROLLINFO);
// sinfo.fMask = SIF_ALL;
// GetScrollInfo(SB_VERT, &sinfo);
// int min = sinfo.nMin;
// int max = sinfo.nMax;
if (numFlag == theApp.m_RoomsNum)
{
numFlag = 0;
}
CDC *pDc = CDC::FromHandle(lpDrawItemStruct->hDC);
pDc->SetBkMode(TRANSPARENT);
/////////////////////////////////////////
LVITEM lvi = {0};
lvi.mask = LVIF_STATE;//|LVIF_IMAGE;
lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED ;
lvi.iItem = lpDrawItemStruct->itemID;
BOOL bGet = GetItem(&lvi);
BOOL bHighlight =((lvi.state & LVIS_DROPHILITED)||((lvi.state & LVIS_SELECTED) &&
((GetFocus() == this)|| (GetStyle() & LVS_SHOWSELALWAYS))));
// 画文本背景
CRect rcBack = lpDrawItemStruct->rcItem;
pDc->SetBkMode(TRANSPARENT);
if( bHighlight ) //如果被选择
{
COLORREF ref=RGB(0,0,0);
pDc->SetTextColor(ref);
pDc->SetBkColor(ref);
pDc->FillRect(rcBack, &CBrush(0xFCF3EC));//252,243,236
}
else
{
pDc->SetTextColor(0x000000);
pDc->FillRect(rcBack, &CBrush(0xFFFFFF));
}
/////////////////////////////
CRect rect = lpDrawItemStruct->rcItem;
numFlag = (int)(rect.top / 70) + m_Position;
CDC dcMem;
dcMem.CreateCompatibleDC(pDc);
pDc->SetTextColor(RGB(77,77,77));
CBitmap *pOldBitmap = dcMem.SelectObject(&m_bmpUnSel2[numFlag]);
BITMAP bmp;
m_bmpUnSel2[numFlag].GetBitmap(&bmp);
//原图片的宽、高
int s_Width = bmp.bmWidth;
int s_Height = bmp.bmHeight;
//pDc->BitBlt(rect.left + 1,rect.top + ITEMOFFSET,Width,Height,&dcMem,0,0,SRCCOPY);
//将原图片缩小后进行显示
pDc -> SetStretchBltMode(HALFTONE);
pDc -> StretchBlt(rect.left + 1,rect.top + ITEMOFFSET,Width,Height,&dcMem,0,0,
s_Width,s_Height,SRCCOPY);
CString tmp;
tmp = GetItemText(lpDrawItemStruct->itemID,0);
if (tmp.GetLength() >= 5)//房间名称多于5个字则截取
{
tmp = tmp.Left(5) + TEXT("...");
}
rect.left += Width + 2 * ITEMOFFSET;
rect.top += 2 * ITEMOFFSET;
pDc->DrawText(tmp,rect,DT_MODIFYSTRING/*DT_LEFT | DT_MODIFYSTRING | DT_END_ELLIPSIS*/);
}
void CFriendList::OnLButtonDown(UINT nFlags, CPoint point)
{
CListCtrl::OnLButtonDown(nFlags, point);
}
void CFriendList::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CFriendList::OnRButtonDown(UINT nFlags, CPoint point)
{
return;
CListCtrl::OnRButtonDown(nFlags, point);
}
CString CFriendList::GetStringLeft( CString &str, int nLeft )
{
CString sRet=_T("");
int nPos=0;
while(nPos<str.GetLength() && nLeft)
{
if(str.GetAt(nPos)<0){
sRet=sRet+str.GetAt(nPos)+str.GetAt(nPos+1);
nPos++;
}else
sRet+=str.GetAt(nPos);
nPos++;
nLeft--;
}
return sRet;
}
void CFriendList::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
//LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: Add your control notification handler code here
//*pResult = 0;
//NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
// Take the default processing unless we set this to something else below.
//*pResult = CDRF_DODEFAULT;
//设置listctrl的格式,由格子等
//SetExtendedStyle(GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
}
void CFriendList::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
// TODO: Add your message handler code here and/or call default
ModifyStyle(WS_HSCROLL,0,0);//禁止水平滚动条
CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp);
}
//void CFriendList::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
//{
// // TODO: Add your message handler code here and/or call default
//
// CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
//}
- 1
- 2
- 3
前往页