代码简写

MyListBox.h

class CUseListBox : public CListBox
{
typedef struct _ListBox_Data
{
CString strAppend; //第二排附加数据
LPTSTR hIcon; //图标
_ListBox_Data()
{
strAppend = _T("");
hIcon = NULL;
}
} List_AppendData;
public: virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/); virtual void MeasureItem(LPMEASUREITEMSTRUCT /*lpMeasureItemStruct*/);
void InsertStr(CString str,int iIndex,CString strAppend,LPTSTR icon);
afx_msg void OnDestroy(); afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
}

MyListBox.cpp

BEGIN_MESSAGE_MAP(CUseListBox, CListBox)
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP() void CUseListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (GetCount() == )
{
return;
}
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
List_AppendData * pData =(List_AppendData *) GetItemDataPtr(lpDrawItemStruct->itemID); //获取列表数据
CString str;
GetText(lpDrawItemStruct->itemID,str);
if (lpDrawItemStruct->itemAction | ODA_SELECT && lpDrawItemStruct->itemState & ODS_SELECTED)
{
CBrush t_brush1;
t_brush1.CreateSolidBrush(RGB(,,));
dc.FillRect(&lpDrawItemStruct->rcItem,&t_brush1); }
else
{
CBrush t_brush1;
t_brush1.CreateSolidBrush(RGB(,,));
dc.FillRect(&lpDrawItemStruct->rcItem,&t_brush1);
}
//画图标
HICON t_hIcon;
t_hIcon = LoadIcon(AfxGetInstanceHandle(),pData->hIcon);
DrawIcon(dc.m_hDC,,lpDrawItemStruct->rcItem.top+,t_hIcon);
//第一排字体
HFONT t_hFont= CreateFont(,,,,,,,,,,,,FF_MODERN,_T("宋体"));
dc.SelectObject(t_hFont);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(,,));
dc.TextOut(,lpDrawItemStruct->rcItem.top+,str,str.GetLength());
//第二排字体
HFONT t_hFont1= CreateFont(,,,,,,,,,,,,FF_MODERN,_T("宋体"));
dc.SelectObject(t_hFont1);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(,,));
str = pData->strAppend;
dc.TextOut(,lpDrawItemStruct->rcItem.top+,str,str.GetLength());
//底部边线
CPen t_pen(PS_SOLID,,RGB(,,));
dc.SelectObject(t_pen);
dc.MoveTo(,lpDrawItemStruct->rcItem.bottom-);
dc.LineTo(lpDrawItemStruct->rcItem.right,lpDrawItemStruct->rcItem.bottom-); dc.Detach();
} void CUseListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{ // TODO: 添加您的代码以确定指定项的大小
lpMeasureItemStruct->itemHeight = ;
}
void CUseListBox::InsertStr(CString str,int iIndex,CString strAppend,LPTSTR icon)
{
List_AppendData * pData = new List_AppendData;
pData->hIcon = icon;
pData->strAppend = strAppend;
int i = SetItemDataPtr(InsertString(iIndex,str),pData);
}
void CUseListBox::OnDestroy()
{
CListBox::OnDestroy(); // TODO: 在此处添加消息处理程序代码
int iCount = GetCount();
for (int i=; i<iCount; i++)
{
List_AppendData * pData = (List_AppendData *)GetItemDataPtr(i);
delete pData;
pData = NULL;
}
} BOOL CUseListBox::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 return CListBox::OnEraseBkgnd(pDC);
} void CUseListBox::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 CListBox::OnMouseMove(nFlags, point);
}

调用直接InsertStr就行

我写的加载图片

  CDC* pDC;
pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CBitmap bmp, *pOldBmp;
HBITMAP bitmap;
CDC memDC;
memDC.CreateCompatibleDC(pDC);
if (pCell)
{
CRect rect;
GetCellRect(pCell->dwRow, pCell->dwCol, rect);
if (!pCell->FilePathName ==NULL )
{ BITMAP bm;
HBITMAP hBitmap = (HBITMAP)::LoadImage(
AfxGetInstanceHandle(),
pCell->FilePathName,
IMAGE_BITMAP,
, ,
LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE); bmp.DeleteObject();
bmp.Attach(hBitmap);
bmp.GetObject(sizeof(BITMAP), &bm);
memDC.CreateCompatibleDC(pDC);
pOldBmp =memDC.SelectObject(&bmp); int offH = rect.Height() - bm.bmHeight;
int offW = rect.Width() - bm.bmWidth;
if (offH>)
{
rect.top += offH / ;
rect.bottom -= (offH - offH / );
}
if (offW>)
{
rect.left += offW / ;
rect.right -= (offW - offW / );
}
//显示
pDC->StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, , , \
bm.bmWidth, bm.bmHeight, SRCCOPY); //Clean
memDC.SelectObject(pOldBmp);
bmp.DeleteObject(); }
}
//Clean
memDC.DeleteDC();

做了一下位置调整一般般吧

代码

今天发现里一个非常好用的Listbox自绘类,带不同文字字体和图片,觉得很有必要记下来的更多相关文章

  1. APACHE如何里一个站点绑定多个域名?用ServerAlias

    APACHE2如何里一个站点绑定多个域名?用ServerAlias以前很笨,要使多个域名指向同一站点总是这样写: <VirtualHost *:80>ServerAdmin i@kuigg ...

  2. VS 2017开发ASP.NET Core Web应用过程中发现的一个重大Bug

    今天试着用VS 2017去开发一个.net core项目,想着看看.net core的开发和MVC5开发有什么区别,然后从中发现了一个VS2017的Bug. 首先,我们新建项目,ASP.NET Cor ...

  3. APACHE如何里一个站点绑定多个域名?用ServerAlias servername

    APACHE2如何里一个站点绑定多个域名?用ServerAlias以前很笨,要使多个域名指向同一站点总是这样写: <VirtualHost *:80>ServerAdmin i@kuigg ...

  4. APACHE如何里一个站点绑定多个域名?用ServerAlias 转

    APACHE2如何里一个站点绑定多个域名?用ServerAlias以前很笨,要使多个域名指向同一站点总是这样写:<VirtualHost *:80>ServerAdmin i@kuigg. ...

  5. 排查dubbo接口重复注销问题,我发现了一个巧妙的设计

    背景 我在公司内负责自研的dubbo注册中心相关工作,群里经常接到业务方反馈dubbo接口注销报错.经排查,确定是同一个接口调用了两次注销接口导致,由于我们的注册中心注销接口不能重复调用,调用第二次会 ...

  6. artTemplate里一个比不上jQuery tmpl模板的地方就是放一个数组进去它不会自动循环.

    artTemplate里一个比不上jQuery tmpl模板的地方就是放一个数组进去它不会自动循环.

  7. 发现了一个非常棒的pyqt5的例子集

    发现了一个非常棒的pyqt5的例子集 https://github.com/892768447/PyQt 各种各样的PyQt测试和例子 [Python3.4.4 or Python3.5][PyQt5 ...

  8. Java 读数据库字段时发现的一个现象

    早上发现有一个网名叫“帅!是不需要理由”的一个人,在后台只能看到“帅!是不需要理”,“由”字就是不显示出来. 经过分析发现,在Access数据库中,name这个字段的长度是15,因为我知道Access ...

  9. 发现XMind一个超级牛逼的功能

    本来想要自己手动建立下文件夹的结构图,一不小心发现了一个大惊喜. 比如想要看一下360Downloads文件夹下的文件结构,可以先创建一个名叫360Downloads的主节点,然后把其文件夹下的文件直 ...

随机推荐

  1. Linux下清除系统日志方法

    摘要:相信大家都是用过Windows的人.对于Windows下饱受诟病的各种垃圾文件都需要自己想办法删除,不然你的系统将会变得越来越大,越来越迟钝!windows怎么清理垃圾相信大家都知道的,那么li ...

  2. CSS响应式布局到底是什么?

    响应式布局是最近几年在前端开发中非常火热的词,它是相对于固定像素大小的网页而言的,那么CSS响应式布局到底是什么?顾名思义,响应式布局就是网页能够响应各种各样不同分辨率大小的设备,能够将网页很好的呈献 ...

  3. Chromium Graphics: HW Video Acceleration in Chrom{e,ium}{,OS}

    HW Video Acceleration in Chrom{e,ium}{,OS} Ami Fischman <fischman@chromium.org> Status as of 2 ...

  4. 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...

  5. 【Linux下自定义Shell终端提示符】

    目录 基本转义符 字体颜色 背景颜色 移动光标 @ Linux系统终端提示符的特征由系统环境变量 PS1(Prompt String One)定义. 我们可以通过命令echo $PS1来查看当前设置, ...

  6. 【J-meter】参数及相应数据中文显示乱码问题

    参考资料: http://www.51testing.com/html/00/130600-1360743.html http://www.cnblogs.com/fengpingfan/p/5851 ...

  7. 【Henu ACM Round#15 A】 A and B and Chess

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 统计大写和小写的个数. 比较答案.输出即可. [代码] #include <bits/stdc++.h> using n ...

  8. 【Henu ACM Round#15 E】 A and B and Lecture Rooms

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 最近公共祖先. (树上倍增 一开始统计出每个子树的节点个数_size[i] 如果x和y相同. 那么直接输出n. 否则求出x和y的最近 ...

  9. DataGirdView 常用操作

    1.将数据源的某列添加到已有DataGirdView的列 例如:将文件夹下所有文件名添加到DataGirdView 的文件名一列,图片如下: 首先在datagridview把文件名列的DATAPROP ...

  10. 构建基于Javascript的移动CMS——加入滑动

    在和几个有兴趣做移动CMS的小伙伴讨论了一番之后,我们认为当前比較重要的便是统一一下RESTful API.然而近期持续断网中,又遭遇了一次停电,暂停了对API的思考.在周末无聊的时光了看了<人 ...