void ConvertToPARGB32(HDC hdc, ARGB *pargb, HBITMAP hbmp, SIZE& sizImage, int cxRow) { BITMAPINFO bmi; InitBitmapInfo(bmi, sizImage); void *pvBits = malloc(sizImage.cx * 4 * sizImage.cy); if (GetDIBits(hdc, hbmp, 0, bmi.bmiHeader.biHeight, pvBits, &bmi, DIB_RGB_COLORS) == bmi.bmiHeader.biHeight) { ULONG cxDelta = cxRow - bmi.bmiHeader.biWidth; ARGB *pargbMask = (ARGB *)pvBits; for (ULONG y = bmi.bmiHeader.biHeight + 1; --y; ) { for (ULONG x = bmi.bmiHeader.biWidth + 1; --x; ) { if (*pargbMask++) { // transparent pixel *pargb++ = 0; } else { // opaque pixel *pargb++ |= 0xFF000000; } } pargb += cxDelta; } } free(pvBits); }
IplImage *CCamOpenCV::CaptureImage() { if (_capture) { if (cvGrabFrame(_capture)) { IplImage *cvImage = cvRetrieveFrame(_capture); if (cvImage && cvImage->width != _bitmapInfo.bmiHeader.biWidth && cvImage->height != _bitmapInfo.bmiHeader.biHeight) { InitBitmapInfo(cvImage->width, cvImage->height, cvImage->widthStep / cvImage->width); } return cvImage; } } return NULL; }
HRESULT Create32BitHBITMAP(HDC hdc, const SIZE *psize, void **ppvBits, HBITMAP* phBmp) { *phBmp = NULL; BITMAPINFO bmi; InitBitmapInfo(&bmi, sizeof(bmi), psize->cx, psize->cy, 32); HDC hdcUsed = hdc ? hdc : GetDC(NULL); if (hdcUsed) { *phBmp = CreateDIBSection(hdcUsed, &bmi, DIB_RGB_COLORS, ppvBits, NULL, 0); if (hdc != hdcUsed) { ReleaseDC(NULL, hdcUsed); } } return (NULL == *phBmp) ? E_OUTOFMEMORY : S_OK; }
/////////////////////////////////////////////////////////////////////////////////////// // private helper for IconToPARGB32Bitmap BOOL ConvertToPARGB32(HDC hdc, ARGB *pargb, HBITMAP hbmp, SIZE& sizImage, int cxRow) { BOOL bSuccess = FALSE; BITMAPINFO bmi = { 0 }; InitBitmapInfo(&bmi, sizeof(bmi), sizImage.cx, sizImage.cy, 32); HANDLE hHeap = GetProcessHeap(); void *pvBits = HeapAlloc(hHeap, 0, bmi.bmiHeader.biWidth * 4 * bmi.bmiHeader.biHeight); if (pvBits) { if (GetDIBits(hdc, hbmp, 0, bmi.bmiHeader.biHeight, pvBits, &bmi, DIB_RGB_COLORS) == bmi.bmiHeader.biHeight) { ULONG cxDelta = (cxRow - bmi.bmiHeader.biWidth); ARGB *pargbMask = static_cast<ARGB *>(pvBits); for (ULONG y = bmi.bmiHeader.biHeight; y; --y) { for (ULONG x = bmi.bmiHeader.biWidth; x; --x) { if (*pargbMask++) { // transparent pixel *pargb++ = 0; } else { // opaque pixel *pargb++ |= 0xFF000000; } } pargb += cxDelta; } bSuccess = TRUE; } HeapFree(hHeap, 0, pvBits); } return bSuccess; }
HRESULT ConvertToPARGB32(HDC hdc, ARGB *pargb, HBITMAP hbmp, SIZE& sizImage, int cxRow) { BITMAPINFO bmi; InitBitmapInfo(&bmi, sizeof(bmi), sizImage.cx, sizImage.cy, 32); HRESULT hr = E_OUTOFMEMORY; HANDLE hHeap = GetProcessHeap(); void *pvBits = HeapAlloc(hHeap, 0, bmi.bmiHeader.biWidth * 4 * bmi.bmiHeader.biHeight); if (pvBits) { hr = E_UNEXPECTED; if (GetDIBits(hdc, hbmp, 0, bmi.bmiHeader.biHeight, pvBits, &bmi, DIB_RGB_COLORS) == bmi.bmiHeader.biHeight) { ULONG cxDelta = cxRow - bmi.bmiHeader.biWidth; ARGB *pargbMask = static_cast<ARGB *>(pvBits); for (ULONG y = bmi.bmiHeader.biHeight; y; --y) { for (ULONG x = bmi.bmiHeader.biWidth; x; --x) { if (*pargbMask++) { // transparent pixel *pargb++ = 0; } else { // opaque pixel *pargb++ |= 0xFF000000; } } pargb += cxDelta; } hr = S_OK; } HeapFree(hHeap, 0, pvBits); } return hr; }
HBITMAP ConvertIconToBitmap(HICON hicon, HIMAGELIST hIml, int iconId) { SIZE sizIcon; sizIcon.cx = GetSystemMetrics(SM_CXSMICON); sizIcon.cy = GetSystemMetrics(SM_CYSMICON); RECT rcIcon = { 0, 0, sizIcon.cx, sizIcon.cy }; HDC hdc = CreateCompatibleDC(NULL); BITMAPINFO bmi; InitBitmapInfo(bmi, sizIcon); HBITMAP hbmp = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, NULL, NULL, 0); HBITMAP hbmpOld = (HBITMAP)SelectObject(hdc, hbmp); BLENDFUNCTION bfAlpha = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; BP_PAINTPARAMS paintParams = {0}; paintParams.cbSize = sizeof(paintParams); paintParams.dwFlags = BPPF_ERASE; paintParams.pBlendFunction = &bfAlpha; HDC hdcBuffer; HANDLE hPaintBuffer = beginBufferedPaint(hdc, &rcIcon, BPBF_DIB, &paintParams, &hdcBuffer); if (hPaintBuffer) { if (hIml) ImageList_Draw(hIml, iconId, hdc, 0, 0, ILD_TRANSPARENT); else DrawIconEx(hdcBuffer, 0, 0, hicon, sizIcon.cx, sizIcon.cy, 0, NULL, DI_NORMAL); // If icon did not have an alpha channel we need to convert buffer to PARGB ConvertBufferToPARGB32(hPaintBuffer, hdc, hicon, sizIcon); // This will write the buffer contents to the destination bitmap endBufferedPaint(hPaintBuffer, TRUE); } SelectObject(hdc, hbmpOld); DeleteDC(hdc); return hbmp; }
/////////////////////////////////////////////////////////////////////////////////////// // private helper for IconToPARGB32Bitmap BOOL Create32BitHBITMAP(HDC hdc, const SIZE *psize, void **ppvBits, HBITMAP* phBmp) { *phBmp = NULL; BITMAPINFO bmi = { 0 }; InitBitmapInfo(&bmi, sizeof(bmi), psize->cx, psize->cy, 32); HDC hdcUsed = (hdc ? hdc : ::GetDC(NULL)); if (hdcUsed) { *phBmp = CreateDIBSection(hdcUsed, &bmi, DIB_RGB_COLORS, ppvBits, NULL, 0); if (hdc != hdcUsed) { ::ReleaseDC(NULL, hdcUsed); } } return (NULL != *phBmp); }
void duTreeCtrl::DrawObject(HDC hDC) { duRect rcTreeCtrl; Plugin_GetRect(this, &rcTreeCtrl); rcTreeCtrl.OffsetRect(-rcTreeCtrl.left, -rcTreeCtrl.top); BITMAPINFO bmInfo; BYTE *pBits; HDC hMemDC = ::CreateCompatibleDC(hDC); InitBitmapInfo(&bmInfo, rcTreeCtrl.Width(), rcTreeCtrl.Height()); HBITMAP hBmp = ::CreateDIBSection(hDC, &bmInfo, DIB_RGB_COLORS,(void**)&pBits, 0, 0); HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBmp); BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA}; ::AlphaBlend(hMemDC, 0, 0, rcTreeCtrl.Width(), rcTreeCtrl.Height(), hDC, 0, 0, rcTreeCtrl.Width(), rcTreeCtrl.Height(), bf); duStyleGroup *pStyleGroup = (duStyleGroup *)GetResObj(GetStyle(), DU_RES_STYLEGROUP); if (pStyleGroup) pStyleGroup->Draw(hMemDC, &rcTreeCtrl, GetState(), NULL, GetAlpha()); int nOffsetY = 0; TreeCtrlItem *pFirstVisible = GetFirstVisibleItem(nOffsetY); if (pFirstVisible == NULL || pFirstVisible == m_pRoot) return; duRect rcClient = _GetClientRect(); POINT ptView = GetViewPoint(); duFont *pFont = (duFont *)GetResObj(m_szFont, DU_RES_FONT); duSize sizeView; GetViewSize(&sizeView); int nDrawHeight = -nOffsetY; TreeCtrlItem *pItem = pFirstVisible; while (pItem) { duRect rcItem; rcItem.left = -ptView.x; rcItem.right = rcClient.right; rcItem.top = nDrawHeight; rcItem.bottom = rcItem.top + m_nItemHeight; UINT uItemState = DU_STATE_NORMAL; if (pItem == m_pHot) uItemState = DU_STATE_OVER; if (pItem == m_pSelect) uItemState = DU_STATE_PRESS; DrawByStyle(this, m_szItemStyle, hMemDC, &rcItem, uItemState, NULL, GetAlpha()); // draw indent[-+] int nLeft = (pItem->nLevel - 1) * m_nIndentWidth; duRect rcIndent = CalcVCenterRect(rcItem, nLeft, m_nIndentWidth, m_nIndentHeight); if (ItemHasChildren(pItem)) { UINT nIndentState = pItem->fExpand ? DU_STATE_NORMAL : DU_STATE_CHECKED; DrawByStyle(this, m_szIndentStyle, hMemDC, &rcIndent, nIndentState, NULL, GetAlpha()); } // draw icon nLeft += (m_nIndentWidth + m_nIndentIconSpace); duRect rcIcon = CalcVCenterRect(rcItem, nLeft, m_nIconWidth, m_nIconHeight); duImage *pIcon = (duImage *)GetResObj(pItem->strImage.c_str(), DU_RES_IMAGE); if (pIcon) DrawNormal(hMemDC, rcIcon.left, rcIcon.top, rcIcon.Width(), rcIcon.Height(), pIcon, 0, 0, GetAlpha()); // draw text duRect rcText; nLeft += (m_nIconWidth + m_nIconTextSpace); rcText = rcItem; rcText.left = rcItem.left + nLeft; if (pItem->strText.length() > 0) DrawText32Bpp(hMemDC, pFont, m_clrText, pItem->strText.c_str(), pItem->strText.length(), &rcText, DT_LEFT|DT_VCENTER|DT_SINGLELINE, GetAlpha()); if (nDrawHeight - nOffsetY > rcTreeCtrl.Height()) break; nDrawHeight += m_nItemHeight; pItem = GetNextVisibleItem(pItem); } ::AlphaBlend(hDC, 0, 0, rcTreeCtrl.Width(), rcTreeCtrl.Height(), hMemDC, 0, 0, rcTreeCtrl.Width(), rcTreeCtrl.Height(), bf); ::SelectObject(hMemDC, hOldBitmap); ::DeleteObject(hBmp); ::DeleteDC(hMemDC); }