//wparam=0 //lparam=LPDRAWITEMSTRUCT int MO_DrawMenuItem(WPARAM wParam,LPARAM lParam) { PMO_IntMenuItem pimi=NULL; int y,objidx,menuitemidx; LPDRAWITEMSTRUCT dis=(LPDRAWITEMSTRUCT)lParam; if (!isGenMenuInited) return -1; if (dis==NULL){return(FALSE);} lockmo(); if (GetAllIdx(dis->itemData,&objidx,&menuitemidx)==0){unlockmo();return(FALSE);} pimi=&MenuObjects[objidx].MenuItems[menuitemidx]; if (pimi==NULL||pimi->iconId==-1) {unlockmo();return (FALSE);} y=(dis->rcItem.bottom-dis->rcItem.top-GetSystemMetrics(SM_CYSMICON))/2+1; if (dis->itemState&ODS_SELECTED) { if (dis->itemState&ODS_CHECKED) { RECT rc; rc.left=2; rc.right=GetSystemMetrics(SM_CXSMICON)+2; rc.top=y; rc.bottom=rc.top+GetSystemMetrics(SM_CYSMICON)+2; FillRect(dis->hDC,&rc,GetSysColorBrush(COLOR_HIGHLIGHT)); ImageList_DrawEx(MenuObjects[objidx].hMenuIcons,pimi->iconId,dis->hDC,2,y,0,0,CLR_NONE,CLR_DEFAULT,ILD_SELECTED); } else ImageList_DrawEx(MenuObjects[objidx].hMenuIcons,pimi->iconId,dis->hDC,2,y,0,0,CLR_NONE,CLR_DEFAULT,ILD_FOCUS); //DrawIconEx(dis->hDC,2,y,pimi->iconId,16,16,0,0,DI_NORMAL); } else { if (dis->itemState&ODS_CHECKED) { HBRUSH hBrush; RECT rc; COLORREF menuCol,hiliteCol; rc.left=0; rc.right=GetSystemMetrics(SM_CXSMICON)+4; rc.top=y-2; rc.bottom=rc.top+GetSystemMetrics(SM_CYSMICON)+4; DrawEdge(dis->hDC,&rc,BDR_SUNKENOUTER,BF_RECT); InflateRect(&rc,-1,-1); menuCol=GetSysColor(COLOR_MENU); hiliteCol=GetSysColor(COLOR_3DHIGHLIGHT); hBrush=CreateSolidBrush(RGB((GetRValue(menuCol)+GetRValue(hiliteCol))/2,(GetGValue(menuCol)+GetGValue(hiliteCol))/2,(GetBValue(menuCol)+GetBValue(hiliteCol))/2)); FillRect(dis->hDC,&rc,GetSysColorBrush(COLOR_MENU)); DeleteObject(hBrush); ImageList_DrawEx(MenuObjects[objidx].hMenuIcons,pimi->iconId,dis->hDC,2,y,0,0,CLR_NONE,GetSysColor(COLOR_MENU),ILD_BLEND50); } else ImageList_DrawEx(MenuObjects[objidx].hMenuIcons,pimi->iconId,dis->hDC,2,y,0,0,CLR_NONE,CLR_NONE,ILD_NORMAL); //DrawIconEx(dis->hDC,2,y,pimi->iconId,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,0,DI_NORMAL); } unlockmo(); return TRUE; }
int DrawMenuItem(WPARAM, LPARAM lParam) { int y; int id; LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; if (dis->itemData != (ULONG_PTR)g_dat.hButtonIconList && dis->itemData != (ULONG_PTR)g_dat.hSearchEngineIconList && dis->itemData != (ULONG_PTR)g_dat.hChatButtonIconList) { return FALSE; } id = dis->itemID; if (id >= IDM_SEARCH_GOOGLE) { id -= IDM_SEARCH_GOOGLE; } y = (dis->rcItem.bottom - dis->rcItem.top - GetSystemMetrics(SM_CYSMICON)) / 2 + 1; if (dis->itemState & ODS_SELECTED) { if (dis->itemState & ODS_CHECKED) { RECT rc; rc.left = 2; rc.right = GetSystemMetrics(SM_CXSMICON) + 2; rc.top = y; rc.bottom = rc.top + GetSystemMetrics(SM_CYSMICON) + 2; FillRect(dis->hDC, &rc, GetSysColorBrush(COLOR_HIGHLIGHT)); ImageList_DrawEx((HIMAGELIST)dis->itemData, id, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_SELECTED); } else ImageList_DrawEx((HIMAGELIST)dis->itemData, id, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_FOCUS); } else { if (dis->itemState & ODS_CHECKED) { HBRUSH hBrush; RECT rc; COLORREF menuCol, hiliteCol; rc.left = 0; rc.right = GetSystemMetrics(SM_CXSMICON) + 4; rc.top = y - 2; rc.bottom = rc.top + GetSystemMetrics(SM_CYSMICON) + 4; DrawEdge(dis->hDC, &rc, BDR_SUNKENOUTER, BF_RECT); InflateRect(&rc, -1, -1); menuCol = GetSysColor(COLOR_MENU); hiliteCol = GetSysColor(COLOR_3DHIGHLIGHT); hBrush = CreateSolidBrush(RGB ((GetRValue(menuCol) + GetRValue(hiliteCol)) / 2, (GetGValue(menuCol) + GetGValue(hiliteCol)) / 2, (GetBValue(menuCol) + GetBValue(hiliteCol)) / 2)); FillRect(dis->hDC, &rc, hBrush); DeleteObject(hBrush); ImageList_DrawEx((HIMAGELIST)dis->itemData, id, dis->hDC, 2, y, 0, 0, CLR_NONE, GetSysColor(COLOR_MENU), ILD_BLEND25); } else ImageList_DrawEx((HIMAGELIST)dis->itemData, id, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_NONE, ILD_NORMAL); } return TRUE; }
int Icon::add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color, HBRUSH bk_brush) const { int ret; if (_itype == IT_SYSCACHE) { HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist(); int cx, cy; ImageList_GetIconSize(himl, &cx, &cy); HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); HDC hdc = CreateCompatibleDC(hdc_wnd); HBITMAP hbmp_old = SelectBitmap(hdc, hbmp); ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); SelectBitmap(hdc, hbmp_old); DeleteDC(hdc); ret = ImageList_Add(himl, hbmp, 0); DeleteObject(hbmp); } else ret = ImageList_AddAlphaIcon(himl, _hicon, bk_brush, hdc_wnd); return ret; }
void CEmoticons::Draw(CDC* pDC, int nIndex, int nX, int nY, COLORREF crBack) { if ( m_pTokens == NULL ) return; ImageList_DrawEx( m_pImage.m_hImageList, nIndex, pDC->GetSafeHdc(), nX, nY, 16, 16, crBack, CLR_DEFAULT, ILD_NORMAL ); // if ( crBack != CLR_NONE ) pDC->ExcludeClipRect( nX, nY, nX + 16, nY + 16 ); }
BOOL CShellIcons::Draw(CDC* pDC, int nIcon, int nSize, int nX, int nY, COLORREF crBack, BOOL bSelected) const { HIMAGELIST hImages; switch ( nSize ) { case 16: hImages = m_i16.GetSafeHandle(); break; // case 24: // hImages = m_i24.GetSafeHandle(); // break; case 32: hImages = m_i32.GetSafeHandle(); break; case 48: hImages = m_i48.GetSafeHandle(); break; default: ASSERT( FALSE ); return FALSE; } return ImageList_DrawEx( hImages, nIcon, pDC->GetSafeHdc(), nX, nY, nSize, nSize, crBack, CLR_DEFAULT, // bSelected ? Colors.m_crHighlight : CLR_NONE, bSelected ? ILD_SELECTED : ILD_NORMAL ); }
BOOL CShellIcons::Draw(CDC* pDC, int nIcon, int nSize, int nX, int nY, COLORREF crBack, COLORREF crBlend, UINT nStyle) const { HIMAGELIST hImages; switch ( nSize ) { case 16: hImages = m_i16.GetSafeHandle(); break; // case 24: // hImages = m_i24.GetSafeHandle(); // break; case 32: hImages = m_i32.GetSafeHandle(); break; case 48: hImages = m_i48.GetSafeHandle(); break; default: ASSERT( FALSE ); return FALSE; } return ImageList_DrawEx( hImages, nIcon, pDC->GetSafeHdc(), nX, nY, nSize, nSize, crBack, crBlend, nStyle ); }
void Icon::draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const { if (_itype == IT_SYSCACHE) ImageList_DrawEx(g_Globals._icon_cache.get_sys_imagelist(), _sys_idx, hdc, x, y, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); else DrawIconEx(hdc, x, y, _hicon, cx, cy, 0, bk_brush, DI_NORMAL); }
//wparam=0 //lparam=LPDRAWITEMSTRUCT int MO_DrawMenuItem( LPDRAWITEMSTRUCT dis ) { if ( !bIsGenMenuInited ) return -1; if ( dis == NULL ) return FALSE; EnterCriticalSection( &csMenuHook ); PMO_IntMenuItem pimi = MO_GetIntMenuItem(( HGENMENU )dis->itemData ); if ( pimi == NULL || pimi->iconId == -1 ) { LeaveCriticalSection( &csMenuHook ); return FALSE; } int y = (dis->rcItem.bottom - dis->rcItem.top - GetSystemMetrics(SM_CYSMICON))/2+1; if ( dis->itemState & ODS_SELECTED ) { if ( dis->itemState & ODS_CHECKED ) { RECT rc; rc.left = 2; rc.right = GetSystemMetrics(SM_CXSMICON)+2; rc.top = y; rc.bottom = rc.top+GetSystemMetrics(SM_CYSMICON)+2; FillRect(dis->hDC, &rc, GetSysColorBrush( COLOR_HIGHLIGHT )); ImageList_DrawEx( pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_SELECTED ); } else ImageList_DrawEx( pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_FOCUS ); } else { if ( dis->itemState & ODS_CHECKED) { RECT rc; rc.left = 0; rc.right = GetSystemMetrics(SM_CXSMICON)+4; rc.top = y-2; rc.bottom = rc.top + GetSystemMetrics(SM_CYSMICON)+4; DrawEdge(dis->hDC,&rc,BDR_SUNKENOUTER,BF_RECT); InflateRect(&rc,-1,-1); COLORREF menuCol = GetSysColor(COLOR_MENU); COLORREF hiliteCol = GetSysColor(COLOR_3DHIGHLIGHT); HBRUSH hBrush = CreateSolidBrush(RGB((GetRValue(menuCol)+GetRValue(hiliteCol))/2,(GetGValue(menuCol)+GetGValue(hiliteCol))/2,(GetBValue(menuCol)+GetBValue(hiliteCol))/2)); FillRect(dis->hDC,&rc,GetSysColorBrush(COLOR_MENU)); DeleteObject(hBrush); ImageList_DrawEx(pimi->parent->m_hMenuIcons,pimi->iconId,dis->hDC,2,y,0,0,CLR_NONE,GetSysColor(COLOR_MENU),ILD_BLEND50); } else ImageList_DrawEx(pimi->parent->m_hMenuIcons,pimi->iconId,dis->hDC,2,y,0,0,CLR_NONE,CLR_NONE,ILD_NORMAL); } LeaveCriticalSection( &csMenuHook ); return TRUE; }
MIR_APP_DLL(BOOL) Menu_DrawItem(DRAWITEMSTRUCT *dis) { if (!bIsGenMenuInited) return FALSE; if (dis == NULL) return FALSE; mir_cslock lck(csMenuHook); TMO_IntMenuItem *pimi = MO_GetIntMenuItem((HGENMENU)dis->itemData); if (pimi == NULL || pimi->iconId == -1) return FALSE; int y = (dis->rcItem.bottom - dis->rcItem.top - g_iIconSY) / 2 + 1; if (dis->itemState & ODS_SELECTED) { if (dis->itemState & ODS_CHECKED) { RECT rc; rc.left = 2; rc.right = g_iIconSX + 2; rc.top = y; rc.bottom = rc.top + g_iIconSY + 2; FillRect(dis->hDC, &rc, GetSysColorBrush(COLOR_HIGHLIGHT)); ImageList_DrawEx(pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_SELECTED); } else ImageList_DrawEx(pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_FOCUS); } else { if (dis->itemState & ODS_CHECKED) { RECT rc; rc.left = 0; rc.right = g_iIconSX + 4; rc.top = y - 2; rc.bottom = rc.top + g_iIconSY + 4; DrawEdge(dis->hDC, &rc, BDR_SUNKENOUTER, BF_RECT); InflateRect(&rc, -1, -1); COLORREF menuCol = GetSysColor(COLOR_MENU); COLORREF hiliteCol = GetSysColor(COLOR_3DHIGHLIGHT); HBRUSH hBrush = CreateSolidBrush(RGB((GetRValue(menuCol) + GetRValue(hiliteCol)) / 2, (GetGValue(menuCol) + GetGValue(hiliteCol)) / 2, (GetBValue(menuCol) + GetBValue(hiliteCol)) / 2)); FillRect(dis->hDC, &rc, GetSysColorBrush(COLOR_MENU)); DeleteObject(hBrush); ImageList_DrawEx(pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, GetSysColor(COLOR_MENU), ILD_BLEND50); } else ImageList_DrawEx(pimi->parent->m_hMenuIcons, pimi->iconId, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_NONE, ILD_NORMAL); } return TRUE; }
void CLinerHeaderBar::PaintHeader(CDC* pDC, CRect& rcBar, BOOL bTransparent) { LPCTSTR xTitle = m_strTitle; CFont* pOldFont = (CFont*)pDC->SelectObject( &CoolInterface.m_fntBold ); CSize szText = pDC->GetTextExtent( xTitle ); pDC->SetTextColor( CoolInterface.m_crCmdText ); pDC->SetBkColor( CoolInterface.m_crMidtone ); int nMiddle = ( rcBar.top + rcBar.bottom ) / 2; if ( bTransparent ) { ImageList_DrawEx( CoolInterface.m_pImages, 22, pDC->GetSafeHdc(), rcBar.left + 4, nMiddle - 8, 16, 16, CLR_NONE, CLR_NONE, ILD_NORMAL ); pDC->SetBkMode( TRANSPARENT ); pDC->ExtTextOut( rcBar.left + 22, nMiddle - szText.cy / 2, ETO_CLIPPED, &rcBar, xTitle, NULL ); } else { pDC->SetBkMode( OPAQUE ); ImageList_DrawEx( CoolInterface.m_pImages, 22, pDC->GetSafeHdc(), rcBar.left + 4, nMiddle - 8, 16, 16, CoolInterface.m_crMidtone, CLR_NONE, ILD_NORMAL ); pDC->ExcludeClipRect( rcBar.left + 4, nMiddle - 8, rcBar.left + 20, nMiddle + 8 ); pDC->FillSolidRect( rcBar.left, rcBar.top, 20, rcBar.Height(), CoolInterface.m_crMidtone ); rcBar.left += 20; pDC->ExtTextOut( rcBar.left + 2, nMiddle - szText.cy / 2, ETO_CLIPPED|ETO_OPAQUE, &rcBar, xTitle, NULL ); rcBar.left -= 20; } pDC->SelectObject( pOldFont ); }
void CBrowseTreeItem::Paint(CDC& dc, CRect& rc, BOOL bTarget, COLORREF crBack) const { if ( crBack == CLR_NONE ) crBack = CoolInterface.m_crWindow; if ( m_nCount ) { ImageList_DrawEx( ShellIcons.GetHandle( 16 ), m_bExpanded ? SHI_MINUS : SHI_PLUS, dc.GetSafeHdc(), rc.left, rc.top, 16, 16, crBack, CLR_NONE, ILD_NORMAL ); } else { dc.FillSolidRect( rc.left, rc.top, 16, 16, crBack ); } int nImage = ( m_bExpanded && m_nCount ) ? SHI_FOLDER_OPEN : SHI_FOLDER_CLOSED; if ( m_nIcon16 >= 0 ) nImage = m_nIcon16; UINT nIconStyle = ( m_bSelected || bTarget ) ? ILD_SELECTED : ILD_NORMAL; ImageList_DrawEx( ShellIcons.GetHandle( 16 ), nImage, dc.GetSafeHdc(), rc.left + 16, rc.top, 16, 16, crBack, CLR_DEFAULT, nIconStyle ); crBack = ( m_bSelected || bTarget ) ? CoolInterface.m_crHighlight : crBack; COLORREF crText = ( m_bSelected || bTarget ) ? CoolInterface.m_crHiText : CoolInterface.m_crText; dc.SetTextColor( crText ); dc.SetBkColor( crBack ); dc.SetBkMode( OPAQUE ); rc.left += 32; dc.ExtTextOut( rc.left + 3, rc.top + 1, ETO_OPAQUE|ETO_CLIPPED, &rc, m_sText, NULL ); rc.left -= 32; }
HBITMAP Icon::create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const { if (_itype == IT_SYSCACHE) { HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist(); int cx, cy; ImageList_GetIconSize(himl, &cx, &cy); HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); HDC hdc = CreateCompatibleDC(hdc_wnd); HBITMAP hbmp_old = SelectBitmap(hdc, hbmp); ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); SelectBitmap(hdc, hbmp_old); DeleteDC(hdc); return hbmp; } else return create_bitmap_from_icon(_hicon, hbrBkgnd, hdc_wnd); }
void ImageLibrary::drawAlpha(HDC hDC, int index, int x, int y, int width, int height) { Locker lock_(lock); if (index <= 0 || index > ilist.length()) return; if (ilist[index]->hAlphaBitmap == NULL) ilist[index]->hAlphaBitmap = ilist[index]->image->createAlphaBitmap(hImageDC); if (ilist[index]->hAlphaBitmap) { SelectObject(hImageDC, ilist[index]->hAlphaBitmap); BLENDFUNCTION bf; bf.BlendOp = AC_SRC_OVER; bf.BlendFlags = 0; bf.SourceConstantAlpha = 255; bf.AlphaFormat = AC_SRC_ALPHA; AlphaBlend(hDC, x, y, width, height, hImageDC, 0, 0, width, height, bf); } else ImageList_DrawEx(list, index, hDC, x, y, width, height, CLR_NONE, CLR_NONE, ILD_NORMAL); }
void CEDClock::DrawClockBit(BYTE nDigit, int nPos) { CRect rc; GetClientRect( &rc ); CClientDC dc( this ); CBitmap bmBuf, *pbmOld; CDC dcBuf; dcBuf.CreateCompatibleDC( &dc ); bmBuf.CreateCompatibleBitmap( &dc, rc.Width(), rc.Height() ); pbmOld = (CBitmap*)dcBuf.SelectObject( &bmBuf ); dcBuf.BitBlt(rc.left,rc.top,rc.right,rc.bottom,&dc,0,0,SRCCOPY); //dcBuf.FillSolidRect(0,0,rc.Width(), rc.Height(),RGB(255,255,255)); ImageList_DrawEx( m_pClock, nDigit, dcBuf.GetSafeHdc(), 13*nPos, 0, 13, 23, CLR_DEFAULT, CLR_DEFAULT, ILD_NORMAL ); dc.BitBlt( 0, 0, rc.Width(), rc.Height(), &dcBuf, 0, 0, SRCCOPY ); dcBuf.SelectObject( pbmOld ); dcBuf.DeleteDC(); bmBuf.DeleteObject(); }
void CLibraryTipCtrl::DrawThumb(CDC* pDC, CRect& rcThumb) { pDC->Draw3dRect( &rcThumb, CoolInterface.m_crTipBorder, CoolInterface.m_crTipBorder ); rcThumb.DeflateRect( 1, 1 ); if ( m_bmThumb.m_hObject ) { CDC dcMem; dcMem.CreateCompatibleDC( pDC ); CBitmap* pOld = (CBitmap*)dcMem.SelectObject( &m_bmThumb ); CPoint ptImage( ( rcThumb.left + rcThumb.right ) / 2 - m_szThumb.cx / 2, ( rcThumb.top + rcThumb.bottom ) / 2 - m_szThumb.cy / 2 ); pDC->BitBlt( ptImage.x, ptImage.y, m_szThumb.cx, m_szThumb.cy, &dcMem, 0, 0, SRCCOPY ); pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + m_szThumb.cx, ptImage.y + m_szThumb.cy ); dcMem.SelectObject( pOld ); pDC->FillSolidRect( &rcThumb, m_crLight ); } else { CPoint pt( ( rcThumb.left + rcThumb.right ) / 2 - 24, ( rcThumb.top + rcThumb.bottom ) / 2 - 24 ); ImageList_DrawEx( ShellIcons.GetHandle( 48 ), m_nIcon, pDC->GetSafeHdc(), pt.x, pt.y, 48, 48, m_crLight, CLR_NONE, ILD_NORMAL ); pDC->ExcludeClipRect( pt.x, pt.y, pt.x + 48, pt.y + 48 ); pDC->FillSolidRect( &rcThumb, m_crLight ); } }
void MFCSimpleTypeView::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { int m_bClientWidthSel = TRUE; int m_cxClient = 0; int m_cxStateImageOffset = 0; COLORREF m_clrText = ::GetSysColor(COLOR_WINDOWTEXT); COLORREF m_clrTextBk = ::GetSysColor(COLOR_WINDOW); COLORREF m_clrBkgnd = ::GetSysColor(COLOR_WINDOW); CListCtrl& listCtrl=GetListCtrl(); CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rcItem(lpDrawItemStruct->rcItem); UINT uiFlags = ILD_TRANSPARENT; CImageList* pImageList; int nItem = lpDrawItemStruct->itemID; BOOL bFocus = (GetFocus() == this); COLORREF clrTextSave, clrBkSave; COLORREF clrImage = m_clrBkgnd; static _TCHAR szBuff[MAX_PATH]; LPCTSTR pszText; StabEnt *itemSym = SymForItem(nItem); // get item data LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE; lvi.iItem = nItem; lvi.iSubItem = 0; lvi.pszText = szBuff; lvi.cchTextMax = sizeof(szBuff); lvi.stateMask = 0xFFFF; // get all state flags listCtrl.GetItem(&lvi); BOOL bSelected = (bFocus || (GetStyle() & LVS_SHOWSELALWAYS)) && lvi.state & LVIS_SELECTED; bSelected = bSelected || (lvi.state & LVIS_DROPHILITED); // set colors if item is selected CRect rcAllLabels; listCtrl.GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS); CRect rcLabel; listCtrl.GetItemRect(nItem, rcLabel, LVIR_BOUNDS); // listCtrl.GetItemRect(nItem, rcLabel, LVIR_LABEL); rcAllLabels.left = rcLabel.left; if (m_bClientWidthSel && rcAllLabels.right<m_cxClient) rcAllLabels.right = m_cxClient; if (bSelected) { clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(COLOR_HIGHLIGHT))); } else pDC->FillRect(rcAllLabels, &CBrush(m_clrTextBk)); // set color and mask for the icon if (lvi.state & LVIS_CUT) { clrImage = m_clrBkgnd; uiFlags |= ILD_BLEND50; } else if (bSelected) { clrImage = ::GetSysColor(COLOR_HIGHLIGHT); uiFlags |= ILD_BLEND50; } // draw state icon UINT nStateImageMask = lvi.state & LVIS_STATEIMAGEMASK; if (nStateImageMask) { int nImage = (nStateImageMask>>12) - 1; pImageList = listCtrl.GetImageList(LVSIL_STATE); if (pImageList) { pImageList->Draw(pDC, nImage, CPoint(rcItem.left, rcItem.top), ILD_TRANSPARENT); } } // draw normal and overlay icon /* CRect rcIcon; ListCtrl.GetItemRect(nItem, rcIcon, LVIR_ICON); pImageList = listCtrl.GetImageList(LVSIL_SMALL); if (pImageList) { UINT nOvlImageMask=lvi.state & LVIS_OVERLAYMASK; if (rcItem.left<rcItem.right-1) { ImageList_DrawEx(pImageList->m_hImageList, lvi.iImage, pDC->m_hDC,rcIcon.left,rcIcon.top, 16, 16, m_clrBkgnd, clrImage, uiFlags | nOvlImageMask); } } */ // draw item label // listCtrl.GetItemRect(nItem, rcItem, LVIR_LABEL); LV_COLUMN lvc; lvc.mask = LVCF_FMT | LVCF_WIDTH; listCtrl.GetItemRect(nItem, rcItem, LVIR_BOUNDS); listCtrl.GetColumn(0, &lvc); rcItem.right = lvc.cx; // pszText = MakeShortString(pDC, szBuff, // rcItem.right-rcItem.left, 2*OFFSET_FIRST); pszText = szBuff; rcLabel = rcItem; rcLabel.left += OFFSET_FIRST; rcLabel.right -= OFFSET_FIRST; pDC->SetTextColor(rgb_black); pDC->DrawText(pszText,-1,rcLabel,DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER); // draw labels for extra columns if (itemSym) { UINT nOvlImageMask=lvi.state & LVIS_OVERLAYMASK; // type listCtrl.GetColumn(1, &lvc); rcItem.left = rcItem.right; rcItem.right += lvc.cx; rcLabel = rcItem; rcLabel.left += OFFSET_OTHER; rcLabel.right -= OFFSET_OTHER; string tnm = findTypeName(itemSym->type); if (tnm.size()) { pDC->SetTextColor(rgb_blue); long h = pDC->DrawText(tnm.c_str() , -1, rcLabel, DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER); } // length listCtrl.GetColumn(2, &lvc); rcItem.left = rcItem.right; rcItem.right += lvc.cx; // fprintf(stderr, "%d %d %d\n", pszText, itemSym->type, lvc.cx); rcLabel = rcItem; rcLabel.left += OFFSET_OTHER; rcLabel.right -= OFFSET_OTHER; if (itemSym->indirection > 0) { char buf[120]; buf[0] = 0; for (short i=1; i<itemSym->indirection; i++) { char nbuf[10]; sprintf(nbuf, "%s%d", i>1?",":"",itemSym->size[i]); strcat(buf, nbuf); } pDC->SetTextColor(rgb_blue); pDC->DrawText(buf, -1, rcLabel, DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER); } // controller listCtrl.GetColumn(3, &lvc); rcItem.left = rcItem.right; rcItem.right += lvc.cx; if (itemSym->controlMode != StabEnt::DISPLAY_NOT) { ImageList_DrawEx(images, itemSym->controlMode == StabEnt::DISPLAY_CTL ? 0 : itemSym->controlMode == StabEnt::DISPLAY_DISP? 2 : 0, pDC->m_hDC,rcItem.left,rcItem.top, 16, 16, m_clrBkgnd, clrImage, uiFlags | nOvlImageMask); } // envelope listCtrl.GetColumn(4, &lvc); rcItem.left = rcItem.right; rcItem.right += lvc.cx; if (itemSym->isEnveloped) { ImageList_DrawEx(images, 1 /* which one */, pDC->m_hDC,rcItem.left,rcItem.top, 16, 16, m_clrBkgnd, clrImage, uiFlags | nOvlImageMask); } } /* for(int nColumn = 1; listCtrl.GetColumn(nColumn, &lvc); nColumn++) { rcItem.left = rcItem.right; rcItem.right += lvc.cx; int nRetLen = listCtrl.GetItemText(nItem, nColumn, szBuff, sizeof(szBuff)); if (nRetLen == 0) continue; // pszText = MakeShortString(pDC, szBuff, // rcItem.right - rcItem.left, 2*OFFSET_OTHER); pszText = szBuff; UINT nJustify = DT_LEFT; if(pszText == szBuff) { switch(lvc.fmt & LVCFMT_JUSTIFYMASK) { case LVCFMT_RIGHT: nJustify = DT_RIGHT; break; case LVCFMT_CENTER: nJustify = DT_CENTER; break; default: break; } } rcLabel = rcItem; rcLabel.left += OFFSET_OTHER; rcLabel.right -= OFFSET_OTHER; pDC->DrawText(pszText, -1, rcLabel, nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER); }*/ // draw focus rectangle if item has focus if (lvi.state & LVIS_FOCUSED && bFocus) pDC->DrawFocusRect(rcAllLabels); // set original colors if item was selected if (bSelected) { pDC->SetTextColor(clrTextSave); pDC->SetBkColor(clrBkSave); } }
void CIconButtonCtrl::OnPaint() { CPaintDC dc( this ); BOOL bSkinned( FALSE ); COLORREF crBack( CLR_NONE ); CString strText; CPoint ptIcon; CRect rc; GetClientRect( &rc ); GetWindowText( strText ); BOOL bTextButton = ( strText.IsEmpty() == false ); ptIcon.x = bTextButton ? ( rc.left + 5 ) : ( ( rc.left + rc.right ) / 2 - 8 ); // Rich Button (left) or Icon Button (centered) ptIcon.y = ( rc.top + rc.bottom ) / 2 - 8; if ( rc.Width() < 20 || rc.Height() < 20 ) // Don't skin special case small buttons { dc.FillSolidRect( ptIcon.x - 1, ptIcon.y - 1, rc.right + 1, rc.bottom + 1, Colors.m_crTaskBoxClient ); if ( m_bDown != m_bCapture ) ptIcon.Offset( -1, -1 ); ImageList_DrawEx( m_pImageList.m_hImageList, 0, dc.GetSafeHdc(), ptIcon.x, ptIcon.y, 0, 0, CLR_NONE, CLR_NONE, ( ! IsWindowEnabled() || ( m_bDown && m_bCapture ) ) ? ILD_BLEND50 : ILD_NORMAL ); return; } if ( m_bDown && m_bCapture ) // Pressed { if ( ! bTextButton && Images.DrawButtonState( &dc, &rc, ICONBUTTON_PRESS ) ) // IconButton.Press { bSkinned = TRUE; } else if ( Images.DrawButtonState( &dc, &rc, RICHBUTTON_PRESS ) ) // RichButton.Press { dc.SetBkMode( TRANSPARENT ); bSkinned = TRUE; rc.left++; } else { dc.Draw3dRect( &rc, Colors.m_crBorder, Colors.m_crBorder ); crBack = Colors.m_crBackCheckSel; rc.DeflateRect( 1, 1 ); } ImageList_DrawEx( m_pImageList.m_hImageList, 0, dc.GetSafeHdc(), ptIcon.x, ptIcon.y, 0, 0, crBack, CLR_NONE, ILD_BLEND50 ); } else if ( m_bDown != m_bCapture ) // Hover (or Unpressed) { if ( ! bTextButton && Images.DrawButtonState( &dc, &rc, ICONBUTTON_HOVER ) ) // IconButton.Hover { bSkinned = TRUE; } else if ( Images.DrawButtonState( &dc, &rc, RICHBUTTON_HOVER ) ) // RichButton.Hover { dc.SetBkMode( TRANSPARENT ); bSkinned = TRUE; rc.left++; } else { dc.Draw3dRect( &rc, Colors.m_crBorder, Colors.m_crBorder ); crBack = Colors.m_crBackSel; rc.DeflateRect( 1, 1 ); ptIcon.Offset( -1, -1 ); dc.FillSolidRect( ptIcon.x, ptIcon.y, 18, 2, crBack ); dc.FillSolidRect( ptIcon.x, ptIcon.y + 2, 2, 16, crBack ); ptIcon.Offset( 2, 2 ); dc.SetTextColor( Colors.m_crShadow ); ImageList_DrawEx( m_pImageList.m_hImageList, 0, dc.GetSafeHdc(), ptIcon.x, ptIcon.y, 0, 0, crBack, CLR_NONE, ILD_MASK ); ptIcon.Offset( -1, -1 ); } ptIcon.Offset( -1, -1 ); ImageList_DrawEx( m_pImageList.m_hImageList, 0, dc.GetSafeHdc(), ptIcon.x, ptIcon.y, 0, 0, CLR_NONE, CLR_NONE, ILD_NORMAL ); dc.ExcludeClipRect( ptIcon.x, ptIcon.y, ptIcon.x + 16, ptIcon.y + 16 ); ptIcon.Offset( 1, 1 ); } else if ( IsWindowEnabled() && GetFocus() == this ) // Button w/ Cursor Focus { if ( ! bTextButton && Images.DrawButtonState( &dc, &rc, ICONBUTTON_ACTIVE ) ) // IconButton.Active { bSkinned = TRUE; } else if ( Images.DrawButtonState( &dc, &rc, RICHBUTTON_ACTIVE ) ) // RichButton.Active { dc.SetBkMode( TRANSPARENT ); bSkinned = TRUE; rc.left++; } else { dc.Draw3dRect( &rc, Colors.m_crBorder, Colors.m_crBorder ); crBack = Colors.m_crBackNormal; rc.DeflateRect( 1, 1 ); } ImageList_DrawEx( m_pImageList.m_hImageList, 0, dc.GetSafeHdc(), ptIcon.x, ptIcon.y, 0, 0, crBack, CLR_NONE, ILD_NORMAL ); } else if ( IsWindowEnabled() ) // Button Default w/o Focus { if ( ! bTextButton && Images.DrawButtonState( &dc, &rc, ICONBUTTON_DEFAULT ) ) // IconButton { bSkinned = TRUE; } else if ( Images.DrawButtonState( &dc, &rc, RICHBUTTON_DEFAULT ) ) // RichButton { dc.SetBkMode( TRANSPARENT ); bSkinned = TRUE; rc.left++; } else { dc.Draw3dRect( &rc, Colors.m_crShadow, Colors.m_crShadow ); crBack = Colors.m_crBackNormal; rc.DeflateRect( 1, 1 ); } ImageList_DrawEx( m_pImageList.m_hImageList, 0, dc.GetSafeHdc(), ptIcon.x, ptIcon.y, 0, 0, crBack, CLR_NONE, ILD_NORMAL ); } else // Disabled { if ( ! bTextButton && Images.DrawButtonState( &dc, &rc, ICONBUTTON_DISABLED ) ) // IconButton.Disabled { bSkinned = TRUE; } else if ( Images.DrawButtonState( &dc, &rc, RICHBUTTON_DISABLED ) ) // RichButton.Disabled { dc.SetBkMode( TRANSPARENT ); bSkinned = TRUE; rc.left++; } else { dc.Draw3dRect( &rc, Colors.m_crShadow, Colors.m_crShadow ); crBack = Colors.m_crMidtone; rc.DeflateRect( 1, 1 ); } dc.SetTextColor( Colors.m_crDisabled ); dc.SetBkColor( crBack ); ImageList_DrawEx( m_pImageList.m_hImageList, 0, dc.GetSafeHdc(), ptIcon.x, ptIcon.y, 0, 0, crBack, Colors.m_crDisabled, ILD_BLEND50 ); // CLR_NONE, ILD_MASK ? } if ( ! bSkinned ) dc.ExcludeClipRect( ptIcon.x, ptIcon.y, ptIcon.x + 16, ptIcon.y + 16 ); if ( bTextButton ) // strText { rc.left += ptIcon.x + 16 + 2; // Text Offset CFont* pOldFont = (CFont*)dc.SelectObject( &CoolInterface.m_fntNormal ); if ( ! bSkinned ) dc.SetBkColor( crBack ); dc.SetTextColor( IsWindowEnabled() ? Colors.m_crCmdText : Colors.m_crDisabled ); dc.ExtTextOut( rc.left, ptIcon.y + 1, ETO_CLIPPED|( ! bSkinned ? ETO_OPAQUE : 0 ), &rc, strText, NULL ); dc.SelectObject( pOldFont ); if ( ! bSkinned ) // Fill icon area not covered by opaque text dc.FillSolidRect( rc.left - ( ptIcon.x + 16 + 2 ), rc.top, rc.left, rc.bottom - 1, crBack ); } else if ( ! bSkinned ) dc.FillSolidRect( &rc, crBack ); }
void Picker_HandleDrawItem(HWND hWnd, LPDRAWITEMSTRUCT lpDrawItemStruct) { struct PickerInfo *pPickerInfo; HDC hDC = lpDrawItemStruct->hDC; RECT rcItem = lpDrawItemStruct->rcItem; UINT uiFlags = ILD_TRANSPARENT; HIMAGELIST hImageList; int nItem = lpDrawItemStruct->itemID; COLORREF clrTextSave = 0; COLORREF clrBkSave = 0; COLORREF clrImage = GetSysColor(COLOR_WINDOW); static TCHAR szBuff[MAX_PATH]; BOOL bFocus = (GetFocus() == hWnd); LPCTSTR pszText; UINT nStateImageMask = 0; BOOL bSelected = 0; LV_COLUMN lvc; LV_ITEM lvi; RECT rcAllLabels; RECT rcLabel; RECT rcIcon; int offset = 0; SIZE size; int i = 0, j = 0; int nColumn = 0; int nColumnMax = 0; int *order; BOOL bDrawAsChild = 0; int indent_space = 0; BOOL bColorChild = FALSE; BOOL bParentFound = FALSE; int nParent = 0; HBITMAP hBackground = GetBackgroundBitmap(); MYBITMAPINFO *pbmDesc = GetBackgroundInfo(); BOOL res = 0; pPickerInfo = GetPickerInfo(hWnd); order = (int*)malloc(pPickerInfo->nColumnCount * sizeof(*order)); if (!order) return; nColumnMax = Picker_GetNumColumns(hWnd); if (GetUseOldControl()) { pPickerInfo->pCallbacks->pfnGetColumnOrder(order); } else { /* Get the Column Order and save it */ res = ListView_GetColumnOrderArray(hWnd, nColumnMax, order); /* Disallow moving column 0 */ if (order[0] != 0) { for (i = 0; i < nColumnMax; i++) { if (order[i] == 0) { order[i] = order[0]; order[0] = 0; } } res = ListView_SetColumnOrderArray(hWnd, nColumnMax, order); } } /* Labels are offset by a certain amount */ /* This offset is related to the width of a space character */ GetTextExtentPoint32(hDC, TEXT(" "), 1, &size); offset = size.cx; lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM; lvi.iItem = nItem; lvi.iSubItem = order[0]; lvi.pszText = szBuff; lvi.cchTextMax = sizeof(szBuff) / sizeof(szBuff[0]); lvi.stateMask = 0xFFFF; /* get all state flags */ res = ListView_GetItem(hWnd, &lvi); bSelected = ((lvi.state & LVIS_DROPHILITED) || ( (lvi.state & LVIS_SELECTED) && ((bFocus) || (GetWindowLong(hWnd, GWL_STYLE) & LVS_SHOWSELALWAYS)))); /* figure out if we indent and draw grayed */ if (pPickerInfo->pCallbacks->pfnFindItemParent) nParent = pPickerInfo->pCallbacks->pfnFindItemParent(hWnd, lvi.lParam); else nParent = -1; bDrawAsChild = (pPickerInfo->pCallbacks->pfnGetViewMode() == VIEW_GROUPED && (nParent >= 0)); /* only indent if parent is also in this view */ if ((nParent >= 0) && bDrawAsChild) { for (i = 0; i < ListView_GetItemCount(hWnd); i++) { lvi.mask = LVIF_PARAM; lvi.iItem = i; res = ListView_GetItem(hWnd, &lvi); if (lvi.lParam == nParent) { bParentFound = TRUE; break; } } } if (pPickerInfo->pCallbacks->pfnGetOffsetChildren && pPickerInfo->pCallbacks->pfnGetOffsetChildren()) { if (!bParentFound && bDrawAsChild) { /*Reset it, as no Parent is there*/ bDrawAsChild = FALSE; bColorChild = TRUE; } else { nParent = -1; bParentFound = FALSE; } } res = ListView_GetItemRect_Modified(hWnd, nItem, &rcAllLabels, LVIR_BOUNDS); res = ListView_GetItemRect_Modified(hWnd, nItem, &rcLabel, LVIR_LABEL); rcAllLabels.left = rcLabel.left; if (hBackground != NULL) { RECT rcClient; HRGN rgnBitmap; RECT rcTmpBmp = rcItem; RECT rcFirstItem; HPALETTE hPAL; HDC htempDC; HBITMAP oldBitmap; htempDC = CreateCompatibleDC(hDC); oldBitmap = (HBITMAP)SelectObject(htempDC, hBackground); GetClientRect(hWnd, &rcClient); rcTmpBmp.right = rcClient.right; /* We also need to check whether it is the last item The update region has to be extended to the bottom if it is */ if (nItem == ListView_GetItemCount(hWnd) - 1) rcTmpBmp.bottom = rcClient.bottom; rgnBitmap = CreateRectRgnIndirect(&rcTmpBmp); SelectClipRgn(hDC, rgnBitmap); DeleteBitmap(rgnBitmap); hPAL = GetBackgroundPalette(); if (hPAL == NULL) hPAL = CreateHalftonePalette(hDC); if (GetDeviceCaps(htempDC, RASTERCAPS) & RC_PALETTE && hPAL != NULL) { SelectPalette(htempDC, hPAL, FALSE); RealizePalette(htempDC); } res = ListView_GetItemRect_Modified(hWnd, 0, &rcFirstItem, LVIR_BOUNDS); for (i = rcFirstItem.left; i < rcClient.right; i += pbmDesc->bmWidth) for (j = rcFirstItem.top; j < rcClient.bottom; j += pbmDesc->bmHeight) BitBlt(hDC, i, j, pbmDesc->bmWidth, pbmDesc->bmHeight, htempDC, 0, 0, SRCCOPY); SelectObject(htempDC, oldBitmap); DeleteDC(htempDC); if (GetBackgroundPalette() == NULL) { DeletePalette(hPAL); hPAL = NULL; } } indent_space = 0; if (bDrawAsChild) { RECT rect; res = ListView_GetItemRect_Modified(hWnd, nItem, &rect, LVIR_ICON); /* indent width of icon + the space between the icon and text * so left of clone icon starts at text of parent */ indent_space = rect.right - rect.left + offset; } rcAllLabels.left += indent_space; if (bSelected) { HBRUSH hBrush; HBRUSH hOldBrush; if (bFocus) { clrTextSave = SetTextColor(hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); clrBkSave = SetBkColor(hDC, GetSysColor(COLOR_HIGHLIGHT)); hBrush = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT)); } else { clrTextSave = SetTextColor(hDC, GetSysColor(COLOR_BTNTEXT)); clrBkSave = SetBkColor(hDC, GetSysColor(COLOR_BTNFACE)); hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); } hOldBrush = (HBRUSH)SelectObject(hDC, hBrush); FillRect(hDC, &rcAllLabels, hBrush); SelectObject(hDC, hOldBrush); DeleteBrush(hBrush); } else { if (hBackground == NULL) { HBRUSH hBrush; hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); FillRect(hDC, &rcAllLabels, hBrush); DeleteBrush(hBrush); } if (pPickerInfo->pCallbacks->pfnGetOffsetChildren && pPickerInfo->pCallbacks->pfnGetOffsetChildren()) { if (bDrawAsChild || bColorChild) clrTextSave = SetTextColor(hDC, GetListCloneColor()); else clrTextSave = SetTextColor(hDC, GetListFontColor()); } else { if (bDrawAsChild) clrTextSave = SetTextColor(hDC, GetListCloneColor()); else clrTextSave = SetTextColor(hDC, GetListFontColor()); } clrBkSave = SetBkColor(hDC, GetSysColor(COLOR_WINDOW)); } if (lvi.state & LVIS_CUT) { clrImage = GetSysColor(COLOR_WINDOW); uiFlags |= ILD_BLEND50; } else if (bSelected) { if (bFocus) clrImage = GetSysColor(COLOR_HIGHLIGHT); else clrImage = GetSysColor(COLOR_BTNFACE); uiFlags |= ILD_BLEND50; } nStateImageMask = lvi.state & LVIS_STATEIMAGEMASK; if (nStateImageMask) { int nImage = (nStateImageMask >> 12) - 1; hImageList = ListView_GetImageList(hWnd, LVSIL_STATE); if (hImageList) ImageList_Draw(hImageList, nImage, hDC, rcItem.left, rcItem.top, ILD_TRANSPARENT); } res = ListView_GetItemRect_Modified(hWnd, nItem, &rcIcon, LVIR_ICON); rcIcon.left += indent_space; res = ListView_GetItemRect_Modified(hWnd, nItem, &rcItem, LVIR_LABEL); hImageList = ListView_GetImageList(hWnd, LVSIL_SMALL); if (hImageList) { UINT nOvlImageMask = lvi.state & LVIS_OVERLAYMASK; if (rcIcon.left + 16 + indent_space < rcItem.right) { ImageList_DrawEx(hImageList, lvi.iImage, hDC, rcIcon.left, rcIcon.top, 16, 16, GetSysColor(COLOR_WINDOW), clrImage, uiFlags | nOvlImageMask); } } res = ListView_GetItemRect_Modified(hWnd, nItem, &rcItem, LVIR_LABEL); pszText = MakeShortString(hDC, szBuff, rcItem.right - rcItem.left, 2*offset + indent_space); rcLabel = rcItem; rcLabel.left += offset + indent_space; rcLabel.right -= offset; DrawText(hDC, pszText, -1, &rcLabel, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER); for (nColumn = 1; nColumn < nColumnMax; nColumn++) { int nRetLen; UINT nJustify; LV_ITEM lvItem; lvc.mask = LVCF_FMT | LVCF_WIDTH; res = ListView_GetColumn(hWnd, order[nColumn], &lvc); lvItem.mask = LVIF_TEXT; lvItem.iItem = nItem; lvItem.iSubItem = order[nColumn]; lvItem.pszText = szBuff; lvItem.cchTextMax = sizeof(szBuff) / sizeof(szBuff[0]); if (ListView_GetItem(hWnd, &lvItem) == FALSE) continue; rcItem.left = rcItem.right; rcItem.right += lvc.cx; nRetLen = _tcslen(szBuff); if (nRetLen == 0) continue; pszText = MakeShortString(hDC, szBuff, rcItem.right - rcItem.left, 2 * offset); nJustify = DT_LEFT; if (pszText == szBuff) { switch (lvc.fmt & LVCFMT_JUSTIFYMASK) { case LVCFMT_RIGHT: nJustify = DT_RIGHT; break; case LVCFMT_CENTER: nJustify = DT_CENTER; break; default: break; } } rcLabel = rcItem; rcLabel.left += offset; rcLabel.right -= offset; DrawText(hDC, pszText, -1, &rcLabel, nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER); } if (lvi.state & LVIS_FOCUSED && bFocus) DrawFocusRect(hDC, &rcAllLabels); SetTextColor(hDC, clrTextSave); SetBkColor(hDC, clrBkSave); free(order); res++; }
void PaintClc(HWND hwnd, struct ClcData *dat, HDC hdc, RECT * rcPaint) { HDC hdcMem; RECT clRect; int i, y, indent, index, fontHeight; struct ClcGroup *group; HBITMAP hBmpOsb, hOldBitmap; HFONT hOldFont; DWORD style = GetWindowLong(hwnd, GWL_STYLE); int status = GetGeneralisedStatus(); int grey = 0, groupCountsFontTopShift; HBRUSH hBrushAlternateGrey = NULL; // yes I know about GetSysColorBrush() COLORREF tmpbkcolour = style & CLS_CONTACTLIST ? (dat->useWindowsColours ? GetSysColor(COLOR_3DFACE) : dat->bkColour) : dat->bkColour; int minHeight = 16; for (i = 0; i < FONTID_LAST; i++) { if (minHeight < dat->fontInfo[i].fontHeight) { minHeight = dat->fontInfo[i].fontHeight; } } if (dat->rowHeight < minHeight) { dat->rowHeight = minHeight; } if (dat->greyoutFlags & pcli->pfnClcStatusToPf2(status) || style & WS_DISABLED) grey = 1; else if (GetFocus() != hwnd && dat->greyoutFlags & GREYF_UNFOCUS) grey = 1; GetClientRect(hwnd, &clRect); if (rcPaint == NULL) rcPaint = &clRect; if (IsRectEmpty(rcPaint)) return; y = -dat->yScroll; hdcMem = CreateCompatibleDC(hdc); hBmpOsb = CreateBitmap(clRect.right, clRect.bottom, 1, GetDeviceCaps(hdc, BITSPIXEL), NULL); hOldBitmap = SelectObject(hdcMem, hBmpOsb); { TEXTMETRIC tm; hOldFont = SelectObject(hdcMem, dat->fontInfo[FONTID_GROUPS].hFont); GetTextMetrics(hdcMem, &tm); groupCountsFontTopShift = tm.tmAscent; SelectObject(hdcMem, dat->fontInfo[FONTID_GROUPCOUNTS].hFont); GetTextMetrics(hdcMem, &tm); groupCountsFontTopShift -= tm.tmAscent; } if (style & CLS_GREYALTERNATE) hBrushAlternateGrey = CreateSolidBrush(GetNearestColor(hdcMem, RGB(GetRValue(tmpbkcolour) - 10, GetGValue(tmpbkcolour) - 10, GetBValue(tmpbkcolour) - 10))); ChangeToFont(hdcMem, dat, FONTID_CONTACTS, &fontHeight); SetBkMode(hdcMem, TRANSPARENT); { HBRUSH hBrush; hBrush = CreateSolidBrush(tmpbkcolour); FillRect(hdcMem, rcPaint, hBrush); DeleteObject(hBrush); if (dat->hBmpBackground) { BITMAP bmp; HDC hdcBmp; int x, y; int maxx, maxy; int destw, desth; // XXX: Halftone isnt supported on 9x, however the scretch problems dont happen on 98. SetStretchBltMode(hdcMem, HALFTONE); GetObject(dat->hBmpBackground, sizeof(bmp), &bmp); hdcBmp = CreateCompatibleDC(hdcMem); SelectObject(hdcBmp, dat->hBmpBackground); y = dat->backgroundBmpUse & CLBF_SCROLL ? -dat->yScroll : 0; maxx = dat->backgroundBmpUse & CLBF_TILEH ? clRect.right : 1; maxy = dat->backgroundBmpUse & CLBF_TILEV ? maxy = rcPaint->bottom : y + 1; switch (dat->backgroundBmpUse & CLBM_TYPE) { case CLB_STRETCH: if (dat->backgroundBmpUse & CLBF_PROPORTIONAL) { if (clRect.right * bmp.bmHeight < clRect.bottom * bmp.bmWidth) { desth = clRect.bottom; destw = desth * bmp.bmWidth / bmp.bmHeight; } else { destw = clRect.right; desth = destw * bmp.bmHeight / bmp.bmWidth; } } else { destw = clRect.right; desth = clRect.bottom; } break; case CLB_STRETCHH: if (dat->backgroundBmpUse & CLBF_PROPORTIONAL) { destw = clRect.right; desth = destw * bmp.bmHeight / bmp.bmWidth; } else { destw = clRect.right; desth = bmp.bmHeight; } break; case CLB_STRETCHV: if (dat->backgroundBmpUse & CLBF_PROPORTIONAL) { desth = clRect.bottom; destw = desth * bmp.bmWidth / bmp.bmHeight; } else { destw = bmp.bmWidth; desth = clRect.bottom; } break; default: //clb_topleft destw = bmp.bmWidth; desth = bmp.bmHeight; break; } for (; y < maxy; y += desth) { if (y < rcPaint->top - desth) continue; for (x = 0; x < maxx; x += destw) StretchBlt(hdcMem, x, y, destw, desth, hdcBmp, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); } DeleteDC(hdcBmp); } } group = &dat->list; group->scanIndex = 0; indent = 0; for (index = 0; y < rcPaint->bottom;) { if (group->scanIndex == group->cl.count) { group = group->parent; indent--; if (group == NULL) break; group->scanIndex++; continue; } if (y > rcPaint->top - dat->rowHeight) { int iImage = -1; int selected = index == dat->selection && (dat->showSelAlways || dat->exStyle & CLS_EX_SHOWSELALWAYS || GetFocus() == hwnd) && group->cl.items[group->scanIndex]->type != CLCIT_DIVIDER; int hottrack = dat->exStyle & CLS_EX_TRACKSELECT && group->cl.items[group->scanIndex]->type != CLCIT_DIVIDER && dat->iHotTrack == index; SIZE textSize, countsSize, spaceSize; int width, checkboxWidth; char *szCounts; //alternating grey if (style & CLS_GREYALTERNATE && index & 1) { RECT rc; rc.top = y; rc.bottom = rc.top + dat->rowHeight; rc.left = 0; rc.right = clRect.right; FillRect(hdcMem, &rc, hBrushAlternateGrey); } //setup if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) ChangeToFont(hdcMem, dat, FONTID_GROUPS, &fontHeight); else if (group->cl.items[group->scanIndex]->type == CLCIT_INFO) { if (group->cl.items[group->scanIndex]->flags & CLCIIF_GROUPFONT) ChangeToFont(hdcMem, dat, FONTID_GROUPS, &fontHeight); else ChangeToFont(hdcMem, dat, FONTID_CONTACTS, &fontHeight); } else if (group->cl.items[group->scanIndex]->type == CLCIT_DIVIDER) ChangeToFont(hdcMem, dat, FONTID_DIVIDERS, &fontHeight); else if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && group->cl.items[group->scanIndex]->flags & CONTACTF_NOTONLIST) ChangeToFont(hdcMem, dat, FONTID_NOTONLIST, &fontHeight); else if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && ((group->cl.items[group->scanIndex]->flags & CONTACTF_INVISTO && GetRealStatus(group->cl.items[group->scanIndex], status) != ID_STATUS_INVISIBLE) || (group->cl.items[group->scanIndex]->flags & CONTACTF_VISTO && GetRealStatus(group->cl.items[group->scanIndex], status) == ID_STATUS_INVISIBLE) ) ) { // the contact is in the always visible list and the proto is invisible // the contact is in the always invisible and the proto is in any other mode ChangeToFont(hdcMem, dat, group->cl.items[group->scanIndex]->flags & CONTACTF_ONLINE ? FONTID_INVIS : FONTID_OFFINVIS, &fontHeight); } else if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && !(group->cl.items[group->scanIndex]->flags & CONTACTF_ONLINE)) ChangeToFont(hdcMem, dat, FONTID_OFFLINE, &fontHeight); else ChangeToFont(hdcMem, dat, FONTID_CONTACTS, &fontHeight); GetTextExtentPoint32(hdcMem, group->cl.items[group->scanIndex]->szText, lstrlen(group->cl.items[group->scanIndex]->szText), &textSize); width = textSize.cx; if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) { szCounts = pcli->pfnGetGroupCountsText(dat, group->cl.items[group->scanIndex]); if (szCounts[0]) { GetTextExtentPoint32A(hdcMem, " ", 1, &spaceSize); ChangeToFont(hdcMem, dat, FONTID_GROUPCOUNTS, &fontHeight); GetTextExtentPoint32A(hdcMem, szCounts, lstrlenA(szCounts), &countsSize); width += spaceSize.cx + countsSize.cx; } } if ((style & CLS_CHECKBOXES && group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) || (style & CLS_GROUPCHECKBOXES && group->cl.items[group->scanIndex]->type == CLCIT_GROUP) || (group->cl.items[group->scanIndex]->type == CLCIT_INFO && group->cl.items[group->scanIndex]->flags & CLCIIF_CHECKBOX)) checkboxWidth = dat->checkboxSize + 2; else checkboxWidth = 0; //background if (selected) { int x = dat->leftMargin + indent * dat->groupIndent + checkboxWidth + dat->iconXSpace - 2; ImageList_DrawEx(dat->himlHighlight, 0, hdcMem, x, y, min(width + 5, clRect.right - x), dat->rowHeight, CLR_NONE, CLR_NONE, dat->exStyle & CLS_EX_NOTRANSLUCENTSEL ? ILD_NORMAL : ILD_BLEND25); SetTextColor(hdcMem, dat->selTextColour); } else if (hottrack) SetHotTrackColour(hdcMem, dat); //checkboxes if (checkboxWidth) { RECT rc; HANDLE hTheme = NULL; // THEME if (IsWinVerXPPlus()) { if (!themeAPIHandle) { themeAPIHandle = GetModuleHandleA("uxtheme"); if (themeAPIHandle) { MyOpenThemeData = (HANDLE(WINAPI *) (HWND, LPCWSTR)) MGPROC("OpenThemeData"); MyCloseThemeData = (HRESULT(WINAPI *) (HANDLE)) MGPROC("CloseThemeData"); MyDrawThemeBackground = (HRESULT(WINAPI *) (HANDLE, HDC, int, int, const RECT *, const RECT *)) MGPROC("DrawThemeBackground"); } } // Make sure all of these methods are valid (i would hope either all or none work) if (MyOpenThemeData && MyCloseThemeData && MyDrawThemeBackground) { hTheme = MyOpenThemeData(hwnd, L"BUTTON"); } } rc.left = dat->leftMargin + indent * dat->groupIndent; rc.right = rc.left + dat->checkboxSize; rc.top = y + ((dat->rowHeight - dat->checkboxSize) >> 1); rc.bottom = rc.top + dat->checkboxSize; if (hTheme) { MyDrawThemeBackground(hTheme, hdcMem, BP_CHECKBOX, group->cl.items[group->scanIndex]->flags & CONTACTF_CHECKED ? (hottrack ? CBS_CHECKEDHOT : CBS_CHECKEDNORMAL) : (hottrack ? CBS_UNCHECKEDHOT : CBS_UNCHECKEDNORMAL), &rc, &rc); } else DrawFrameControl(hdcMem, &rc, DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_FLAT | (group->cl.items[group->scanIndex]->flags & CONTACTF_CHECKED ? DFCS_CHECKED : 0) | (hottrack ? DFCS_HOT : 0)); if (hTheme && MyCloseThemeData) { MyCloseThemeData(hTheme); hTheme = NULL; } } //icon if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) iImage = group->cl.items[group->scanIndex]->group->expanded ? IMAGE_GROUPOPEN : IMAGE_GROUPSHUT; else if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT) iImage = group->cl.items[group->scanIndex]->iImage; if (iImage != -1) { /*COLORREF colourFg=dat->selBkColour; int mode=ILD_NORMAL; if(selected) mode=ILD_SELECTED; else if(hottrack) {mode=ILD_FOCUS; colourFg=dat->hotTextColour;} else if(group->cl.items[group->scanIndex]->type==CLCIT_CONTACT && group->cl.items[group->scanIndex]->flags&CONTACTF_NOTONLIST) {colourFg=dat->fontInfo[FONTID_NOTONLIST].colour; mode=ILD_BLEND50;} ImageList_DrawEx(himlCListClc,iImage,hdcMem,dat->leftMargin+indent*dat->groupIndent+checkboxWidth,y+((dat->rowHeight-16)>>1),0,0,CLR_NONE,colourFg,mode); */ // this doesnt use CLS_CONTACTLIST since the colour prolly wont match anyway COLORREF colourFg = dat->selBkColour; int mode = ILD_NORMAL; if (hottrack) { colourFg = dat->hotTextColour; } else if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && group->cl.items[group->scanIndex]->flags & CONTACTF_NOTONLIST) { colourFg = dat->fontInfo[FONTID_NOTONLIST].colour; mode = ILD_BLEND50; } if (group->cl.items[group->scanIndex]->type == CLCIT_CONTACT && dat->showIdle && (group->cl.items[group->scanIndex]->flags & CONTACTF_IDLE) && GetRealStatus(group->cl.items[group->scanIndex], ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE) mode = ILD_SELECTED; ImageList_DrawEx(himlCListClc, iImage, hdcMem, dat->leftMargin + indent * dat->groupIndent + checkboxWidth, y + ((dat->rowHeight - 16) >> 1), 0, 0, CLR_NONE, colourFg, mode); } //text if (group->cl.items[group->scanIndex]->type == CLCIT_DIVIDER) { RECT rc; rc.top = y + (dat->rowHeight >> 1); rc.bottom = rc.top + 2; rc.left = dat->leftMargin + indent * dat->groupIndent; rc.right = rc.left + ((clRect.right - rc.left - textSize.cx) >> 1) - 3; DrawEdge(hdcMem, &rc, BDR_SUNKENOUTER, BF_RECT); TextOut(hdcMem, rc.right + 3, y + ((dat->rowHeight - fontHeight) >> 1), group->cl.items[group->scanIndex]->szText, lstrlen(group->cl.items[group->scanIndex]->szText)); rc.left = rc.right + 6 + textSize.cx; rc.right = clRect.right; DrawEdge(hdcMem, &rc, BDR_SUNKENOUTER, BF_RECT); }
void CUploadsCtrl::PaintQueue(CDC& dc, const CRect& rcRow, CUploadQueue* pQueue, BOOL bFocus) { ASSUME_LOCK( UploadQueues.m_pSection ); COLORREF crNatural = CoolInterface.m_crWindow; COLORREF crBack = pQueue->m_bSelected ? CoolInterface.m_crHighlight : crNatural; COLORREF crLeftAligned = crBack ; dc.SetBkColor( crBack ); dc.SetBkMode( OPAQUE ); if ( pQueue->m_bSelected ) dc.SetTextColor( CoolInterface.m_crHiText ); else dc.SetTextColor( CoolInterface.m_crText ); int nTextLeft = rcRow.right, nTextRight = rcRow.left; HDITEM pColumn = {}; pColumn.mask = HDI_FORMAT | HDI_LPARAM; dc.SelectObject( &CoolInterface.m_fntBold ); for ( int nColumn = 0 ; m_wndHeader.GetItem( nColumn, &pColumn ) ; nColumn++ ) { CString strText; CRect rcCell; m_wndHeader.GetItemRect( nColumn, &rcCell ); rcCell.left += rcRow.left; rcCell.right += rcRow.left; rcCell.top = rcRow.top; rcCell.bottom = rcRow.bottom; crLeftAligned = ( rcRow.left == rcCell.left ? crNatural : crBack ) ; POINT ptHover; RECT rcTick = { rcCell.left+2, rcCell.top+2, rcCell.left+14, rcCell.bottom-2 }; GetCursorPos(&ptHover); ScreenToClient(&ptHover); switch ( pColumn.lParam ) { case UPLOAD_COLUMN_TITLE: dc.FillSolidRect( rcCell.left, rcCell.bottom - 1, 32, 1, crLeftAligned ); if ( pQueue->m_bExpanded ) { CoolInterface.Draw( &dc, PtInRect(&rcTick,ptHover) ? IDI_MINUS_HOVER : IDI_MINUS, 16, rcCell.left, rcCell.top, crLeftAligned ); } else { CoolInterface.Draw( &dc, PtInRect(&rcTick,ptHover) ? IDI_PLUS_HOVER : IDI_PLUS, 16, rcCell.left, rcCell.top, crLeftAligned ); } rcCell.left += 16; if ( pQueue == UploadQueues.m_pTorrentQueue ) { ImageList_DrawEx( m_gdiProtocols, PROTOCOL_BT, dc.GetSafeHdc(), rcCell.left, rcCell.top, 16, 16, crLeftAligned, CLR_DEFAULT, pQueue->m_bSelected ? ILD_SELECTED : ILD_NORMAL ); } else if ( pQueue->m_nProtocols == ( 1 << PROTOCOL_HTTP ) ) { ImageList_DrawEx( m_gdiProtocols, PROTOCOL_HTTP, dc.GetSafeHdc(), rcCell.left, rcCell.top, 16, 16, crLeftAligned, CLR_DEFAULT, pQueue->m_bSelected ? ILD_SELECTED : ILD_NORMAL ); } else if ( pQueue->m_nProtocols == ( 1 << PROTOCOL_ED2K ) ) { ImageList_DrawEx( m_gdiProtocols, PROTOCOL_ED2K, dc.GetSafeHdc(), rcCell.left, rcCell.top, 16, 16, crLeftAligned, CLR_DEFAULT, pQueue->m_bSelected ? ILD_SELECTED : ILD_NORMAL ); } else { CoolInterface.Draw( &dc, pQueue->m_bExpanded ? IDI_FOLDER_OPEN : IDI_FOLDER_CLOSED, 16, rcCell.left, rcCell.top, crLeftAligned, pQueue->m_bSelected ); } rcCell.left += 16; dc.FillSolidRect( rcCell.left, rcCell.top, 1, rcCell.Height(), crLeftAligned ); rcCell.left += 1; strText = pQueue->m_sName; break; case UPLOAD_COLUMN_SIZE: if ( pQueue == UploadQueues.m_pTorrentQueue ) strText.Format( _T("%u/%u"), pQueue->m_nMinTransfers, pQueue->m_nMaxTransfers ); //No. Clients was loaded into these variables else if ( pQueue != UploadQueues.m_pHistoryQueue ) strText.Format( _T("%u/%u"), pQueue->GetTransferCount(), pQueue->GetQueuedCount() ); break; case UPLOAD_COLUMN_SPEED: if ( pQueue != UploadQueues.m_pHistoryQueue ) strText = Settings.SmartSpeed( pQueue->GetMeasuredSpeed() ); break; } nTextLeft = min( nTextLeft, (int)rcCell.left ); nTextRight = max( nTextRight, (int)rcCell.right ); if ( rcCell.Width() < 8 ) strText.Empty(); if ( dc.GetTextExtent( strText ).cx > rcCell.Width() - 8 ) { while ( dc.GetTextExtent( strText + _T('\x2026') ).cx > ( rcCell.Width() - 8 ) && strText.GetLength() > 0 ) { strText.Truncate( strText.GetLength() - 1 ); } if ( strText.GetLength() > 0 ) strText += _T('\x2026'); } int nWidth = dc.GetTextExtent( strText ).cx; int nPosition = 0; switch ( pColumn.fmt & LVCFMT_JUSTIFYMASK ) { default: nPosition = ( rcCell.left + 4 ); break; case LVCFMT_CENTER: nPosition = ( ( rcCell.left + rcCell.right ) / 2 ) - ( nWidth / 2 ); break; case LVCFMT_RIGHT: nPosition = ( rcCell.right - 4 - nWidth ); break; } dc.SetBkColor( crBack ); dc.ExtTextOut( nPosition, rcCell.top + 2, ETO_CLIPPED|ETO_OPAQUE, &rcCell, strText, NULL ); } if ( nTextRight < rcRow.right ) { CRect rcBlank( nTextRight, rcRow.top, rcRow.right, rcRow.bottom ); dc.FillSolidRect( &rcBlank, crBack ); } dc.SelectObject( &CoolInterface.m_fntNormal ); if ( bFocus ) { CRect rcFocus( nTextLeft, rcRow.top, max( (int)rcRow.right, nTextRight ), rcRow.bottom ); dc.Draw3dRect( &rcFocus, CoolInterface.m_crHiBorder, CoolInterface.m_crHiBorder ); } }
static void PaintWorker(MButtonCtrl *ctl, HDC hdcPaint) { if(hdcPaint) { HDC hdcMem; RECT rcClient, rcBp; HFONT hOldFont = 0; int xOffset = 0; HANDLE hbp = 0; GetClientRect(ctl->hwnd, &rcClient); #ifndef _USE_D2D rcBp = rcClient; INIT_PAINT(hdcPaint, rcBp, hdcMem); #else hdcMem = cfg::dat.hdcBg; MapWindowPoints(ctl->hwnd, pcli->hwndContactList, reinterpret_cast<POINT *>(&rcClient), 2); #endif hOldFont = reinterpret_cast<HFONT>(SelectObject(hdcMem, ctl->hFont)); // If its a push button, check to see if it should stay pressed if(ctl->pushBtn && ctl->pbState) ctl->stateId = PBS_PRESSED; // Draw the flat button if(ctl->flatBtn) { if(ctl->hThemeToolbar && ctl->bThemed) { RECT rc = rcClient; int state = IsWindowEnabled(ctl->hwnd) ? (ctl->stateId == PBS_NORMAL && ctl->defbutton ? PBS_DEFAULTED : ctl->stateId) : PBS_DISABLED; Gfx::drawBGFromSurface(ctl->hwnd, rc, hdcMem); if(Api::pfnIsThemeBackgroundPartiallyTransparent(ctl->hThemeToolbar, TP_BUTTON, TBStateConvert2Flat(state))) { Api::pfnDrawThemeParentBackground(ctl->hwnd, hdcMem, &rc); } Api::pfnDrawThemeBackground(ctl->hThemeToolbar, hdcMem, TP_BUTTON, TBStateConvert2Flat(state), &rc, &rc); } else { HBRUSH hbr; RECT rc = rcClient; if(ctl->buttonItem) { RECT rcParent; POINT pt; TImageItem *imgItem = ctl->stateId == PBS_HOT ? ctl->buttonItem->imgHover : (ctl->stateId == PBS_PRESSED ? ctl->buttonItem->imgPressed : ctl->buttonItem->imgNormal); LONG *glyphMetrics = ctl->stateId == PBS_HOT ? ctl->buttonItem->hoverGlyphMetrics : (ctl->stateId == PBS_PRESSED ? ctl->buttonItem->pressedGlyphMetrics : ctl->buttonItem->normalGlyphMetrics); #ifndef _USE_D2D GetWindowRect(ctl->hwnd, &rcParent); pt.x = rcParent.left; pt.y = rcParent.top; ScreenToClient(pcli->hwndContactList, &pt); Gfx::drawBGFromSurface(ctl->hwnd, rc, hdcMem); #endif if(imgItem) Gfx::renderSkinItem(hdcMem, &rc, imgItem); if(Skin::glyphItem) { Api::pfnAlphaBlend(hdcMem, (rc.right - glyphMetrics[2]) / 2, (rc.bottom - glyphMetrics[3]) / 2, glyphMetrics[2], glyphMetrics[3], Skin::glyphItem->hdc, glyphMetrics[0], glyphMetrics[1], glyphMetrics[2], glyphMetrics[3], Skin::glyphItem->bf); } } else if(ctl->bSkinned) { // skinned RECT rcParent; TStatusItem *item; int item_id; GetWindowRect(ctl->hwnd, &rcParent); Gfx::drawBGFromSurface(ctl->hwnd, rc, hdcMem); item_id = ctl->stateId == PBS_HOT ? ID_EXTBKBUTTONSMOUSEOVER : (ctl->stateId == PBS_PRESSED ? ID_EXTBKBUTTONSPRESSED : ID_EXTBKBUTTONSNPRESSED); item = &Skin::statusItems[item_id]; Gfx::setTextColor(item->TEXTCOLOR); if(item->IGNORED) FillRect(hdcMem, &rc, GetSysColorBrush(COLOR_3DFACE)); else { rc.top += item->MARGIN_TOP; rc.bottom -= item->MARGIN_BOTTOM; rc.left += item->MARGIN_LEFT; rc.right -= item->MARGIN_RIGHT; Gfx::renderSkinItem(hdcMem, &rc, item->imageItem); } } else { if(ctl->stateId == PBS_PRESSED || ctl->stateId == PBS_HOT) hbr = GetSysColorBrush(COLOR_3DFACE); else { HDC dc; HWND hwndParent; hwndParent = GetParent(ctl->hwnd); dc = GetDC(hwndParent); hbr = (HBRUSH) SendMessage(hwndParent, WM_CTLCOLORDLG, (WPARAM) dc, (LPARAM) hwndParent); ReleaseDC(hwndParent, dc); } if(hbr) { FillRect(hdcMem, &rc, hbr); DeleteObject(hbr); } } if(!ctl->bSkinned && ctl->buttonItem == 0) { if(ctl->stateId == PBS_HOT || ctl->focus) { if(ctl->pbState) DrawEdge(hdcMem, &rc, EDGE_ETCHED, BF_RECT | BF_SOFT); else DrawEdge(hdcMem, &rc, BDR_RAISEDOUTER, BF_RECT | BF_SOFT); } else if(ctl->stateId == PBS_PRESSED) DrawEdge(hdcMem, &rc, BDR_SUNKENOUTER, BF_RECT | BF_SOFT); } } } else { // Draw background/border if(ctl->hThemeButton && ctl->bThemed) { int state = IsWindowEnabled(ctl->hwnd) ? (ctl->stateId == PBS_NORMAL && ctl->defbutton ? PBS_DEFAULTED : ctl->stateId) : PBS_DISABLED; POINT pt; RECT rcParent; GetWindowRect(ctl->hwnd, &rcParent); pt.x = rcParent.left; pt.y = rcParent.top; ScreenToClient(pcli->hwndContactList, &pt); BitBlt(hdcMem, 0, 0, rcClient.right, rcClient.bottom, cfg::dat.hdcBg, pt.x, pt.y, SRCCOPY); if(Api::pfnIsThemeBackgroundPartiallyTransparent(ctl->hThemeButton, BP_PUSHBUTTON, state)) { Api::pfnDrawThemeParentBackground(ctl->hwnd, hdcMem, &rcClient); } Api::pfnDrawThemeBackground(ctl->hThemeButton, hdcMem, BP_PUSHBUTTON, state, &rcClient, &rcClient); } else { UINT uState = DFCS_BUTTONPUSH | ((ctl->stateId == PBS_HOT) ? DFCS_HOT : 0) | ((ctl->stateId == PBS_PRESSED) ? DFCS_PUSHED : 0); if(ctl->defbutton && ctl->stateId == PBS_NORMAL) uState |= DLGC_DEFPUSHBUTTON; DrawFrameControl(hdcMem, &rcClient, DFC_BUTTON, uState); } // Draw focus rectangle if button has focus if(ctl->focus) { RECT focusRect = rcClient; InflateRect(&focusRect, -3, -3); DrawFocusRect(hdcMem, &focusRect); } } // If we have an icon or a bitmap, ignore text and only draw the image on the button if(ctl->hIcon || ctl->hIconPrivate || ctl->iIcon) { int ix = (rcClient.right - rcClient.left) / 2 - (CXSMICON / 2); int iy = (rcClient.bottom - rcClient.top) / 2 - (CXSMICON / 2); HICON hIconNew = ctl->hIconPrivate != 0 ? ctl->hIconPrivate : ctl->hIcon; if(lstrlen(ctl->szText) == 0) { if(ctl->iIcon) ImageList_DrawEx(ctl->hIml, ctl->iIcon, hdcMem, ix, iy, CXSMICON, CYSMICON, CLR_NONE, CLR_NONE, ILD_NORMAL); else DrawState(hdcMem, NULL, NULL, (LPARAM) hIconNew, 0, ix, iy, CXSMICON, CYSMICON, IsWindowEnabled(ctl->hwnd) ? DST_ICON | DSS_NORMAL : DST_ICON | DSS_DISABLED); ctl->sLabel.cx = ctl->sLabel.cy = 0; } else { GetTextExtentPoint32(hdcMem, ctl->szText, lstrlen(ctl->szText), &ctl->sLabel); if(CXSMICON + ctl->sLabel.cx + 8 > rcClient.right - rcClient.left) ctl->sLabel.cx = (rcClient.right - rcClient.left) - CXSMICON - 8; else ctl->sLabel.cx += 4; ix = (rcClient.right - rcClient.left) / 2 - ((CXSMICON + ctl->sLabel.cx) / 2); if(ctl->iIcon) ImageList_DrawEx(ctl->hIml, ctl->iIcon, hdcMem, ix, iy, CXSMICON, CYSMICON, CLR_NONE, CLR_NONE, ILD_NORMAL); else DrawState(hdcMem, NULL, NULL, (LPARAM) hIconNew, 0, ix, iy, CXSMICON, CYSMICON, IsWindowEnabled(ctl->hwnd) ? DST_ICON | DSS_NORMAL : DST_ICON | DSS_DISABLED); xOffset = ix + CXSMICON + 4; } } else if(ctl->hBitmap) { BITMAP bminfo; int ix, iy; GetObject(ctl->hBitmap, sizeof(bminfo), &bminfo); ix = (rcClient.right - rcClient.left) / 2 - (bminfo.bmWidth / 2); iy = (rcClient.bottom - rcClient.top) / 2 - (bminfo.bmHeight / 2); if(ctl->stateId == PBS_PRESSED) { ix++; iy++; } DrawState(hdcMem, NULL, NULL, (LPARAM) ctl->hBitmap, 0, ix, iy, bminfo.bmWidth, bminfo.bmHeight, IsWindowEnabled(ctl->hwnd) ? DST_BITMAP : DST_BITMAP | DSS_DISABLED); } if(GetWindowTextLength(ctl->hwnd)) { // Draw the text and optinally the arrow RECT rcText; CopyRect(&rcText, &rcClient); SetBkMode(hdcMem, TRANSPARENT); if(!ctl->bSkinned) Gfx::setTextColor(IsWindowEnabled(ctl->hwnd) || !ctl->hThemeButton ? GetSysColor(COLOR_BTNTEXT) : GetSysColor(COLOR_GRAYTEXT)); if(ctl->arrow) { DrawState(hdcMem, NULL, NULL, (LPARAM) ctl->arrow, 0, rcClient.right - rcClient.left - 5 - CXSMICON + (!ctl->hThemeButton && ctl->stateId == PBS_PRESSED ? 1 : 0), (rcClient.bottom - rcClient.top) / 2 - CYSMICON / 2 + (!ctl->hThemeButton && ctl->stateId == PBS_PRESSED ? 1 : 0), CXSMICON, CYSMICON, IsWindowEnabled(ctl->hwnd) ? DST_ICON : DST_ICON | DSS_DISABLED); rcText.left += (4 + CXSMICON); } if(xOffset) rcText.left += (4 + CXSMICON); Gfx::renderText(hdcMem, ctl->hThemeButton, ctl->szText, &rcText, DT_VCENTER | DT_CENTER | DT_SINGLELINE, 0); } if(hOldFont) SelectObject(hdcMem, hOldFont); #ifndef _USE_D2D FINALIZE_PAINT(hbp, &rcBp, 0); #endif } }
static void OnPaint(HWND hWnd) { PAINTSTRUCT ps; HDC hDC = BeginPaint(hWnd, &ps); RECT rc; GetClientRect(hWnd, &rc); HBRUSH brHilight = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT)); HBRUSH brBkgnd = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); HPEN penBkgnd = CreatePen(PS_NULL, 0, 0); int maxTasks = (TaskCount > MAX_TASKS) ? MAX_TASKS : TaskCount; int half = maxTasks / 2; int firstTask = (AltTabPrgIdx + TaskCount - half) % TaskCount; for (int i = 0; i < maxTasks; i++) { int act = (firstTask + i) % TaskCount; CProgramItem *pi = TaskList[act]; RECT rcItem; rcItem.left = rc.left; rcItem.top = rc.top + (i * SCALEY(20)); rcItem.right = rc.right; rcItem.bottom = rc.top + ((i + 1) * SCALEY(20)); HGDIOBJ hOrigBrush; if (act == AltTabPrgIdx) hOrigBrush = SelectObject(hDC, brHilight); else hOrigBrush = SelectObject(hDC, brBkgnd); HGDIOBJ hOrigPen = SelectObject(hDC, penBkgnd); Rectangle(hDC, rcItem.left, rcItem.top, rcItem.right, rcItem.bottom); SelectObject(hDC, hOrigPen); SelectObject(hDC, hOrigBrush); // icon for progs TCHAR pathFileName[MAX_PATH]; GetProcessPathFileName(pi, pathFileName); SHFILEINFO sfi = { 0 }; DWORD imageList; imageList = SHGetFileInfo(pathFileName, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_SMALLICON); if (imageList != 0) { ImageList_DrawEx((HIMAGELIST) imageList, sfi.iIcon, hDC, rcItem.left + SCALEX(7), rcItem.top + SCALEY(1), SCALEX(16), SCALEY(16), CLR_NONE, CLR_NONE, ILD_NORMAL); } // font HGDIOBJ hOrigFont = SelectObject(hDC, HBoldFont); RECT rcText = rcItem; rcText.left += SCALEX(25); rcText.right -= SCALEX(25); if (act == AltTabPrgIdx) SetTextColor(hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); else SetTextColor(hDC, GetSysColor(COLOR_WINDOWTEXT)); int oldMode = SetBkMode(hDC, TRANSPARENT); UINT uFmt = DT_LEFT | DT_VCENTER | DT_SINGLELINE; if (pi->ProcessId != 0) uFmt |= DT_NOPREFIX; // we don not want to interpret & as mark of hot key DrawTextEndEllipsis(hDC, pi->Name, lstrlen(pi->Name), &rcText, uFmt); SetBkMode(hDC, oldMode); SelectObject(hDC, hOrigFont); } DeleteObject(brBkgnd); DeleteObject(penBkgnd); EndPaint(hWnd, &ps); }
void CIconComboCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if ( lpDrawItemStruct->itemID == -1 ) return; if ( ( lpDrawItemStruct->itemAction & ODA_SELECT ) == 0 && ( lpDrawItemStruct->itemAction & ODA_DRAWENTIRE ) == 0 ) return; CRect rcItem, rcText; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED; rcItem.CopyRect( &lpDrawItemStruct->rcItem ); // rcItem.OffsetRect( -rcItem.left, -rcItem.top ); rcText.CopyRect( &rcItem ); rcText.left += 24; rcText.right -= 2; if ( bSelected ) { pDC->Draw3dRect( rcItem.left + 1, rcItem.top + 1, rcItem.Width() - 2, rcItem.Height() - 1, CoolInterface.m_crBorder, CoolInterface.m_crBorder ); pDC->FillSolidRect( rcItem.left + 2, rcItem.top + 2, rcItem.Width() - 4, rcItem.Height() - 3, CoolInterface.m_crBackSel ); pDC->SetBkColor( CoolInterface.m_crBackSel ); } else { pDC->FillSolidRect( rcItem.left + 1, rcItem.top + 1, rcItem.Width() - 2, rcItem.Height() - 1, CoolInterface.m_crBackNormal ); pDC->SetBkColor( CoolInterface.m_crBackNormal ); } CPoint pt( rcItem.left + 4, rcItem.top + 3 ); int nIcon = GetItemImage( lpDrawItemStruct->itemID ); if ( bSelected ) { pt.Offset( 1, 1 ); pDC->SetTextColor( CoolInterface.m_crShadow ); CoolInterface.m_pImages.Draw( pDC, nIcon, pt, ILD_MASK ); pt.Offset( -3, -3 ); CoolInterface.m_pImages.Draw( pDC, nIcon, pt, ILD_TRANSPARENT ); } else { ImageList_DrawEx( CoolInterface.m_pImages.m_hImageList, nIcon, pDC->GetSafeHdc(), pt.x, pt.y, 0, 0, CLR_NONE, CoolInterface.m_crMargin, ILD_BLEND25 ); } CString sText; CComboBox::GetLBText(lpDrawItemStruct->itemID, sText); CFont* pOld = (CFont*)pDC->SelectObject( ( lpDrawItemStruct->itemState & ODS_DEFAULT ) ? &CoolInterface.m_fntBold : &CoolInterface.m_fntNormal ); pDC->SetBkMode( TRANSPARENT ); pDC->SetTextColor( bSelected ? CoolInterface.m_crCmdTextSel : CoolInterface.m_crCmdText ); pDC->DrawText( sText, &rcText, DT_SINGLELINE|DT_VCENTER|DT_LEFT ); pDC->SelectObject( pOld ); }
LRESULT CALLBACK ParentSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { CCList *dat = CWndUserData(hWnd).GetCList(); switch (Msg) { case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR)lParam; if (pnmh->hwndFrom == dat->hTreeView) { switch (pnmh->code) { case TVN_ITEMEXPANDED: // just set an appropriate group image { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; TVITEM tvItem; tvItem.hItem = pnmtv->itemNew.hItem; tvItem.mask = TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvItem.iImage = tvItem.iSelectedImage = (pnmtv->itemNew.state & TVIS_EXPANDED) ? IMAGE_GROUPOPEN : IMAGE_GROUPSHUT; TreeView_SetItem(dat->hTreeView, &tvItem); } break; case TVN_SELCHANGED: { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; TREEITEMARRAY OldSelection = dat->SelectedItems; for (int i = 0; i < dat->SelectedItems.GetSize(); i++) { if (dat->SelectedItems[i] != pnmtv->itemNew.hItem) { TreeView_SetItemState(dat->hTreeView, dat->SelectedItems[i], 0, TVIS_SELECTED); } } dat->SelectedItems.RemoveAll(); if (pnmtv->itemNew.hItem) { dat->SelectedItems.AddElem(pnmtv->itemNew.hItem); dat->SelectGroups(pnmtv->itemNew.hItem, true); } NMCLIST nm; nm.hdr.code = MCLN_SELCHANGED; nm.hdr.hwndFrom = dat->hTreeView; nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView); nm.OldSelection = &OldSelection; nm.NewSelection = &dat->SelectedItems; SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nm); } break; case TVN_DELETEITEM: if (dat->Items.GetSize()) { // if Items size = 0, then this TVN_DELETEITEM came after WM_DESTROY, so there is no need to do anything LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; TREEITEMARRAY OldSelection = dat->SelectedItems; int Index = dat->SelectedItems.Find(pnmtv->itemOld.hItem); if (Index != -1) dat->SelectedItems.RemoveElem(Index); // find an item to pass to SelectGroups() HTREEITEM hItem = TreeView_GetNextSibling(dat->hTreeView, pnmtv->itemOld.hItem); if (!hItem) { hItem = TreeView_GetPrevSibling(dat->hTreeView, pnmtv->itemOld.hItem); if (!hItem) hItem = TreeView_GetParent(dat->hTreeView, pnmtv->itemOld.hItem); } if (hItem) // if it wasn't one of the root items dat->SelectGroups(hItem, dat->SelectedItems.Find(hItem) != -1); NMCLIST nm; nm.hdr.code = MCLN_SELCHANGED; nm.hdr.hwndFrom = dat->hTreeView; nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView); nm.OldSelection = &OldSelection; nm.NewSelection = &dat->SelectedItems; SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nm); dat->Items[pnmtv->itemOld.lParam].hContact = INVALID_CONTACT_ID; } break; case NM_CUSTOMDRAW: LPNMTVCUSTOMDRAW lpNMCD = (LPNMTVCUSTOMDRAW)lParam; switch (lpNMCD->nmcd.dwDrawStage) { case CDDS_PREPAINT: // the control is about to start painting return CDRF_NOTIFYITEMDRAW; // instruct the control to return information when it draws items case CDDS_ITEMPREPAINT: return CDRF_NOTIFYPOSTPAINT; case CDDS_ITEMPOSTPAINT: RECT rc; if (TreeView_GetItemRect(dat->hTreeView, (HTREEITEM)lpNMCD->nmcd.dwItemSpec, &rc, false)) { for (int i = 0; i < MAXEXTRAICONS; i++) { BYTE nIndex = dat->Items[lpNMCD->nmcd.lItemlParam].ExtraIcons[i]; if (nIndex != CLC_EXTRAICON_EMPTY) { ImageList_DrawEx(dat->ExtraImageList, nIndex, lpNMCD->nmcd.hdc, rc.right - EXTRAICON_XSTEP * (i + 1), rc.top, 0, 0, /*GetSysColor(COLOR_WINDOW)*/CLR_NONE, CLR_NONE, ILD_NORMAL); } } } break; } } break; } } } return CallWindowProc(dat->OrigParentProc, hWnd, Msg, wParam, lParam); }
void _draw_static( LPDRAWITEMSTRUCT itst ) { UINT edge = BDR_RAISEDINNER; UINT state = DSS_NORMAL; UINT border = BF_RECT; DRAWTEXTPARAMS tp = { sizeof(tp) }; WINDOWINFO wi; RECT rc; _wnd_data *gwl; _tab_data *tab; wchar_t data[MAX_PATH]; int x = 6, y = 3; char curr; if ( !itst ) return; switch ( itst->CtlType ) { case ODT_LISTVIEW: _draw_listview(itst); break; case ODT_COMBOBOX: _draw_combobox(itst); break; case ODT_TAB: _draw_tabs(itst); break; case ODT_BUTTON: if ( itst->itemState & ODS_DISABLED ) state = DSS_DISABLED; if ( itst->itemState & ODS_SELECTED ) { edge = BDR_SUNKENOUTER; x++; y++; } itst->rcItem.top++; GetWindowText( itst->hwndItem, data, MAX_PATH ); GetClientRect( itst->hwndItem, &rc ); gwl = wnd_get_long( itst->hwndItem, GWL_USERDATA ); tab = wnd_get_long( GetParent(itst->hwndItem), GWL_USERDATA ); curr = tab && ( tab->h_curr == itst->hwndItem ); if ( gwl ) { if ( !gwl->dlg[0] ) { itst->rcItem.right = itst->rcItem.left + 13; itst->rcItem.bottom = itst->rcItem.top + 13; _fill( itst->hDC, &rc, _cl(COLOR_BTNFACE, FALSE) ); _fill( itst->hDC, &itst->rcItem, /* (itst->itemState & ODS_FOCUS) ? _cl(COLOR_BTNFACE, FALSE) : */ _cl(COLOR_BTNFACE, LGHT_CLR) ); GetWindowText(itst->hwndItem, data, MAX_PATH); if ( gwl->state ) { ImageList_DrawEx( __img, 0, itst->hDC, itst->rcItem.right - 11, 2, 0, 0, CLR_NONE, GetSysColor(COLOR_BTNSHADOW), ILD_BLEND ); } DrawEdge( itst->hDC, &itst->rcItem, BDR_SUNKENOUTER, border ); DrawState( itst->hDC, NULL, NULL, (LPARAM)data, 0, itst->rcItem.right+4, 0, 0, 0, DST_PREFIXTEXT | state ); if ( itst->itemState & ODS_FOCUS ) { rc.bottom = itst->rcItem.bottom - itst->rcItem.top + 2; rc.left += itst->rcItem.right + 2; DrawFocusRect( itst->hDC, &rc ); } return; } else { if ( curr ) { edge = BDR_SUNKENOUTER; x++; y++; } else { border = BF_FLAT; } } } _fill( itst->hDC, &itst->rcItem, (itst->itemState & ODS_FOCUS ) ? _cl( COLOR_BTNFACE, DARK_CLR ) : _cl( COLOR_BTNFACE, FALSE ) ); DrawState( itst->hDC, NULL, NULL, (LPARAM)data, 0, x, y, 0, 0, DST_PREFIXTEXT | state ); if ( itst->itemState & ODS_FOCUS ) { modify_rect( rc, 1, 2, -2, -2 ); if ( itst->itemState & ODS_SELECTED ) { modify_rect( rc, 1, 1, 1, 1 ); } DrawFocusRect( itst->hDC, &rc ); } case ODT_STATIC: { GetWindowInfo(itst->hwndItem, &wi); GetWindowText(itst->hwndItem, data, MAX_PATH); if ( data[0] == L'#' ) { GetWindowRect(GetParent(GetParent(itst->hwndItem)), &rc); itst->rcItem.right = rc.right - rc.left - 3; itst->rcItem.top = itst->rcItem.left = 1; _fill(itst->hDC, &itst->rcItem, _cl(COLOR_BTNSHADOW, DARK_CLR - 7)); tp.iLeftMargin += 10; itst->rcItem.top += 1; DrawTextEx(itst->hDC, data + 1, -1, &itst->rcItem, DT_END_ELLIPSIS, &tp); } else { if ( (wi.dwStyle & SS_SUNKEN) == 0 ) { DrawEdge(itst->hDC, &itst->rcItem, edge, border); } } } break; } }
void CLibraryAlbumTrack::Paint(CLibraryAlbumView* pView, CDC* pDC, const CRect& rcTrack, int nCount) { COLORREF crBack = m_bSelected ? Colors.m_crHighlight : CLibraryAlbumView::m_crRows[ nCount & 1 ]; pDC->SetBkColor( crBack ); pDC->SetTextColor( m_bSelected ? Colors.m_crHiText : Colors.m_crText ); CRect rcLine( &rcTrack ); rcLine.DeflateRect( 2, 1 ); // Icon Box CRect rcTemp( rcLine.left, rcLine.top, rcLine.left + ICON_WIDTH, rcLine.bottom ); rcLine.left += ICON_WIDTH; if ( nCount >= 0 ) PaintText( pDC, rcTemp, 0, 100, NULL ); ShellIcons.Draw( pDC, m_nShell, 16, rcTemp.left + 4, ( rcTemp.top + rcTemp.bottom ) / 2 - 8, CLR_NONE, m_bSelected ); // Rating Stars Box rcTemp.SetRect( rcLine.right - RATING_WIDTH, rcLine.top, rcLine.right, rcLine.bottom ); rcLine.right -= RATING_WIDTH; CPoint ptStar( rcTemp.left + 4, ( rcTemp.top + rcTemp.bottom ) / 2 - 6 ); PaintText( pDC, rcTemp, 0, 100, NULL, TRUE ); if ( pView->m_pRating == this && m_nSetRating < 7 ) { for ( int nRating = 2 ; nRating <= 6 ; nRating++ ) { ImageList_DrawEx( pView->m_pStars, m_nSetRating >= nRating ? 2 : 1, *pDC, ptStar.x, ptStar.y, 12, 12, m_bSelected ? CLR_NONE : crBack, crBack, m_nSetRating >= nRating ? ILD_NORMAL : ILD_BLEND50 ); ptStar.x += 12; } } else { for ( int nRating = 2 ; nRating <= 6 ; nRating++ ) { ImageList_DrawEx( pView->m_pStars, m_nRating >= nRating ? 0 : 1, *pDC, ptStar.x, ptStar.y, 12, 12, m_bSelected ? CLR_NONE : crBack, crBack, m_nRating >= nRating ? ILD_NORMAL : ILD_BLEND50 ); ptStar.x += 12; } } ptStar.x++; // Comment icon gap if ( pView->m_pRating == this && m_nSetRating == 7 ) { ImageList_DrawEx( pView->m_pStars, 5, *pDC, ptStar.x, ptStar.y, 12, 12, CLR_NONE, crBack, ILD_NORMAL ); } else { ImageList_DrawEx( pView->m_pStars, m_bComments ? 3 : 4, *pDC, ptStar.x, ptStar.y, 12, 12, m_bSelected ? CLR_NONE : crBack, crBack, m_bComments ? ILD_NORMAL : ILD_BLEND50 ); } // Metadata Boxes (Available space %) if ( pView->m_pStyle == CSchema::uriMusicAlbum ) { // Track, Title, Length, Bitrate PaintText( pDC, rcLine, 0, 5, &m_sTrack, TRUE ); PaintText( pDC, rcLine, 5, 84, &m_sTitle ); PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE ); PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE ); } else if ( pView->m_pStyle == CSchema::uriMusicArtist ) { // Album, Title, Length, Bitrate PaintText( pDC, rcLine, 0, 30, &m_sAlbum ); PaintText( pDC, rcLine, 30, 84, &m_sTitle ); PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE ); PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE ); } else if ( pView->m_pStyle == CSchema::uriMusicAll ) // Genre { // Artist, Album, Title, Length, Bitrate PaintText( pDC, rcLine, 0, 25, &m_sArtist ); PaintText( pDC, rcLine, 25, 50, &m_sAlbum ); PaintText( pDC, rcLine, 50, 84, &m_sTitle ); PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE ); PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE ); } else // Non-music { // Title, Artist, Length PaintText( pDC, rcLine, 0, 66, &m_sTitle ); PaintText( pDC, rcLine, 66, 88, &m_sArtist ); PaintText( pDC, rcLine, 88, 100, &m_sLength, TRUE ); } }
void CCoolBarItem::Paint(CDC* pDC, CRect& rc, BOOL bDown, BOOL bHot, BOOL bMenuGray, BOOL bTransparent) { COLORREF crBackground; if ( m_nID == ID_SEPARATOR ) { if ( ! bTransparent ) pDC->FillSolidRect( rc.left, rc.top, 3, rc.Height(), CoolInterface.m_crMidtone ); pDC->Draw3dRect( rc.left + 3, rc.top, 1, rc.Height(), CoolInterface.m_crDisabled, CoolInterface.m_crDisabled ); if ( ! bTransparent ) pDC->FillSolidRect( rc.left + 4, rc.top, 3, rc.Height(), CoolInterface.m_crMidtone ); return; } if ( m_nCtrlID ) { for ( int nShrink = rc.Height() - m_nCtrlHeight ; nShrink > 0 ; nShrink -= 2 ) { if ( ! bTransparent ) pDC->Draw3dRect( &rc, CoolInterface.m_crMidtone, CoolInterface.m_crMidtone ); rc.DeflateRect( 0, 1 ); } rc.DeflateRect( 1, 0 ); } else { if ( ! bTransparent ) pDC->Draw3dRect( &rc, CoolInterface.m_crMidtone, CoolInterface.m_crMidtone ); rc.DeflateRect( 1, 1 ); } // if ( ( m_bEnabled || m_nCtrlID ) && ( bHot || bDown || m_bChecked ) ) if ( m_bEnabled && ( bHot || bDown || m_bChecked ) ) { if ( bMenuGray && bDown ) { pDC->Draw3dRect( &rc, CoolInterface.m_crDisabled, CoolInterface.m_crDisabled ); } else { pDC->Draw3dRect( &rc, CoolInterface.m_crBorder, CoolInterface.m_crBorder ); } rc.DeflateRect( 1, 1 ); if ( bMenuGray && bDown ) { crBackground = CoolInterface.m_crBackNormal; } else if ( m_bChecked ) { crBackground = bHot ? CoolInterface.m_crBackCheckSel : CoolInterface.m_crBackCheck; } else { crBackground = bDown && bHot ? CoolInterface.m_crBackCheckSel : CoolInterface.m_crBackSel; } } else { if ( bTransparent ) { crBackground = CLR_NONE; } else { crBackground = CoolInterface.m_crMidtone; pDC->Draw3dRect( &rc, crBackground, crBackground ); } rc.DeflateRect( 1, 1 ); } if ( m_nCtrlID ) { if ( m_nCtrlHeight == CONTROL_HEIGHT ) { pDC->Draw3dRect( &rc, CoolInterface.m_crWindow, CoolInterface.m_crWindow ); rc.DeflateRect( 1, 1 ); } return; } if ( crBackground == CLR_NONE ) { pDC->SetBkMode( TRANSPARENT ); } else { pDC->SetBkMode( OPAQUE ); pDC->SetBkColor( crBackground ); } if ( m_sText.GetLength() ) { if ( m_crText != 0xFFFFFFFF ) pDC->SetTextColor( m_crText ); else if ( ! m_bEnabled ) pDC->SetTextColor( CoolInterface.m_crDisabled ); else if ( ( bHot || bDown || m_bChecked ) && ( ! bMenuGray || ! bDown ) ) pDC->SetTextColor( CoolInterface.m_crCmdTextSel ); else pDC->SetTextColor( CoolInterface.m_crCmdText ); rc.left += ( m_nImage >= 0 ) ? 20 : 1; int nY = ( rc.top + rc.bottom ) / 2 - pDC->GetTextExtent( m_sText ).cy / 2 - 1; if ( crBackground == CLR_NONE ) pDC->ExtTextOut( rc.left + 2, nY, ETO_CLIPPED, &rc, m_sText, NULL ); else pDC->ExtTextOut( rc.left + 2, nY, ETO_CLIPPED|ETO_OPAQUE, &rc, m_sText, NULL ); rc.right = rc.left; rc.left -= ( m_nImage >= 0 ) ? 20 : 1; } if ( m_nImage >= 0 ) { CPoint ptImage( rc.left + 3, ( rc.top + rc.bottom ) / 2 - 8 ); if ( ! m_bEnabled ) { ImageList_DrawEx( CoolInterface.m_pImages.GetSafeHandle(), m_nImage, pDC->GetSafeHdc(), ptImage.x, ptImage.y, 0, 0, crBackground, CoolInterface.m_crShadow, ILD_BLEND50 ); pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 ); } else if ( m_bChecked ) { ImageList_DrawEx( CoolInterface.m_pImages.GetSafeHandle(), m_nImage, pDC->GetSafeHdc(), ptImage.x, ptImage.y, 0, 0, crBackground, CLR_NONE, ILD_NORMAL ); pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 ); } else if ( ( bHot && ! bDown ) || ( bDown && ! bHot ) ) { ptImage.Offset( 1, 1 ); pDC->SetTextColor( CoolInterface.m_crShadow ); ImageList_DrawEx( CoolInterface.m_pImages.GetSafeHandle(), m_nImage, pDC->GetSafeHdc(), ptImage.x, ptImage.y, 0, 0, crBackground, CLR_NONE, ILD_MASK ); ptImage.Offset( -2, -2 ); if ( crBackground != CLR_NONE ) { pDC->FillSolidRect( ptImage.x, ptImage.y, 18, 2, crBackground ); pDC->FillSolidRect( ptImage.x, ptImage.y + 2, 2, 16, crBackground ); } ImageList_DrawEx( CoolInterface.m_pImages.GetSafeHandle(), m_nImage, pDC->GetSafeHdc(), ptImage.x, ptImage.y, 0, 0, CLR_NONE, CLR_NONE, ILD_NORMAL ); pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 18, ptImage.y + 18 ); } else { ImageList_DrawEx( CoolInterface.m_pImages.GetSafeHandle(), m_nImage, pDC->GetSafeHdc(), ptImage.x, ptImage.y, 0, 0, crBackground, CoolInterface.m_crBackNormal, bDown ? ILD_NORMAL : ILD_BLEND25 ); pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 ); } } if ( crBackground != CLR_NONE ) pDC->FillSolidRect( &rc, crBackground ); }
static VOID NcAreaDrawButton( _Inout_ PEDIT_CONTEXT Context, _In_ RECT ButtonRect ) { HDC hdc; if (!(hdc = GetWindowDC(Context->WindowHandle))) return; SetBkMode(hdc, TRANSPARENT); FillRect(hdc, &ButtonRect, Context->BrushFill); //#ifdef _DEBUG // BOOL isFocused = (GetFocus() == Context->WindowHandle); // if (isFocused) // { // FrameRect(hdc, &ButtonRect, Context->BrushFocused); // } // else if (Context->MouseInClient) // { // FrameRect(hdc, &ButtonRect, Context->BrushHot); // } // else // { // FrameRect(hdc, &ButtonRect, Context->BrushNormal); // } //#endif // Draw the image centered within the rect. if (SearchboxText->Length > 0) { ImageList_DrawEx( Context->ImageList, 0, hdc, ButtonRect.left, ButtonRect.top + ((ButtonRect.bottom - ButtonRect.top) - Context->ImageHeight) / 2, 0, 0, Context->BackgroundColorRef, Context->BackgroundColorRef, ILD_NORMAL | ILD_TRANSPARENT ); } else { ImageList_DrawEx( Context->ImageList, 1, hdc, ButtonRect.left, ButtonRect.top + ((ButtonRect.bottom - ButtonRect.top) - (Context->ImageHeight - 1)) / 2, // Fix image offset by 1 0, 0, Context->BackgroundColorRef, Context->BackgroundColorRef, ILD_NORMAL | ILD_TRANSPARENT ); } ReleaseDC(Context->WindowHandle, hdc); }
void CCoolMenu::OnDrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CRect rcItem, rcText; CString strText; int nIcon = -1; CDC dc; BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED; BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED; BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED; BOOL bKeyboard = FALSE; BOOL bEdge = TRUE; dc.Attach( lpDrawItemStruct->hDC ); if ( CWnd* pWnd = dc.GetWindow() ) { CRect rcScreen( &lpDrawItemStruct->rcItem ); CPoint ptCursor; GetCursorPos( &ptCursor ); pWnd->ClientToScreen( &rcScreen ); bKeyboard = ! rcScreen.PtInRect( ptCursor ); } rcItem.CopyRect( &lpDrawItemStruct->rcItem ); rcItem.OffsetRect( -rcItem.left, -rcItem.top ); if ( m_hMsgHook != NULL ) rcItem.bottom += ( bEdge = m_bPrinted ); rcText.CopyRect( &rcItem ); rcText.left += 32; rcText.right -= 2; CDC* pDC = CoolInterface.GetBuffer( dc, rcItem.Size() ); if ( m_bmWatermark.m_hObject != NULL ) { DrawWatermark( pDC, &rcItem, lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top ); } else { pDC->FillSolidRect( rcItem.left, rcItem.top, 24, rcItem.Height(), CoolInterface.m_crMargin ); pDC->FillSolidRect( rcItem.left + 24, rcItem.top, rcItem.Width() - 24, rcItem.Height(), CoolInterface.m_crBackNormal ); } if ( m_pStrings.Lookup( lpDrawItemStruct->itemData, strText ) == FALSE ) { int nMiddle = rcText.top + 1; pDC->FillSolidRect( rcText.left, nMiddle, rcText.Width() + 2, 1, CoolInterface.m_crDisabled ); dc.BitBlt( lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, rcItem.Width(), rcItem.Height(), pDC, 0, 0, SRCCOPY ); dc.Detach(); return; } if ( bSelected ) { if ( ! bDisabled ) { pDC->Draw3dRect( rcItem.left + 1, rcItem.top + 1, rcItem.Width() - 2, rcItem.Height() - 1 - bEdge, CoolInterface.m_crBorder, CoolInterface.m_crBorder ); pDC->FillSolidRect( rcItem.left + 2, rcItem.top + 2, rcItem.Width() - 4, rcItem.Height() - 3 - bEdge, CoolInterface.m_crBackSel ); pDC->SetBkColor( CoolInterface.m_crBackSel ); } else if ( bKeyboard ) { pDC->Draw3dRect( rcItem.left + 1, rcItem.top + 1, rcItem.Width() - 2, rcItem.Height() - 1 - bEdge, CoolInterface.m_crBorder, CoolInterface.m_crBorder ); pDC->FillSolidRect( rcItem.left + 2, rcItem.top + 2, rcItem.Width() - 4, rcItem.Height() - 3 - bEdge, CoolInterface.m_crBackNormal ); pDC->SetBkColor( CoolInterface.m_crBackNormal ); } } else { pDC->SetBkColor( CoolInterface.m_crBackNormal ); } if ( bChecked ) { pDC->Draw3dRect( rcItem.left + 2, rcItem.top + 2, 20, rcItem.Height() - 3 - bEdge, CoolInterface.m_crBorder, CoolInterface.m_crBorder ); pDC->FillSolidRect( rcItem.left + 3, rcItem.top + 3, 18, rcItem.Height() - 5 - bEdge, ( bSelected && !bDisabled ) ? CoolInterface.m_crBackCheckSel : CoolInterface.m_crBackCheck ); } nIcon = CoolInterface.ImageForID( (DWORD)lpDrawItemStruct->itemID ); if ( bChecked && nIcon < 0 ) nIcon = m_nCheckIcon; if ( nIcon >= 0 ) { CPoint pt( rcItem.left + 4, rcItem.top + 4 ); if ( bDisabled ) { ImageList_DrawEx( CoolInterface.m_pImages.m_hImageList, nIcon, pDC->GetSafeHdc(), pt.x, pt.y, 0, 0, CLR_NONE, CoolInterface.m_crDisabled, CM_DISABLEDBLEND ); } else if ( bChecked ) { CoolInterface.m_pImages.Draw( pDC, nIcon, pt, ILD_TRANSPARENT ); } else if ( bSelected ) { pt.Offset( 1, 1 ); pDC->SetTextColor( CoolInterface.m_crShadow ); CoolInterface.m_pImages.Draw( pDC, nIcon, pt, ILD_MASK ); pt.Offset( -2, -2 ); CoolInterface.m_pImages.Draw( pDC, nIcon, pt, ILD_TRANSPARENT ); } else { ImageList_DrawEx( CoolInterface.m_pImages.m_hImageList, nIcon, pDC->GetSafeHdc(), pt.x, pt.y, 0, 0, CLR_NONE, CoolInterface.m_crMargin, ILD_BLEND25 ); } } CFont* pOld = (CFont*)pDC->SelectObject( ( lpDrawItemStruct->itemState & ODS_DEFAULT ) && ! bDisabled ? &CoolInterface.m_fntBold : &CoolInterface.m_fntNormal ); pDC->SetBkMode( TRANSPARENT ); pDC->SetTextColor( bDisabled ? CoolInterface.m_crDisabled : ( bSelected ? CoolInterface.m_crCmdTextSel : CoolInterface.m_crCmdText ) ); DrawMenuText( pDC, &rcText, strText ); pDC->SelectObject( pOld ); dc.BitBlt( lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, rcItem.Width(), rcItem.Height(), pDC, 0, 0, SRCCOPY ); dc.Detach(); }
static LRESULT CALLBACK MsgTreeSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { CMsgTree *dat = CWndUserData(GetParent(hWnd)).GetMsgTree(); switch (Msg) { case UM_MSGTREE_UPDATE: // returns TRUE if updated { bool Modified = dat->MsgTreePage.GetModified(); TCString WndTitle; if (Modified) { WndTitle.GetBuffer(256); HWND hCurWnd = hWnd; do { hCurWnd = GetParent(hCurWnd); } while (hCurWnd && !GetWindowText(hCurWnd, WndTitle, 256)); WndTitle.ReleaseBuffer(); } if (!Modified || MessageBox(GetParent(hWnd), TCString(TranslateT("You've made changes to multiple message trees at a time.\r\nDo you want to leave changes in \"")) + WndTitle + TranslateT("\" dialog?\r\nPress Yes to leave changes in this dialog, or No to discard its changes and save changes of the other message tree instead."), WndTitle + _T(" - ") + TranslateT("New Away System"), MB_ICONQUESTION | MB_YESNO) == IDNO) { COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl(); TCString OldTitle, OldMsg, NewTitle, NewMsg; int OldOrder = TreeCtrl->IDToOrder(TreeCtrl->GetSelectedItemID(GetParent(hWnd))); if (OldOrder != -1) { CBaseTreeItem* ItemOld = (OldOrder <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(OldOrder)] : (CBaseTreeItem*)&TreeCtrl->Value[OldOrder]; OldTitle = ItemOld->Title; if (!(ItemOld->Flags & TIF_ROOTITEM)) OldMsg = ((CTreeItem*)ItemOld)->User_Str1; } dat->UpdateLock++; dat->MsgTreePage.DBToMemToPage(); dat->UpdateLock--; NMMSGTREE nm = { 0 }; int Order = TreeCtrl->IDToOrder(TreeCtrl->GetSelectedItemID(GetParent(hWnd))); if (Order != -1) { nm.ItemNew = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order]; NewTitle = nm.ItemNew->Title; if (!(nm.ItemNew->Flags & TIF_ROOTITEM)) NewMsg = ((CTreeItem*)nm.ItemNew)->User_Str1; } if (OldTitle.IsEmpty()) OldTitle = _T(""); // to be sure that NULL will be equal to "" in the latter comparisons if (OldMsg.IsEmpty()) OldMsg = _T(""); if (NewTitle.IsEmpty()) NewTitle = _T(""); if (NewMsg.IsEmpty()) NewMsg = _T(""); if (OldTitle != (const TCHAR*)NewTitle || OldMsg != (const TCHAR*)NewMsg) { // probably it's better to leave nm.ItemOld = NULL, to prevent accidental rewriting of it with old data from an edit control etc. nm.hdr.code = MTN_SELCHANGED; nm.hdr.hwndFrom = hWnd; nm.hdr.idFrom = GetDlgCtrlID(hWnd); SendMessage(GetParent(hWnd), WM_NOTIFY, 0, (LPARAM)&nm); } return true; } } return false; case WM_KEYDOWN: switch (wParam) { case VK_DELETE: dat->DeleteSelectedItem(); break; case VK_INSERT: dat->AddMessage(); break; } break; case WM_RBUTTONDOWN: SetFocus(hWnd); { TVHITTESTINFO hitTest; hitTest.pt.x = (short)LOWORD(lParam); hitTest.pt.y = (short)HIWORD(lParam); TreeView_HitTest(hWnd, &hitTest); if (hitTest.hItem && hitTest.flags & TVHT_ONITEM) TreeView_SelectItem(hWnd, hitTest.hItem); return DefWindowProc(hWnd, Msg, wParam, lParam); } break; case WM_CONTEXTMENU: { TVHITTESTINFO ht; ht.pt.x = GET_X_LPARAM(lParam); ht.pt.y = GET_Y_LPARAM(lParam); TVITEM tvi = { 0 }; if (ht.pt.x == -1 && ht.pt.y == -1) { // use selected item if (tvi.hItem = TreeView_GetSelection(hWnd)) { TreeView_EnsureVisible(hWnd, tvi.hItem); RECT rc; TreeView_GetItemRect(hWnd, tvi.hItem, &rc, true); ht.pt.x = rc.left; ht.pt.y = rc.bottom; } } else { ScreenToClient(hWnd, &ht.pt); TreeView_HitTest(hWnd, &ht); if (ht.hItem && ht.flags & TVHT_ONITEM) { tvi.hItem = ht.hItem; } } if (tvi.hItem) { COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl(); tvi.mask = TVIF_HANDLE | TVIF_PARAM; TreeView_GetItem(hWnd, &tvi); int Order = TreeCtrl->IDToOrder(tvi.lParam); if (Order >= 0) { HMENU hMenu; if (TreeCtrl->Value[Order].Flags & TIF_GROUP) hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MSGTREE_CATEGORYMENU)); else hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MSGTREE_MESSAGEMENU)); _ASSERT(hMenu); HMENU hPopupMenu = GetSubMenu(hMenu, 0); TranslateMenu(hPopupMenu); ClientToScreen(hWnd, &ht.pt); struct { int ItemID, IconID; } MenuItems[] = { IDM_MSGTREEMENU_NEWMESSAGE, IMGLIST_NEWMESSAGE, IDM_MSGTREEMENU_NEWCATEGORY, IMGLIST_NEWCATEGORY, IDM_MSGTREEMENU_DELETE, IMGLIST_DELETE }; MENUITEMINFO mii = { 0 }; mii.cbSize = sizeof(mii); mii.fMask = MIIM_BITMAP | MIIM_DATA | MIIM_STATE | MIIM_CHECKMARKS; mii.hbmpItem = HBMMENU_CALLBACK; int i; for (i = 0; i < _countof(MenuItems); i++) { // set icons mii.dwItemData = MenuItems[i].IconID; SetMenuItemInfo(hPopupMenu, MenuItems[i].ItemID, false, &mii); } mii.fMask = MIIM_STATE; mii.fState = MFS_CHECKED; for (i = 0; i < _countof(SettingsList); i++) // set checkmarks if (TreeCtrl->Value[Order].ID == dat->MsgTreePage.GetValue(SettingsList[i].DBSetting)) SetMenuItemInfo(hPopupMenu, SettingsList[i].MenuItemID, false, &mii); int MenuResult = TrackPopupMenu(hPopupMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, ht.pt.x, ht.pt.y, 0, hWnd, NULL); switch (MenuResult) { case IDM_MSGTREEMENU_NEWMESSAGE: dat->AddMessage(); break; case IDM_MSGTREEMENU_NEWCATEGORY: dat->AddCategory(); break; case IDM_MSGTREEMENU_RENAME: TreeView_EditLabel(hWnd, tvi.hItem); break; case IDM_MSGTREEMENU_DELETE: dat->DeleteSelectedItem(); break; case IDR_MSGTREEMENU_DEF_ONL: case IDR_MSGTREEMENU_DEF_AWAY: case IDR_MSGTREEMENU_DEF_NA: case IDR_MSGTREEMENU_DEF_OCC: case IDR_MSGTREEMENU_DEF_DND: case IDR_MSGTREEMENU_DEF_FFC: case IDR_MSGTREEMENU_DEF_INV: case IDR_MSGTREEMENU_DEF_OTP: case IDR_MSGTREEMENU_DEF_OTL: for (int i = 0; i < _countof(SettingsList); i++) { if (SettingsList[i].MenuItemID == MenuResult) { dat->SetDefMsg(SettingsList[i].Status, tvi.lParam); break; } } } DestroyMenu(hMenu); return 0; } } } break; case WM_MEASUREITEM: { LPMEASUREITEMSTRUCT lpmi = (LPMEASUREITEMSTRUCT)lParam; if (lpmi->CtlType == ODT_MENU) { lpmi->itemWidth = max(0, GetSystemMetrics(SM_CXSMICON) - GetSystemMetrics(SM_CXMENUCHECK) + 4); lpmi->itemHeight = GetSystemMetrics(SM_CYSMICON) + 2; return true; } } break; case WM_DRAWITEM: { LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; if (dis->CtlType == ODT_MENU) { ImageList_DrawEx(dat->hImageList, dis->itemData, dis->hDC, 2, (dis->rcItem.bottom + dis->rcItem.top - GetSystemMetrics(SM_CYSMICON)) / 2 + 1, 0, 0, GetSysColor(COLOR_WINDOW), CLR_NONE, ILD_NORMAL); return true; } } break; } return CallWindowProc(dat->OrigTreeViewProc, hWnd, Msg, wParam, lParam); }