카테고리

  • 안드로이드
  • IOS
  • MFC
  • JAVA
  • AWS
  • LAMP
  • 여행&사진
  • 이런저런생활
  • 2015년 4월 20일 월요일

    MFC CListCtrl cell단위로 조절하기(DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct))

    출처 - http://blog.daum.net/z-dream/17280661

    - MFC에서 CListCtrl를 상속받아 CCustomListCtrl란 클래스를 만든다.
    CCustomListCtrl에서 DrawItem 함수를 재정의한다.

    void CCustomListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
     // 메모1 : 리스트뷰 옵션에서 Owner Draw Fixed 옵션을 활성화 시켜줘야 이 함수가 호출된다.
     // 메모2 : 이함수는 레코드마다 호출되는 함수이다.
     LONG prev_left = lpDrawItemStruct->rcItem.left;

     LV_COLUMN column_data;
     memset(&column_data, 0, sizeof(LV_COLUMN));
     column_data.mask = LVCF_WIDTH | LVCF_FMT;

    // 컬럼수 만큼 루프를 돌린다. for(int column_index = 0; GetColumn(column_index, &column_data); column_index++)
     {
      // 단계1 : 컬럼 RECT영역을 구한다.  RECT tempRC;
      {
       tempRC.top  = lpDrawItemStruct->rcItem.top;
       tempRC.bottom = lpDrawItemStruct->rcItem.bottom;
       tempRC.left  = (prev_left);
       tempRC.right = (prev_left += column_data.cx);
      }

      // 단계2 : 컬럼 데이터를 가져온다.  LV_ITEM tempLI;
      wchar_t buffer[256];
      {
       tempLI.mask   = LVIF_TEXT | LVIF_PARAM;
       tempLI.iItem  = lpDrawItemStruct->itemID;
       tempLI.iSubItem  = column_index;
       tempLI.pszText  = buffer;
       tempLI.cchTextMax = sizeof(buffer);
       VERIFY(GetItem(&tempLI));
      }

      // 단계3 : DC를 확보한다. 모든지 할수 있다...이젠...  CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
      {
       // 메모 : 컬럼별로 커스터마이징~   switch(column_index)
       {
       case 0:
        if(lpDrawItemStruct->itemState & ODS_SELECTED) // 선택되어질때    {
         pDC->FillSolidRect(&tempRC, GetSysColor(COLOR_HIGHLIGHT));
         pDC->SetTextColor(RGB(0, 0, 0));
         pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
        }
        else
        {
         pDC->FillSolidRect(&tempRC, RGB(255, 0, 0));
         pDC->SetTextColor(RGB(0, 0, 0));
         pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
        }
        break;
       case 1:
        if(lpDrawItemStruct->itemState & ODS_SELECTED) // 선택되어질때    {
         pDC->FillSolidRect(&tempRC, GetSysColor(COLOR_HIGHLIGHT));
         pDC->SetTextColor(RGB(0, 0, 0));
         pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
        }
        else
        {
         pDC->FillSolidRect(&tempRC, RGB(0, 255, 0));
         pDC->SetTextColor(RGB(125, 125, 125));
         pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
        }
        break;
       case 2:
        if(lpDrawItemStruct->itemState & ODS_SELECTED) // 선택되어질때    {
         pDC->FillSolidRect(&tempRC, GetSysColor(COLOR_HIGHLIGHT));
         pDC->SetTextColor(RGB(0, 0, 0));
         pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
        }
        else
        {
         pDC->FillSolidRect(&tempRC, RGB(0, 0, 255));
         pDC->SetTextColor(RGB(125, 125, 125));
         pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
        }
        break;
       }
      }
     }
    }


    댓글 없음 :

    댓글 쓰기