Implementing CustomDraw into Your Project

Environment: MFC

Here are the steps you need to perform to use this utility:

  1. Create the MFC project with view as ListView.
  2. Apply styles to the view .cpp file.
  3.   BOOL CMyListView::PreCreateWindow(CREATESTRUCT& cs)
      {
        //adding styles
        cs.style |= LVS_REPORT;
        return CListView::PreCreateWindow(cs);
      }
    
  4. Add columns to the view .cpp file.
  5.   void CMyListView::OnInitialUpdate()
      {
        CListView::OnInitialUpdate();
    
        CListCtrl& ListCtrl = GetListCtrl();
    
        //inserting 5 cols
        ListCtrl.InsertColumn(0, "Col-1", LVCFMT_LEFT, 75);
        ListCtrl.InsertColumn(1, "Col-2", LVCFMT_LEFT, 100);
        ListCtrl.InsertColumn(2, "Col-3", LVCFMT_LEFT, 100);
        ListCtrl.InsertColumn(3, "Col-4", LVCFMT_LEFT, 100);
        ListCtrl.InsertColumn(4, "Col-5", LVCFMT_LEFT, 100);
    
        //adding 10 items
        CString item;
        for(int i=0;i<10;i++)
        {
          item.Format("Item-%d",i);
          ListCtrl.InsertItem(i,item);
        }
      }
    
  6. Add the following line to the message map area of the view header(.h) file.
  7.     afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT*
                                  pResult);
    
  8. Add the following line to the message map area of the view .cpp file.
  9.     ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
    
  10. Add the OnCustomDraw function.
  11.         void CMyListView::OnCustomDraw(NMHDR* pNMHDR,
                                           LRESULT* pResult)
            {
             *pResult = 0;
    
               COLORREF dwColourTxt = 0;
               COLORREF dwColourBk = RGB(255, 255, 255);
    
               LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
    
               switch(lplvcd->nmcd.dwDrawStage)
               {
                  Case CDDS_PREPAINT:
                  {
                     *pResult = CDRF_NOTIFYITEMDRAW;
                     return;
                  }
    
                  // Modify item text and or background
                  Case CDDS_ITEMPREPAINT:
                  {
                     if(lplvcd->nmcd.dwItemSpec == 0)
                     {
                        dwColourTxt = RGB(255, 0, 0);     // Red
                     }
                     else if(lplvcd->nmcd.dwItemSpec == 1)
                     {
                        dwColourTxt = RGB(0, 255, 0);     // Green
                     }
                     Else
                     {
                        dwColourTxt = RGB(0, 0, 255);     // Blue
                     }
                     lplvcd->clrText = dwColourTxt;
                     // If you want the sub items the same as
                     // the item, set *pResult to CDRF_NEWFONT
                     *pResult = CDRF_NOTIFYSUBITEMDRAW;
                     return;
                  }
    
                  // Modify sub item text and or background
                  case CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:
                  {
                     // Ignore the first sub item; it is the item
                     // handled above
                     if(lplvcd->iSubItem != 0)
                     {
                        // First sub item
                        if(lplvcd->iSubItem == 1)
                        {
                           dwColourTxt = RGB(0, 127, 127);
                                         // Pale blue
                           dwColourBk = RGB(255, 255, 255);
                                         // White
                        }
                        // All sub items after the first
                        Else
                        {
                           dwColourTxt = RGB(255, 255, 255);
                                       // White
                           if(lplvcd->nmcd.dwItemSpec == 0)
                           {
                              dwColourBk = RGB(255, 0, 102);
                                       // Red
                           }
                           else if(lplvcd->nmcd.dwItemSpec == 1)
                           {
                              dwColourBk = RGB(204, 255, 153);
                                       // Green
                           }
                           Else
                           {
                              dwColourBk = RGB(0, 102, 204);
                                       // Blue
                           }
                        }
                        lplvcd->clrText = dwColourTxt;
                        lplvcd->clrTextBk = dwColourBk;
                     }
                     *pResult = CDRF_NEWFONT;
                     return;
                  }
               }
            }
    

Downloads

Download source - 19 Kb


Comments

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: December 11, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT Market pressures to move more quickly and develop innovative applications are forcing organizations to rethink how they develop and release applications. The combination of public clouds and physical back-end infrastructures are a means to get applications out faster. However, these hybrid solutions complicate DevOps adoption, with application delivery pipelines that span across complex hybrid cloud and non-cloud environments. Check out this …

  • On-demand Event Event Date: October 29, 2014 It's well understood how critical version control is for code. However, its importance to DevOps isn't always recognized. The 2014 DevOps Survey of Practice shows that one of the key predictors of DevOps success is putting all production environment artifacts into version control. In this webcast, Gene Kim discusses these survey findings and shares woeful tales of artifact management gone wrong! Gene also shares examples of how high-performing DevOps …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds