`

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重绘,内嵌按钮等控件

    一共两个压缩文件,一个是从CodeProject上下载的例子,里面包含了CListCtrl重绘,内嵌入有按钮等各种控件 另外一个是参考例子,嵌入按钮,修改了重绘CListCtrl后无法显示图标的问题

    CFiledLG 定制

    里面包括CFILEDIALOG 内幕 ClistCtrl 用法 CCOMBOBOC用法 对话框的绘制 按钮的绘制等 本人1个星期研究心血啊! 里面图片有3个绝对路径,大家编译可能出现错误,只需要将路径变为res\***就好

    visual c++ 开发宝典 源码

    8.8.3 ClistCtrl类的主要成员函数 8.9 树形(TreeCtrl)控件 8.9.1 树形控件的使用 8.9.2 CTreeCtrl类的主要成员函数 8.9.3 树形控件的通知消息 8.10 项卡(TabCtrl)控件 8.10.1 选项卡控件的使用 8.10.2 选项卡控件...

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    有了Windows,一切都好办了,Windows将诸如按钮、菜单、工具栏等等这些通用界面的绘制及动作都交给了系统,程序员就不用花心思再画那些按钮了,可以将更多的精力放在程序的功能实现方面。 所有的标准界面元素都被...

    类似画图板的小程序-windows

    首先为了实现工具箱的按钮分两列显示的效果,需要设置一下按钮的TBBS_WRAPPED,参见程序中的CToolPaletteBar类;然后,选择不同工具时展现出工具的样式,比如选择“直线”时列出可用的直线宽度样式,该功能通过在...

    VC资料代码示例

    2014/11/08 23:11 108,419 完美自绘制CListCtrl控件[MFC].rar 2010/05/21 19:01 33,767 屏幕测量.rar 2007/10/17 14:57 3,147 模拟keyborad.rar 2007/10/16 16:56 3,490 淡入淡出.rar 2007/10/17 10:45 1,424 目录...

    C++MFC教程

    例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。 2、谁将收到...

    Visual C++ 编程资源大全(源码 窗体)

    它演示如何使用CListCtrl::Scroll()函数,它是CListView的report方式的一个子集(14KB)&lt;END&gt;&lt;br&gt;54,treelist1.zip 显示资源管理器风格的目录树结构的例子(64KB)&lt;END&gt;&lt;br&gt;55,list_menu.zip 在ToolBar中嵌入...

Global site tag (gtag.js) - Google Analytics