白夜忘川 2023-06-25 11:20 采纳率: 33.3%
浏览 9

CListCtrl插入图片占空位问题

CListCtrl在SetImageList之后第一列有空白图标占位置,我想把这个去掉。下列是添加图片的代码。
插入图的代码如下


    HBITMAP hBitmap;
    BITMAP bmp;
    CBitmap* pBitmap;
    pBitmap = new CBitmap;

    hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), FilePathName1, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    pBitmap->Attach(hBitmap);
    m_ImageList.Add(pBitmap, RGB(0, 0, 0));

    hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), FilePathName2, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    pBitmap->Attach(hBitmap);
    m_ImageList.Add(pBitmap, RGB(0, 0, 0));

    //将ImageList设置到ListCtrl中
    m_listCtrl.SetImageList(&m_ImageList, LVSIL_SMALL);

添加的代码如下

LV_ITEM lvitem;
                memset((char*)&lvitem, '\0', sizeof(LV_ITEM));
                lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;//| LVIF_INDENT仅对第0列有效;
                lvitem.iItem = i; lvitem.iSubItem = 0;

我是自己重绘了表格的,重绘图片的代码如下。

void CAAMyListCtrl::DrawImage(CDC* pDC, CPoint Pt, int width, int height, int nItem)
{
    LVITEM Lv = { LVIF_IMAGE };//指明获取什么类型的数据
    Lv.iItem = nItem;//指明获取第几行的图标
    GetItem(&Lv);
    CImageList* pImgList = GetImageList(LVSIL_SMALL);
    if (pImgList != NULL)
    {
        //ImageList_SetIconSize(pImgList->m_hImageList,27, 27);
        int cx = 0;
        int cy = 0;
        ImageList_GetIconSize(pImgList->GetSafeHandle(), &cx, &cy);//图片尺寸
        if (width >= cx && height >= cy)//单元格大于图片时,设置图片居中,其余靠单元格左上角
        {
            int iSubW = (width - cx) / 2;
            int iSubH = (height - cy) / 2;
            iSubW = Pt.x + iSubW;
            iSubH = Pt.y + iSubH;
            Pt.x = iSubW;
            Pt.y = iSubH;
            //CListCtrl坐标原点为列表左上角,x向右,y向下
        }
        pImgList->Draw(pDC, Lv.iImage, Pt, ILD_TRANSPARENT);
    }
}

有尝试在重绘的时候修改尺寸,但是这样显示不出来图片。总结我的需求:去掉第一列的空白图片占位。麻烦有明白的朋友帮帮忙,感谢了。

  • 写回答

1条回答 默认 最新

  • MarkHan_ 2023-06-25 11:30
    关注
    
    void CAAMyListCtrl::DrawImage(CDC* pDC, CPoint Pt, int width, int height, int nItem)
    {
        // 判断是否是第一列
        if (Pt.x == 0)
            return;
    
        LVITEM Lv = { LVIF_IMAGE };//指明获取什么类型的数据
        Lv.iItem = nItem;//指明获取第几行的图标
        GetItem(&Lv);
        CImageList* pImgList = GetImageList(LVSIL_SMALL);
        if (pImgList != NULL)
        {
            //ImageList_SetIconSize(pImgList->m_hImageList,27, 27);
            int cx = 0;
            int cy = 0;
            ImageList_GetIconSize(pImgList->GetSafeHandle(), &cx, &cy);//图片尺寸
            if (width >= cx && height >= cy)//单元格大于图片时,设置图片居中,其余靠单元格左上角
            {
                int iSubW = (width - cx) / 2;
                int iSubH = (height - cy) / 2;
                iSubW = Pt.x + iSubW;
                iSubH = Pt.y + iSubH;
                Pt.x = iSubW;
                Pt.y = iSubH;
                //CListCtrl坐标原点为列表左上角,x向右,y向下
            }
            pImgList->Draw(pDC, Lv.iImage, Pt, ILD_TRANSPARENT);
        }
    }
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 6月25日

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100