白夜忘川 2023-06-25 11:20 采纳率: 20%
浏览 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 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。