原先贴在QQ空间,汗!!

http://user.qzone.qq.com/382164370/infocenter#!app=2&pos=1334911186

http://user.qzone.qq.com/382164370/infocenter#!app=2&pos=1334840523

每天思考一点无聊的问题,又是接上一篇日记的列表框自绘,在上一个自绘里面图片是用WINDOWS自己画上去的,这次彻底的全部的自己绘制(包括文字),这样做的好处是图片上不会覆盖一层阴影影响美观,改动是下面的红色显示的代码片段,有一个问题不知道为什么,就是下面这句

GetSubItemRect(nItem, nSubItem, LVIR_ICON, rect);

得到的矩形rect的宽度总是比图片宽度大42像素(列表框在ICO模式时),why?

                              

只是在前面的基础上修改这两个函数。。。
///
// OnNMCustomdraw

void CListImageCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
//LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
//TRACE("CListImageCtrl::OnNMCustomdraw()");
// Take the default processing unless we set this to something else below.
*pResult = CDRF_DODEFAULT;
// First thing - check the draw stage. If it's the control's prepaint
// stage, then tell Windows we want messages for every item.
if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
// This is the notification message for an item.  We'll request
// notifications before each subitem's prepaint stage.
int nItem = static_cast<int> (pLVCD->nmcd.dwItemSpec);
int nSubItem = pLVCD->iSubItem;
CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc);
CRect rect;
GetSubItemRect(nItem, nSubItem, LVIR_ICON, rect);
XLISTCTRLDATA *pXLCD = (XLISTCTRLDATA *) pLVCD->nmcd.lItemlParam;
ASSERT(pXLCD);
COLORREF crText  = m_crWindowText;
COLORREF crBkgnd = m_crWindow;
if (pXLCD)
{
crText  = pXLCD[nSubItem].crText;
crBkgnd = pXLCD[nSubItem].crBackground;
if (!pXLCD[0].bEnabled)
crText = m_crGrayText;
}
// store the colors back in the NMLVCUSTOMDRAW struct
pLVCD->clrText = crText;
pLVCD->clrTextBk = crBkgnd;
//draw image,
rect.left += 19;
rect.right -= 19;
DrawImage(nItem, nSubItem, pDC, crText, crBkgnd, rect, pXLCD);
//draw checkbox
if (pXLCD && (pXLCD[nSubItem].nCheckedState != -1))
DrawCheckbox(nItem, nSubItem, pDC, crText, crBkgnd, rect,pXLCD);
//draw text
GetSubItemRect(nItem, nSubItem, LVIR_LABEL, rect);
DrawText(nItem, nSubItem, pDC, crText, crBkgnd, rect, pXLCD);
*pResult = CDRF_SKIPDEFAULT;   //we have done all the paint
}
 else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
 {
 *pResult = CDRF_DODEFAULT;
 }
}
///
// DrawImage
int CListImageCtrl::DrawImage(int nItem,
 int nSubItem,
 CDC* pDC,
 COLORREF crText,
 COLORREF crBkgnd,
 CRect rect,
 XLISTCTRLDATA *pXLCD)
{
if (rect.IsRectEmpty())
{
return 0;
}
GetDrawColors(nItem, nSubItem, crText, crBkgnd);
CBrush bkBrush(crBkgnd);
CRgn rgn;
rgn.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);
pDC->FrameRgn(&rgn,&bkBrush,2,2);     //draw my border
int nGap = 0;
rect.left += 0;  
CImageList* pImageList = GetImageList(LVSIL_SMALL);
if (pImageList)
{
SIZE sizeImage;
sizeImage.cx = sizeImage.cy = 0;
IMAGEINFO info;
int nImage = -1;
if (pXLCD)
nImage = pXLCD[nSubItem].nImage;
if (nImage == -1)
return 0;
if (pImageList->GetImageInfo(nImage, &info))
{
sizeImage.cx = info.rcImage.right - info.rcImage.left;
sizeImage.cy = info.rcImage.bottom - info.rcImage.top;
}
if (nImage >= 0)
{
if (rect.Width() > 0)
{
POINT point;
point.y = rect.CenterPoint().y - (sizeImage.cy >> 1);
point.x = rect.CenterPoint().x - (sizeImage.cx >> 1);
SIZE size;
size.cx = rect.Width() < sizeImage.cx ? rect.Width() : sizeImage.cx;
size.cy = rect.Height() < sizeImage.cy ? rect.Height() : sizeImage.cy;
// save image list background color
COLORREF rgb = pImageList->GetBkColor();
// set image list background color
pImageList->SetBkColor(crBkgnd);
pImageList->DrawIndirect(pDC, nImage, point, size, CPoint(0, 0));
pImageList->SetBkColor(rgb);
nGap = sizeImage.cx + 5;  
}
}
}
return nGap;
}

自绘列表框控件显示略缩图----再稍微改进点点。。相关推荐

  1. C#窗体控件-列表框控件ListBox

    列表框(ListBox)用来显示一组相关联的数据,用户可以从中选择一个或多个选项.ListBox中的数据既可以在设计时填充,也可以在程序运行填充.列表框(ListBox)中的每个元素称为"项 ...

  2. 常用控件:列表框控件ListBox

    列表框控件简介 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示.列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以同时选 ...

  3. 鸡啄米之VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)

    目录 一.目的: 1.点击列表框某个变量后,编辑框就显示出来这个变量名字 一.参考: 1.VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox) ①总结:good:亲测有效,适合多 ...

  4. C#窗体应用程序之CheckListBox复选列表与ListBox列表框控件

    1.CheckListBox复选列表 复选框功能类似的复选列表框 (CheckedListBox),方便用户设置和获取复选列表框中的选项,复选列表框显示的效果与复选框类似,但在选择多个选项时操作比一般 ...

  5. wps控件属性怎么用_WPS表格怎么使用列表框控件?

    wps表格中想要制作一个列表框,该怎么制作呢?需要使用列表框空间,该怎么制作呢?下面我们就来看看详细的教程. 1.打开WPS软件,在表格中创建一个简单的表格,在单元格中的输入数据,比如分类表,如下图所 ...

  6. catia装服务器不显示不出来,CATIAV5无法显示略缩图怎么办?CATIAV5无法显示略缩图的原因分析和解决方案...

    CATIAV5是一款十分实用专业的3D建模设计软件,我们在使用这款软件的过程中经常会遇到无法显示略缩图,这是什么原因呢?又要怎么解决呢?下面小编就带着大家一起学习一下吧! CATIA 无法显示缩略图主 ...

  7. 对以前的改进MFC略缩图控件改进

    以前写了一篇日记, 显示略缩图,见 <自绘列表框控件显示略缩图----再稍微改进点点..> http://blog.csdn.net/hemmingway/article/details/ ...

  8. 简单实现前端选择上传图片并显示略缩图

    效果 实现代码 <!DOCTYPE html> <html> <head><meta charset="UTF-8"><tit ...

  9. MFC列表框控件的动态编辑

    在我们进行mfc 编程时,我们需要用到列表框显示各层或各物体的参数设置,同时也希望能编辑其参数.我以前在网上查找,用了CComboListCtrl,这需要3个cpp 和 h 文件,用起来还不容易. 最 ...

最新文章

  1. plsql develop怎么停止job_Kotlin协程实现原理:CoroutineScopeamp;Job
  2. 加入域报错域控无法联系
  3. 移动端手势库Hammer.js学习
  4. 使用Devstack部署neutron网络节点
  5. python网络爬虫教程-如何入门 Python 爬虫?
  6. 在CentOS下安装crontab服务
  7. 三组关键词,拆解2021年赤子城的中期业绩报告
  8. Linux怎么查看并杀死被占用的端口?
  9. WebSocket介绍和Socket的区别
  10. linux命令echo的实现,Linux echo命令的使用及三种实现方式
  11. IE6下链接onclick事件处理中的请求被aborted
  12. 视频教程-IT必备技能Cisco认证CCNA全集-思科认证
  13. iweboffice2015库文件WebOffice.js中新增删除两个书签之间的内容实现
  14. 二进制和十进制的相互转换
  15. 解决多次点击出现蓝色背景
  16. Intel无线网卡linux,Gentoo 安装之intel无线网卡篇
  17. 计算机组策略定时开机脚本,批处理+组策略 实现规定时间段无法开机and定时关机...
  18. 【UE4】GamePlay框架简介(蓝图)
  19. springboot某高校绩效考核管理设计与实现毕业设计论文012208
  20. 简明图解冯·诺依曼计算机体系

热门文章

  1. 【收集】6410 开发板(Real6410/TE6410/OK6410/mini6410/micro6410/FL6410)wince问题
  2. python3 重新运行本程序_python-3.x – 在py.test测试中重新启动python(或重新加载模块)...
  3. c#endread怎么打印出来_C#编程直接发送打印机命令到打印机及ZPL常用的打印命令详解...
  4. android权限 启动失败,Android 6.0打开失败:EACCES(权限被拒绝)
  5. linux脚本登录启动失败,linux-从bash脚本启动进程失败
  6. java vote_vote投票系统java jsp mysql
  7. mysql hash分区 数目_mysql8 参考手册-HASH分区
  8. java锁方法和锁代码块_java的同步方法和同步代码块,对象锁,类锁区别
  9. mysql怎么查找列命令_MySQL查询命令-DQL
  10. 400分理科学计算机,理科400分,专科批次,有4所211大学可以报考