`

clistctrl +号按钮绘制

    博客分类:
  • MFC
阅读更多

网上有关clistctrl举不胜举,包括按钮控件的绘制也很多,但我用的时候找了好久没发现适合我用的。在这里我想介绍一种很简洁的+、-号按钮绘制的方法,实现后类似于tree中的+、-号收缩功能。以便同行以后有需要可以直接搬走使用。

依附点:clistctrl用的最多的setitemdata,setitemtext,可以记录一些信息,但这里通过setitemstate来记录与修改图标的状态,从而实现+、-号的按钮。

问题:你可能说为什么不绘制一个+号按钮呢?红色部分代码是绘制了一个+号按钮,但很难看,另外你单击时候还要改变成-号,这可能也许能实现,但我想其中你做的这些工作的时间足够你用这种方法做了好几遍了。

1.说是按钮,其实这里采用了图标的方式,你可以用vc自带的工具,也可以用ARTICONS工具,首先绘制两个图标,+、-号.INDEXTOSTATEIMAGEMASK这个宏来把你图标的索引号 进行转变。

2.在inidlg函数中创建图表,并保存+、-号图标。贴代码

BOOL CTest_listcheckDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);    // Set big icon
SetIcon(m_hIcon, FALSE);   // Set small icon
CWinApp *pApp = AfxGetApp();
m_pImageLarge = new CImageList();
ASSERT(m_pImageLarge != NULL);    // serious allocation failure checking
m_pImageLarge->Create(24, 24, TRUE, 100, 4);
//m_pImageLarge->Create(32, 32, TRUE, 100, 4);
//+图标
m_pImageLarge->Add(pApp->LoadIcon(IDI_ICON5));//+号
m_pImageLarge->Add(pApp->LoadIcon(IDI_ICON4));//-号

m_list.SetImageList(m_pImageLarge, LVSIL_SMALL);

// TODO: Add extra initialization here
m_list.SetExtendedStyle(m_list.GetExtendedStyle()|LVS_SORTASCENDING|LVS_TYPEMASK);
m_list.InsertColumn(0,"关注类型",LVCFMT_CENTER, 90);
m_list.InsertColumn(1,"名称",LVCFMT_CENTER, 90);

int i=0;
int index=m_list.InsertItem(i++,"1",0);
// int index=m_list.InsertItem(LVIF_TEXT|LVIF_IMAGE,i++, "1",0, 0, i,NULL);
m_list.SetItemData(index,i);
m_list.SetItemState(index,INDEXTOSTATEIMAGEMASK(0),TVIS_STATEIMAGEMASK);

// CRect rect;
// m_list.GetSubItemRect( index, 0, LVIR_ICON, rect );
// m_btn.Create("+", BS_LEFTTEXT|WS_CHILD , rect, FromHandle(m_list.m_hWnd), 1);
// m_btn.MoveWindow(rect,1);
// m_btn.ShowWindow(TRUE);

index=m_list.InsertItem(i++,"2",0);
m_list.SetItemData(index,i);
m_list.SetItemState(index,INDEXTOSTATEIMAGEMASK(0),TVIS_STATEIMAGEMASK);

index=m_list.InsertItem(i++,"3",0);
m_list.SetItemData(index,i);
m_list.SetItemState(index,INDEXTOSTATEIMAGEMASK(0),TVIS_STATEIMAGEMASK);

index=m_list.InsertItem(i++,"4",0);
m_list.SetItemData(index,i);
m_list.SetItemState(index,INDEXTOSTATEIMAGEMASK(0),TVIS_STATEIMAGEMASK);

index=m_list.InsertItem(i++,"5",-1);
m_list.SetItemData(index,i);
m_list.SetItemState(index,INDEXTOSTATEIMAGEMASK(-1),TVIS_STATEIMAGEMASK);

 

return TRUE; // return TRUE unless you set the focus to a control
}

3.单击+、-号的分别处理消息,单击+号则插入你需要的记录,单击-号则删除下面的记录,贴代码:

void CTest_listcheckDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
UINT flags(0);
CPoint   pt;
GetCursorPos(&pt);
m_list.ScreenToClient(&pt);
int index=m_list.HitTest(pt,&flags);
if (-1!=index)
{
   CRect rect;
   m_list.GetSubItemRect(index,0,LVIR_ICON,rect);
   if(rect.PtInRect(pt))
   {
    //if 是+号,1.更换图标为-号。2.根据index的data查询数据库,在本index下面插入查询结果。
    //if 是-号,1.更换图标为+号。2.判断下一行是否有图表,将无图标的都删除掉。直到有图表的列为止。
    //AfxMessageBox("您点击了图标,请更换");
    int result= m_list.GetItemState(index,TVIS_STATEIMAGEMASK);
    int stateindex=result>>12;
    if (0==stateindex)//是+号
    {
     stateindex=1;
     m_list.SetItem( index,   0,   LVIF_IMAGE,   NULL, stateindex,   0,   0,   0   );
     m_list.SetItemState(index,INDEXTOSTATEIMAGEMASK(stateindex),TVIS_STATEIMAGEMASK);
     for (int i=0;i<3;i++)
     {
      CString str;
      str.Format("test %d",i);
      int dd=m_list.InsertItem(index+1,str,-1);
      m_list.SetItemData(dd,-1);
      m_list.SetItemState(dd,INDEXTOSTATEIMAGEMASK(-1),TVIS_STATEIMAGEMASK);
     }
    }
    else if (1==stateindex)//是-号.
    {
     stateindex=0;
     m_list.SetItem( index,   0,   LVIF_IMAGE,   NULL, stateindex, 0, 0,0);
     m_list.SetItemState(index,INDEXTOSTATEIMAGEMASK(stateindex),TVIS_STATEIMAGEMASK);
     int dd=m_list.GetNextItem(index,LVNI_BELOW );
     while (-1!=dd)
     {
      int result= m_list.GetItemState(dd,TVIS_STATEIMAGEMASK);
      int mask=result>>12;
      if ((mask!=0 )&&(mask!=1))
       m_list.DeleteItem(dd);
      else
       break;
     }
    }
    //状态的改变以及图标索引的设置.
   
   }
}
*pResult = 0;
}

希望对项目紧又没时间研究的人给予 一定的帮助。

分享到:
评论

相关推荐

    CListCtrl添加按钮

    在`CListCtrl`中添加按钮通常涉及自定义绘制,因为标准的`CListCtrl`不支持直接插入控件如按钮。【标签】"CListCtrl插入按钮"和"CListCtrl自绘按钮"强调了这个过程的核心:自定义绘制技术。以下是实现这个功能的关键...

    带按钮的clistctrl

    在Windows编程领域,CLISTCTRL是MFC(Microsoft Foundation Classes)库中用于创建列表视图控件的一个类...开发者通过扩展CLISTCTRL的功能,实现了按钮的绘制、事件处理和状态管理,从而提供了更丰富的界面和用户体验。

    CListCtrl重绘,内嵌按钮等控件

    本篇文章将深入探讨CListCtrl的重绘技术以及如何在其中内嵌按钮等控件。 CListCtrl的重绘是一个关键功能,允许开发者自定义控件的外观和行为。通常,重绘涉及到覆盖CListCtrl的默认OnDrawItem、OnMeasureItem和...

    CListCtrl简单自绘并在每行动态生成按钮_vc6.0

    本项目“CListCtrl简单自绘并在每行动态生成按钮_vc6.0”是基于MFC的一个实例,涉及到的核心知识点包括CListCtrl控件的使用、自定义绘制以及动态生成按钮。 CListCtrl是MFC中的一个视图类,它是Windows的ListView...

    CListCtrl中嵌入Check,Radio,CComboBOx等控件

    - 使用InsertItem、SetItemData等函数添加组合框项,然后在CListCtrl的OnMeasureItem和OnDrawItem回调中绘制组合框。 5. **事件处理与交互** - 为了响应用户与嵌入控件的交互,我们需要重载CListCtrl的成员函数,...

    MFC list control 内嵌按钮以及样式

    在`OnDrawItem`中,你需要绘制按钮,而在`OnMeasureItem`中,你需要确定每个项的高度和宽度,以适应按钮的大小。 接下来,要在List Control的列中添加响应按钮事件的功能,你需要在消息映射中添加相应的入口。对于...

    Clistctrl 控件的缩略图

    在MFC项目中,我们通常会在消息映射函数中处理CListCtrl的相关事件,例如在ON_BN_CLICKED消息处理函数中处理按钮点击事件,从而触发打开图片的逻辑。 文件名列表中的`testImageList`可能是用于存储和管理图片的...

    CListCtrl.rar_CListButton_CListCtrl_CListCtrl控件_clistctrl button

    同时,你需要处理`CListCtrl`的`NM_CUSTOMDRAW`通知,以在适当的位置绘制按钮。 以下是一个简单的`CListButton`实现的例子: ```cpp class CListButton : public CButton { public: // ... protected: virtual ...

    自定义CListCtrl控件

    - 继承自CListCtrl类,并重写必要的成员函数,如OnDrawItem()和OnMeasureItem(),以实现自定义绘制。 - 注册消息映射,处理WM_NOTIFY、WM_LBUTTONDOWN等消息,以便响应用户的交互。 - 使用MFC的消息响应机制,为...

    CListCtrl派生类演示

    本教程将深入探讨"CListCtrl派生类演示",着重讲解如何自定义CListCtrl以实现更丰富的功能,如修改项的背景色、文本背景色以及添加编辑、组合框和按钮功能,以及实现排序。 CListCtrl是基于Windows API中的LISTVIEW...

    MFC在ListCtrl中加入Button

    Owner Draw允许我们自定义控件的绘制过程,这样我们就可以在ListCtrl的某个单元格中画出一个按钮的外观,并响应用户点击。以下是一步步实现的过程: 1. **创建ListCtrl**:在你的MFC对话框或视图类中,添加一个...

    ListCtrl内嵌按钮及其响应

    在`CListCtrl`类的派生类中,我们需要添加按钮的消息映射,例如`ON_BN_CLICKED(id, memberFxn)`,其中`id`是按钮的ID,`memberFxn`是处理按钮点击事件的成员函数。在该函数中,我们可以执行按钮点击时的逻辑,如更新...

    CListCtrl添加Button

    为了在CListCtrl中绘制Button,我们需要使用 CDC 类来处理绘图操作。首先,我们需要在OnDrawItem函数中,根据列表项索引绘制Button。这包括使用CBrush绘制背景,使用CFont设置文字样式,然后使用CRect定义Button的...

    CListCtrl Demo

    6. **扩展样式**:利用SetExtendedStyle()函数,可以开启诸如自定义绘制、全选按钮、分组选择等扩展样式。 **三、CListCtrl Demo的实践** "CListCtrl Demo"项目是一个实用的学习资源,它演示了如何创建一个功能...

    CListCtrl控件代码大集合

    15. **自定义绘制**:通过重写CListCtrl的OnDrawItem和OnMeasureItem函数,你可以实现自定义的列表项绘制,满足个性化需求。 16. **上下文菜单**:为CListCtrl添加右键菜单,用户可以执行更多操作。这通常通过添加...

    扩展的ClistCtrl

    9. **自定义绘制**:扩展的CListCtrl可能需要自定义绘制功能,以适应各种控件的显示需求。这涉及重载OnDrawItem和OnMeasureItem等函数。 10. **性能优化**:由于嵌入了更多的控件,性能可能会受到影响。开发者需要...

    在CListCtrl控件添加Button,EditBox,Combox,ChcekBox,ListBox

    1. **Button**:在CListCtrl中添加Button控件需要自定义绘制列表项。你可以创建一个派生自CListCtrl的类,覆盖OnDrawItem和OnMeasureItem方法。在OnDrawItem中,使用CDC对象的DrawText或DrawBitmap方法绘制Button...

Global site tag (gtag.js) - Google Analytics