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

  • Even with today's emphasis on mobility, desktop innovation still matters. The ThinkCentre® Tiny-in-One 23 sets a new standard for transformational PC possibilities, bringing breakthrough modular all-in-one ease of use, Intel® performance, integrated security, and legendary durability together with the ThinkCentre Tiny PC family. The ThinkCentre Tiny-in-One 23 gives IT a single desktop platform that carefully balances performance, efficiency, and flexibility. The breakthrough all-in-one form factor …

  • Are you truly leading your team or simply managing them? Organizations need leaders and your team needs someone to follow. With some ongoing development, you could become that leader. Learn the top leadership qualities that inspire others to want to follow you and the direction of your company.

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date