ListCtrl控件[建议收藏]

一CListCtrl类型LVS_EDITLABELSLVS_OWNERDRAWFIXEDLVS_REPORTLVS_SHOWSELALWAYSLVS_SINGLESELLVS_SMALL

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 CListCtrl类型

  LVS_EDITLABELS   

  LVS_OWNERDRAWFIXED

  LVS_REPORT

  LVS_SHOWSELALWAYS

  LVS_SINGLESEL

  LVS_SMALLICONw

  LVS_SORTASCENDING LVS_SORTDESCENDING

  LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP

  (1)添加或删除风格nStyle |= 或 nStyle &~

       (2)设置扩展风格GetExtendStyle(); SetExtendStyle(DWORD dwStyle);

二 动态创建带图标的ListCtrl控件

  (1)Create  

CListCtrlEx *pListCtrl = new CListCtrlEx();
 pListCtrl->Create(WS_VISIBLE|LVS_REPORT|LVS_OWNERDRAWFIXED, CRect(20,20,300,300), this, IDC_LISTCTRL);

  (2)设置扩展风格GetExtendStyle()和GetExtendStyle()

DWORD nStyle = pListCtrl->GetExtendedStyle();
 nStyle |= LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP;
 pListCtrl->SetExtendedStyle(nStyle); 

  (3)初始化CImageList

CBitmap bmp1,bmp2;
bmp1.LoadBitmap(IDB_BITMAP1);
bmp2.LoadBitmap(IDB_BITMAP2);
m_ImageList.Create(16,16,ILC_COLOR32|ILC_MASK,4,4);
m_ImageList.Add(&bmp1, RGB(255,255,255));
m_ImageList.Add(&bmp2,RGB(255,255,255));
pListCtrl->SetImageList(&m_ImageList, LVSIL_SMALL);

  (4)插入列,行

pListCtrl->InsertColumn(0, "学号",LVCFMT_LEFT, 100);
pListCtrl->InsertColumn(1, "姓名",LVCFMT_LEFT,100);
pListCtrl->InsertColumn(2, "成绩",LVCFMT_LEFT,100);
// 方法1
pListCtrl->InsertItem(0, "1", 0);
pListCtrl->SetItemText(0,1,"张三");
pListCtrl->SetItemText(0,2,"100");
方法2
{
    LV_ITEM lvItem = {0};
    lvItem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
    lvItem.iItem = 1;
    lvItem.iSubItem = 0;
    lvItem.iImage = 1;
    lvItem.lParam = (LPARAM)0;
    lvItem.pszText="1";
    pListCtrl->InsertItem(&lvItem);
}
{
    LV_ITEM lvItem = {0};
    lvItem.mask = LVIF_TEXT;
    lvItem.iItem = 1;
    lvItem.iSubItem = 1;
    lvItem.lParam = 1;
    lvItem.pszText="张三";
    pListCtrl->SetItem(&lvItem);
}
{
    LV_ITEM lvItem = {0};
     lvItem.mask = LVIF_TEXT|LVIF_IMAGE;
    lvItem.iItem = 1;
    lvItem.iSubItem = 2;
    lvItem.iImage = 0;          // 特别测试该位置的iImage无效
    lvItem.pszText="100";
    pListCtrl->SetItem(&lvItem);
}  

三 自绘ListCtrl控件
  效果图

  ListCtrl控件[建议收藏]

  代码实现

ListCtrl控件[建议收藏]
ListCtrl控件[建议收藏]

#pragma once


// CListCtrlEx
#define IDC_ADDEDIT 1002
class CListCtrlEx : public CListCtrl
{
    DECLARE_DYNAMIC(CListCtrlEx)

public:
    CListCtrlEx();
    virtual ~CListCtrlEx();

protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnNMClick(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult);
public:
    virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
    void DrawRowICon(CDC *pDC, CRect &rc, int nRow);
};

View Code

ListCtrl控件[建议收藏]
ListCtrl控件[建议收藏]

// ListCtrlEx.cpp : 实现文件
//

#include "stdafx.h"
#include "mfcctrlstu.h"
#include "ListCtrlEx.h"


// CListCtrlEx

IMPLEMENT_DYNAMIC(CListCtrlEx, CListCtrl)

CListCtrlEx::CListCtrlEx()
{

}

CListCtrlEx::~CListCtrlEx()
{
}


BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
    ON_NOTIFY_REFLECT(NM_CLICK, &CListCtrlEx::OnNMClick)
    ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, &CListCtrlEx::OnLvnColumnclick)
    ON_NOTIFY_REFLECT(NM_DBLCLK, &CListCtrlEx::OnNMDblclk)
END_MESSAGE_MAP()

void CListCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // 背景
    CDC dc;
    CRect rc = lpDrawItemStruct->rcItem;
    dc.Attach(lpDrawItemStruct->hDC);
    if (lpDrawItemStruct->itemState & ODS_SELECTED)
    {
        // 选中状态蓝底白字
        dc.FillSolidRect(&rc, GetSysColor(COLOR_HIGHLIGHT));
        dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
    }
    else
    {
        // 普通状态白底黑字
        //dc.FillSolidRect(&rc, GetSysColor(COLOR_WINDOW));
        dc.FillSolidRect(&rc, RGB(222,33,33));
        dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
    }
    
    int nRow = lpDrawItemStruct->itemID;
    CHeaderCtrl *pHeadCtrl = GetHeaderCtrl();
    int nColCount = pHeadCtrl->GetItemCount();
    CRect rcCell; // 注意单元格rcCell的处理
    for (int nCol = 0;nCol < nColCount; nCol++)
    {
        pHeadCtrl->GetItemRect(nCol, &rcCell);
        rcCell.top = rc.top;
        rcCell.bottom = rc.bottom;                            
        CString strText = GetItemText(nRow, nCol);
    
        // 图标
        if (!nCol)
        {
            DrawRowICon(&dc, rc, nRow);
            rcCell.left += 18;
        }
        
        // 文字
        dc.SetBkMode(TRANSPARENT);
        dc.DrawText(strText, &rcCell, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
        //TRACE("%d-%d-%d-%d-%d-%d-%s\r\n", nRow, nCol, rcCell.left, rcCell.top, rcCell.right,rcCell.bottom,strText);
    }
    
    dc.Detach();
}

void CListCtrlEx::DrawRowICon(CDC *pDC, CRect &rc, int nRow)
{
    /*LV_ITEM lvi = {LVIF_IMAGE};
    GetItem(&lvi);*/
    CImageList *pImageList = GetImageList(LVSIL_SMALL);
    pImageList->Draw(pDC, nRow, rc.TopLeft(), ILD_TRANSPARENT);
}

void CListCtrlEx::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    int nCol = pNMLV->iSubItem;
    HDITEM hi = {HDI_IMAGE | HDI_FORMAT};
    
    CHeaderCtrl *pHeadCtrl = GetHeaderCtrl();
    pHeadCtrl->GetItem(nCol, &hi);
    static int k = 0;
    hi.iImage = k;
    k = !k;

    int nColCount = pHeadCtrl->GetItemCount();
    for (int i = 0; i < nColCount; i ++)
    {
        if (i == nCol)
            hi.fmt |= HDF_IMAGE;
        else
            hi.fmt &= ~HDF_IMAGE;

        
        pHeadCtrl->SetItem(i, &hi);
    }

    *pResult = 0;
}

void CListCtrlEx::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: 在此添加控件通知处理程序代码
    /*if (!pNMHDR)
        return;
    LPNMITEMACTIVATE pNmItemActive = (LPNMITEMACTIVATE)pNMHDR;
    LV_ITEM lvItem;
    lvItem.iItem = pNmItemActive->iItem;
    lvItem.iSubItem = 1;
    lvItem.mask = LVIF_TEXT;
    GetItem(&lvItem);*/
    *pResult = 0;
}
void CListCtrlEx::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
{
    // 在1行1列创建个Edit
    LPNMITEMACTIVATE pNmItemActive = (LPNMITEMACTIVATE)pNMHDR;
    int nRow = pNmItemActive->iItem;
    int nCol = pNmItemActive->iSubItem;
    CRect rc;
    GetItemRect(nRow, &rc, LVIR_BOUNDS);
    CRect rcCell;
    CHeaderCtrl *pHeadCtrl = GetHeaderCtrl();
    pHeadCtrl->GetItemRect(nCol, &rcCell);
    rcCell.top = rc.top;
    rcCell.bottom = rc.bottom;
    if (3==nRow&&1==nCol)
    {
        CEdit *pEdit = new CEdit;
        pEdit->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_LEFT, rcCell, this, IDC_ADDEDIT);
    }
    
    *pResult = 0;
}

View Code

 

  

  

 

 

  

  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120232.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mac docker安装部署_dcs教程视频教程

    mac docker安装部署_dcs教程视频教程最近电脑越来越卡了,为了减少系统开销,以及后期维护方便,所以考虑将本地安装一些服务迁移到docker中去管理,这一切的基础是要先有docker服务,所以本文就先记录怎样在mac上安装配置docker,

    2022年8月2日
    5
  • 栈和队列讲解_栈和队列的优缺点

    栈和队列讲解_栈和队列的优缺点目录1、栈(1)栈的概念及结构(2)栈的实现2、队列(1)队列的概念及结构(2)队列的实现前言:栈和队列是在顺序表和链表的延伸,如果前面的顺序表和链表你已经掌握了的话,栈和队列对你来说应该就是小菜一碟了。1、栈(1)栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。压栈:栈的插入操作叫做进栈/压栈..

    2025年6月22日
    1
  • 数学建模-二胎政策对中国人口的影响[通俗易懂]

    数学建模-二胎政策对中国人口的影响[通俗易懂]  研一的数学建模课上的关于“二胎政策对中国人口的影响”。研究中国人口,发现中国人口老龄化非常严重,如今假设不放开全面二胎,那么中国的未来真的非常令人堪忧。事实上,如今的单独二胎对人口的影响不是太多,每年添加100多万的人口,对于中国日益下降的人口增长率影响根本不大。   首先,本文通过搜集第六次人口普查的资料,将中国人口依照年龄组(5岁为一个年龄组)分为21个组,实行单独…

    2022年9月4日
    2
  • 【USB】全球USB厂家 USB ID大全。更新时间:2018-01-04

    【USB】全球USB厂家 USB ID大全。更新时间:2018-01-04## ListofUSBID’s## MaintainedbyStephenJ.Gowdy# Ifyouhaveanynewentries,pleasesubmitthemvia# http://www.linux-usb.org/usb-ids.html# orsendentriesaspatches(diff-uoldnew)i

    2022年7月26日
    41
  • Python实现XML文件解析建议收藏

    1.XML简介XML(eXtensibleMarkupLanguage)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用。它是web

    2021年12月18日
    69
  • swagger @ApiModel @ApiModelProperty注解属性说明「建议收藏」

    @ApiModel使用场景:在实体类上边使用,标记类时swagger的解析类。概述:提供有关swagger模型的其它信息,类将在操作中用作类型时自动内省。用法:@ApiModel(value=“ShopVo”,description=“商铺信息”)@ApiModelProperty使用场景:使用在被@ApiModel注解的模型类的属性上。表示对model属性的说明或者数据操作更改。概述:添加和操作模型属性的数据。用法:@ApiModelProperty(value=“

    2022年4月14日
    857

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号