MFC重绘CListCtrl时DrawItem中绘制CimageList图片

本文介绍了如何在MFC的CListCtrl中利用DrawItem函数和CImageList类来实现第一列显示图片的效果,虽然目前还有一些不成熟的地方,主要涉及到逻辑坐标的处理,适合MFC初学者参考学习。
摘要由CSDN通过智能技术生成

这几天一直为ClistCtrl重绘后在用Cimagelist重绘图片失败发愁,找资料都是要么没解决答案要么就是那些楼主自己解决但没贴出方法,自己各路问也是无人回答,菜鸟的方法都用尽了,但是功夫不负有心人,还是找到了个解决方法。下面贴出方法

<span style="white-space:pre">			</span>if (lvi.iImage >= 0)//大于等于0代表当前item有图片资源要画  图片序号
			{
				
				//HBITMAP hBitmap;

				IMAGEINFO ImageInfo;
				if (m_nImageCount == 1)
				{
					pImageList->GetImageInfo(0,&ImageInfo);
				}
				else
				{
					pImageList->GetImageInfo(lvi.iImage,&ImageInfo);				
				}
				

				///
				CDC dcMemory;  
				dcMemory.CreateCompatibleDC( pDC ); 
				CBitmap Bitmap;
				int   nWidth  = abs(ImageInfo.rcImage.right - ImageInfo.rcImage.left);
				int   nHeight = abs(ImageInfo.rcImage.bottom - ImageInfo.rcImage.top);

				Bitmap.CreateCompatibleBitmap(pDC, nWidth, nHeight);
				CBitma
MFC(Microsoft Foundation Classes),如果你自定义了`CListCtrl`的`DrawItem`函数重绘列表控件项,可能会遇到第一列的复选框消失的问题。这通常是因为在自定义绘制过程有正确处理复选框的绘制。 要解决这个问题,你需要在自定义的`DrawItem`函数,对列表控件的每项进行绘制,包含对复选框的绘制。这可以通过调用`DrawFrameControl`函数实现,该函数用于绘制复选框或其他类型的框架控件。 通常,复选框位于列表项的第一个子项(subitem),因此你需要在处理第一列调用`DrawFrameControl`,设置适当的参数来绘制复选框。确保使用与`CListCtrl`的`SetItem`函数相同的`itemID`和`subItem`参数。 示例代码片段如下: ```cpp void CYourListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // 检查绘制类型是否为ODT_LISTBOX,因为CListCtrl是基于CListBox的 if(lpDrawItemStruct->itemAction & ODA_DRAWENTIRE) { CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rectItem; GetClientRect(&rectItem); // 设置背景颜色等 // ... // 设置第一列的复选框是否选的状态 int itemState = GetItemState(lpDrawItemStruct->itemID, LVIS_SELECTED); if(itemState & LVIS_SELECTED) { // 绘制复选框 pDC->DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_FLAT); } else { // 绘制非选的复选框或其他状态 pDC->DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, DFCS_BUTTONCHECK); } } // 绘制其他内容 // ... } ``` 确保在绘制复选框后,继续处理其他子项的绘制,并且正确使用`rectItem`和`lpDrawItemStruct->rcItem`矩形区域。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值