MFC Tab Control Color Change #2
Change Tab Selector? Color
override DrawItem function
void CMainTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { COLORREF m_select_border_color = RGB(255, 255, 255); COLORREF m_select_text_color = RGB(10, 155, 202); COLORREF m_unselect_border_color = RGB(255, 255, 255); COLORREF m_unselect_text_color = RGB(0, 0, 0); int select_index = lpDrawItemStruct->itemID; if (select_index < 0) return; char tab_text[40]; TC_ITEM data; data.mask = TCIF_TEXT | TCIF_IMAGE; data.pszText = tab_text; data.cchTextMax = 39; // 선택된 탭의 정보를 얻는다. if (!GetItem(select_index, &data)) return; CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rect = lpDrawItemStruct->rcItem; // Tab이 그려진 테두리의 두께만큼 위치를 보정한다. rect.top += ::GetSystemMetrics(SM_CYEDGE); pDC->SetBkMode(TRANSPARENT); // 탭이 선택된 정보에 따라 배경색을 칠해준다. if (select_index == GetCurSel()) pDC->FillSolidRect(rect, m_select_border_color); else pDC->FillSolidRect(rect, m_unselect_border_color); // 이미지를 출력한다. CImageList *p_image_list = GetImageList(); if (p_image_list != NULL && data.iImage >= 0) { rect.left += pDC->GetTextExtent(" ").cx; IMAGEINFO image_info; p_image_list->GetImageInfo(data.iImage, &image_info); CRect image_rect(image_info.rcImage); p_image_list->Draw(pDC, data.iImage, CPoint(rect.left, rect.top), ILD_TRANSPARENT); rect.left += image_rect.Width(); } CFont *p_old_font = NULL; if (select_index == GetCurSel()){ // 선택된 탭이라면... pDC->SetTextColor(m_select_text_color); // 텍스트의 위치를 보정하여 선택된 느낌이 강조되도록 만든다. rect.top -= ::GetSystemMetrics(SM_CYEDGE); pDC->DrawText(tab_text, rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER); } else { // 선택되지 않은 탭이라면... pDC->SetTextColor(m_unselect_text_color); pDC->DrawText(tab_text, rect, DT_SINGLELINE | DT_BOTTOM | DT_CENTER); } pDC->SelectObject(p_old_font); }
그리고
DrawItem 이벤트를 발생시키기 위하여
Dialog 에서
m_TabCtrl.ModifyStyle(0, TCS_OWNERDRAWFIXED);
를 불러 주어야 한다.
'Programming > MFC' 카테고리의 다른 글
MFC Control Color Change (0) | 2016.10.19 |
---|---|
MFC Bitmap Button (0) | 2016.10.18 |
MFC Tab Control Color Change #1 (1) | 2016.10.18 |
LINK : warning LNK4098: 'LIBCMT' defaultlib가 다른 라이브러리와 충돌합니다. /NODEFAULTLIB:library를 사용하십시오. (0) | 2016.10.06 |
공유 DLL에서 MFC 사용 VS 정적 라이브러리에서 MFC 사용 (0) | 2016.10.06 |