VC 自绘CListCtrl类

http://www.codeproject.com/listctrl/quicklist.asp

http://www.codeproject.com/listctrl/ctooltiplistctrl.asp

实现功能:鼠标在ListCtrl上滑动的时候,滑动到哪一行哪一行就高亮,有且仅有一条是高亮的。

如何实现下面两个功能:

1.当鼠标离开ListCtrl的时候,高亮行取消高亮。

2.更改高亮行的背景色,默认是蓝色的,客户想要其它的颜色。

    //自绘CListCtrl类,重载虚函数DrawItem  

    void CNewListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
     // TODO: Add your code to draw the specified item
     ASSERT(lpDrawItemStruct->CtlType == ODT_LISTVIEW);
     CDC dc;
     dc.Attach(lpDrawItemStruct->hDC);
     ASSERT(NULL != dc.GetSafeHdc());
     // Save these value to restore them when done drawing.
     COLORREF crOldTextColor = dc.GetTextColor();
     COLORREF crOldBkColor = dc.GetBkColor();  

     // If this item is selected, set the background color
     // and the text color to appropriate values. Also, erase
     // rect by filling it with the background color.
     if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
      (lpDrawItemStruct->itemState & ODS_SELECTED))
     {
      dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
      dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
      dc.FillSolidRect(&lpDrawItemStruct->rcItem,
       ::GetSysColor(COLOR_HIGHLIGHT));
     }
     else
     {
      if(lpDrawItemStruct->itemID%2)
       dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));
      else
       dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255));
     }  

     // If this item has the focus, draw a red frame around the
     // item's rect.
     if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
      (lpDrawItemStruct->itemState & ODS_FOCUS))
     {
      CBrush br(RGB(0, 0, 128));
      dc.FrameRect(&lpDrawItemStruct->rcItem, &br);
     }  

     // Draw the text.
     CString strText(_T(""));
     CRect rcItem;  

     for(int i=0; i<GetHeaderCtrl()->GetItemCount(); i++)
     {
      strText = GetItemText(lpDrawItemStruct->itemID, i);
      GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_LABEL, rcItem);
      rcItem.left += 5;
      dc.DrawText(
       strText,
       strText.GetLength(),
       &rcItem,
      DT_LEFT|DT_SINGLELINE|DT_VCENTER);
     }  

     // Reset the background color and the text color back to their
     // original values.
     dc.SetTextColor(crOldTextColor);
     dc.SetBkColor(crOldBkColor);  

     dc.Detach();
    }  

    // 调用  

    CNewListCtrl m_list; // 类的成员变量  

    #define IDC_LIST 0x1101
     m_list.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|LVS_OWNERDRAWFIXED, CRect(0, 0, 280, 280), this, IDC_LIST);
     m_list.ModifyStyle(0, LVS_REPORT|LVS_SINGLESEL);
     m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
     m_list.InsertColumn(0, _T("AAA"), LVCFMT_LEFT, 100);
     m_list.InsertColumn(1, _T("BBB"), LVCFMT_LEFT, 100);  

     CString strText(_T(""));
     for(int i=0; i<20; i++)
     {
      m_list.InsertItem(i, _T(""));
      strText.Format(_T("%d - Hello, World!"), i+1);
      m_list.SetItemText(i, 0, strText);
      strText.Format(_T("%d - ABCDEFG"), i+1);
      m_list.SetItemText(i, 1, strText);
     }  

显示效果如下图所示:

时间: 2024-08-29 21:25:09

VC 自绘CListCtrl类的相关文章

自绘CListCtrl类,重载虚函数DrawItem

[cpp] view plain copy //自绘CListCtrl类,重载虚函数DrawItem void CNewListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item ASSERT(lpDrawItemStruct->CtlType == ODT_LISTVIEW); CDC dc; dc.Attach(lpDrawItemStruc

VC自绘ListCtrl(III) -- Alternate Row Colors for the CListCtrl

问题是这样的: 一般情况下,如果ListCtrl 的某个 Item 被选中的时候,它的背景会显示为蓝色,这时候如果我们点击一下其它的Button (也就是输入焦点转移到其它控件上去时),刚才这个被选中的item的背景会变成浅灰色,在这种情况下我要让它的背景仍然是蓝色,应该怎么实现?谢谢! http://www.codeproject.com/listctrl/coloredlistctrl.asp Alternate Row Colors for the CListCtrl Download d

VC自绘按钮

看了吕鑫老师的视频,自己试着编写了一个自绘按钮控件.YuButton.h头文件如下: #pragma once   #include "afxwin.h"   class CYuButton :public CWnd   {       private:           BOOL  m_bIsDown;           BOOL  m_bIsMove;           BOOL  _bMouseTrack;//鼠标追踪状态              CString  m_s

VC++下封装ADO类以及使用方法

操作系统:windows 7软件环境:visual studio 2008 .Microsoft SQL 2005本次目的:介绍一个已经封装的ADO类,简单说明怎么导入使用 首先声明一下,这个封装的ADO类是在[vc知识库 ]下载的,因为最近在数据库课程设计,所以对vc++下使用ADO连接数据库不是很了解,故若是本文有错误的地方的,请不吝指出.具体的ADO类各个封装功能请进入[原文地址 ]查看.在此仅介绍使用此ADO封装类的入门,如连接数据库,显示记录等.一个测试例子如下: 使用步骤:1.先从[

VC自绘控件框架

这是一个按钮自绘的框架,其他控件也类似 //.h头文件 #pragma once #include "afxwin.h" #include "MemDC.h"//封装内存绘图类 class CYuButton :public CWnd {     private: BOOL  m_bIsDown; BOOL  m_bIsMove; BOOL  _bMouseTrack; CString  m_sCaption; CFont    *m_pFont;         

vc 使用了SerialPort类的串口通信软件分析

实现串口通信,使用的类文件是SerialPort.cpp.在项目中使用mscomm控件的时候,串口连续传递若干数据后,会出现卡死的情况,关闭串口再打开,继续读取的话可以正常通信. 为了解决这个问题,想到就用SerialPort串口类来实现会好吧.当然,完全用windows的api函数来实现也可以,太麻烦吧,我也没用过.用微软的一些控件编程虽然容易了,但是也不熟悉底层. 软件主界面为: 点了自动发送单选框后: 点开始发送按钮: 一个界面就知道很好实现. 借这个例子,重点来梳理一下串口类的使用. 1

VC++ 之 第九课 类模版

这一讲跟大家介绍下类模板.类模板的指导思想跟函数模板类似. 代码复用是面向对象设计中的重要的软件开发思想,对于软件开发效率很是关键.怎样做好代码复用呢?越是通用的代码越好复用,将类型作为参数,这种程序设计类型就是参数化程序设计.模板就是C++进行参数化设计的工具.利用模板我们可以使用同一段程序处理不同类型的对象. 什么是类模板呢?类模板就是为类声明一种模板,使得类中的某些数据成员,或某些成员函数的参数,又或者是某些成员函数的返回值可以取任意的数据类型,包括基本数据类型和自定义数据类型. 类模板的

【VC】实现CWnd类的自定义,并实现自定义控件!

本例实现一个ColorWnd类,实现通过鼠标单击,刷新不同的颜色背景. class CColorWnd : public CWnd { DECLARE_DYNAMIC(CColorWnd) public: CColorWnd(); virtual ~CColorWnd(); virtual BOOL PreCreateWindow(CREATESTRUCT& cs); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg v

VC++ 之 虚基类详解

在上一节中,有两个身份证号显然是不合理的.为此,可以把class Person这个共同基类设置为虚基类,这样,从不同路径继承来的同名数据成员在内存中就只有一个拷贝,同名函数也只有一种映射. 虚基类定义方式 虚基类(virtual base class)定义方式如下:    class 派生类名:virtual 访问限定符 基类类名{...};或:    class 派生类名:访问限定符 virtual 基类类名{...}; 其中:virtual 关键字只对紧随其后的基类名起作用. 例如: