INT CFlatHeaderCtrl::DrawImage(CDC* pDC, CRect rect, LPHDITEM lphdi, BOOL bRight) { CImageList* pImageList = GetImageList(); INT iWidth = 0; if(lphdi->mask&HDI_IMAGE && lphdi->fmt&HDF_IMAGE) { ASSERT(pImageList); ASSERT(lphdi->iImage>=0 && lphdi->iImage<pImageList->GetImageCount()); if(rect.Width()>0) { POINT point; point.y = rect.CenterPoint().y - (m_sizeImage.cy>>1); if(bRight) point.x = rect.right - m_sizeImage.cx; else point.x = rect.left; SIZE size; size.cx = rect.Width()<m_sizeImage.cx ? rect.Width():m_sizeImage.cx; size.cy = m_sizeImage.cy; pImageList->DrawIndirect(pDC, lphdi->iImage, point, size, CPoint(0, 0)); iWidth = m_sizeImage.cx; }
int CSHeaderCtrl::DrawSortImage(CDC* pDC, const CRect& rect, LPHDITEM lphdi) { int iWidth = 0; if (rect.Width() > 0) { UINT nSortIndex = SHC_STATE_TO_INDEX_SORT(lphdi->iImage); CImageList* pImageList = GetImageList(); if(nSortIndex != SHC_NONE_SORT && pImageList != NULL) { POINT point; point.y = rect.CenterPoint().y - ((m_sizeImage.cy+1) >> 1); point.x = rect.left; SIZE size; size.cx = rect.Width() < m_sizeImage.cx ? rect.Width() : m_sizeImage.cx; size.cy = m_sizeImage.cy; // save image list background color COLORREF rgb = pImageList->GetBkColor(); // set image list background color to same as header control pImageList->DrawIndirect(pDC, GetIndexOfImageList(nSortIndex), point, size, CPoint(0, 0)); iWidth = size.cx; }
/************************************************************************ getBitmapFromImagelist 이미지 리스트로 부터 단일 오브젝트를 추출한다. @param : @return : @remark : http://www.codeproject.com/bitmap/getimagefromlist.asp @author : youngchang ([email protected]) @history: 2005/12/16:CREATED ************************************************************************/ void CFishBMPManager::GetBMPfromList(CDC* pDC, CImageList *lstImages, int nImage, CBitmap* destBitmap) { destBitmap->DeleteObject(); CImageList tmpList; tmpList.Create(lstImages); tmpList.Copy( 0, nImage, ILCF_SWAP ); IMAGEINFO lastImage; tmpList.GetImageInfo(0,&lastImage); CDC dcMem; dcMem.CreateCompatibleDC (pDC); CRect rect (lastImage.rcImage); destBitmap->CreateCompatibleBitmap (pDC, rect.Width (), rect.Height ()); CBitmap* pBmpOld = dcMem.SelectObject (destBitmap); tmpList.DrawIndirect (&dcMem, 0, CPoint (0, 0), CSize (rect.Width (), rect.Height ()), CPoint (0, 0)); dcMem.SelectObject (pBmpOld); }
/////////////////////////////////////////////////////////////////////////////// // DrawImage int CXHeaderCtrl::DrawImage(CDC* pDC, CRect rect, LPHDITEM lphdi, BOOL bRight) { CImageList* pImageList = GetImageList(); int iWidth = 0; if (lphdi->iImage != XHEADERCTRL_NO_IMAGE) { if (pImageList) { if (rect.Width() > 0) { POINT point; point.y = rect.CenterPoint().y - (m_sizeImage.cy >> 1); if (bRight) point.x = rect.right - m_sizeImage.cx; else point.x = rect.left; SIZE size; size.cx = rect.Width()<m_sizeImage.cx ? rect.Width():m_sizeImage.cx; size.cy = m_sizeImage.cy; // save image list background color COLORREF rgb = pImageList->GetBkColor(); // set image list background color to same as header control pImageList->SetBkColor(pDC->GetBkColor()); pImageList->DrawIndirect(pDC, lphdi->iImage, point, size, CPoint(0, 0)); pImageList->SetBkColor(rgb); iWidth = m_sizeImage.cx; } } }
// Based on code by Frank Kobs. CImageList* CDragDropListCtrl::CreateDragImageEx(LPPOINT lpPoint) { CRect rectSingle; CRect rectComplete(0, 0, 0, 0); int nIndex = -1; BOOL bFirst = TRUE; // Determine the size of the drag image. POSITION pos = GetFirstSelectedItemPosition(); while (pos) { nIndex = GetNextSelectedItem(pos); GetItemRect(nIndex, rectSingle, LVIR_BOUNDS); if (bFirst) { // Initialize the CompleteRect GetItemRect(nIndex, rectComplete, LVIR_BOUNDS); bFirst = FALSE; } rectComplete.UnionRect(rectComplete, rectSingle); } // Create bitmap in memory DC CClientDC dcClient(this); CDC dcMem; CBitmap Bitmap; if (!dcMem.CreateCompatibleDC(&dcClient)) { return NULL; } if (!Bitmap.CreateCompatibleBitmap(&dcClient, rectComplete.Width(), rectComplete.Height())) { return NULL; } CBitmap* pOldMemDCBitmap = dcMem.SelectObject(&Bitmap); // Here green is used as mask color. dcMem.FillSolidRect(0, 0, rectComplete.Width(), rectComplete.Height(), RGB(0, 255, 0)); // Paint each DragImage in the DC. CImageList* pSingleImageList = NULL; CPoint pt; pos = GetFirstSelectedItemPosition(); while (pos) { nIndex = GetNextSelectedItem(pos); GetItemRect(nIndex, rectSingle, LVIR_BOUNDS); pSingleImageList = CreateDragImage(nIndex, &pt); if (pSingleImageList) { // Make sure width takes into account not using LVS_EX_FULLROWSELECT style. IMAGEINFO ImageInfo; pSingleImageList->GetImageInfo(0, &ImageInfo); rectSingle.right = rectSingle.left + (ImageInfo.rcImage.right - ImageInfo.rcImage.left); pSingleImageList->DrawIndirect( &dcMem, 0, CPoint(rectSingle.left - rectComplete.left, rectSingle.top - rectComplete.top), rectSingle.Size(), CPoint(0,0)); delete pSingleImageList; } } dcMem.SelectObject(pOldMemDCBitmap); // Create the imagelist with the merged drag images. CImageList* pCompleteImageList = new CImageList; pCompleteImageList->Create(rectComplete.Width(), rectComplete.Height(), ILC_COLOR | ILC_MASK, 0, 1); // Here green is used as mask color. pCompleteImageList->Add(&Bitmap, RGB(0, 255, 0)); Bitmap.DeleteObject(); // As an optional service: // Find the offset of the current mouse cursor to the imagelist // this we can use in BeginDrag(). if (lpPoint) { CPoint ptCursor; GetCursorPos(&ptCursor); ScreenToClient(&ptCursor); lpPoint->x = ptCursor.x - rectComplete.left; lpPoint->y = ptCursor.y - rectComplete.top; } return pCompleteImageList; }
///////////////////////////////////////////////////////////////////////////// // handle custom drawing ///////////////////////////////////////////////////////////////////////////// void CCustomListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult) { int nItem; CSize sizeSpacing; CDC *pDC; CRect rect; CImageList *pImage; COLORREF color; NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR ); // Take the default processing unless we set this to something else below. *pResult = CDRF_DODEFAULT; // First thing - check the draw stage. If it's the control's prepaint // stage, then tell Windows we want messages for every item. if(CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) { GetClientRect(&rect); //get device context pDC = CDC::FromHandle(pLVCD->nmcd.hdc); //clear background pDC->FillSolidRect(&rect, COLOR_BLACK); *pResult = CDRF_NOTIFYITEMDRAW; } else if(CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) { //get the image list pImage = GetImageList(LVSIL_NORMAL); //get the item nItem = pLVCD->nmcd.dwItemSpec; //get the item spacing sizeSpacing = SetIconSpacing(0, 0); SetIconSpacing(sizeSpacing); //get device context pDC = CDC::FromHandle(pLVCD->nmcd.hdc); //get the item rect GetItemRect(nItem, &rect, LVIR_ICON); //set normal color color = TAB_COLOR_BACKGROUND; //offset the rect if needed if(LIST_CHIT_SPACING == m_nIconSize) { rect.OffsetRect(3, 0); } //fill selection background if(nItem == m_nSelection) { //get highlight color color = ::GetSysColor(COLOR_HIGHLIGHT); //fill it with the selected color pDC->FillSolidRect(&rect, color); } //offset the rect if needed if(LIST_CHIT_SPACING == m_nIconSize) { rect.OffsetRect(-3, 0); } //now draw the item if(NULL != pImage) { pImage->DrawIndirect(pDC, nItem, CPoint(rect.left + 4, rect.top + 2), CSize(32, 32), CPoint(0, 0)); } // Tell Windows to paint the control itself. *pResult = CDRF_SKIPDEFAULT; } }