CBitmap *CDeviceView::GrabViewImage() { CBitmap *pbm = CBitmap::Create(GetClientSize(), RGB(0, 0, 0), NULL); if (!pbm) return NULL; HDC hDC = pbm->BeginPaintInto(); if (!hDC) { delete pbm; return NULL; } OnPaint(hDC); pbm->EndPaintInto(hDC); return pbm; }
void AssureSize(CBitmap *&pbm, SIZE to) { if (!pbm) return; SIZE from; if (!pbm->GetSize(&from)) return; if (from.cx >= to.cx && from.cy >= to.cy) return; CBitmap *nbm = CBitmap::Create(to, RGB(0,0,0)); if (!nbm) return; HDC hDC = nbm->BeginPaintInto(); pbm->Draw(hDC); nbm->EndPaintInto(hDC); delete pbm; pbm = nbm; nbm = NULL; }
void CDeviceView::OnPaint(HDC hDC) { HDC hBDC = NULL, hODC = NULL; CBitmap *pbm = NULL; if (!InRenderMode()) { hODC = hDC; pbm = CBitmap::Create(GetClientSize(), RGB(0, 0, 0), hDC); if (pbm != NULL) { hBDC = pbm->BeginPaintInto(); if (hBDC != NULL) hDC = hBDC; } } // Black-fill first SIZE fillsz = GetClientSize(); RECT fillrc = {0, 0, fillsz.cx, fillsz.cy}; FillRect(hDC, &fillrc, (HBRUSH)GetStockObject(BLACK_BRUSH)); if (m_pbmImage != NULL) m_pbmImage->Blend(hDC); BOOL bScroll = m_bScrollEnable && m_sb.m_hWnd; int sdc = 0; if (bScroll) { sdc = SaveDC(hDC); OffsetViewportOrgEx(hDC, 0, -m_nScrollOffset + g_iListHeaderHeight, NULL); } else if (m_bScrollEnable) { sdc = SaveDC(hDC); OffsetViewportOrgEx(hDC, 0, g_iListHeaderHeight, NULL); } int miny = 0 + m_nScrollOffset; int maxy = g_sizeImage.cy + m_nScrollOffset; int t, nt = GetNumTexts(); for (t = 0; t < nt; t++) { CDeviceViewText *pText = m_arpText[t]; if (pText != NULL && !(pText->GetMinY() > maxy || pText->GetMaxY() < miny)) pText->OnPaint(hDC); } BOOL bCFGUIEdit = m_ui.m_uig.InEditMode(); BOOL bEitherEditMode = bCFGUIEdit; int c, nc = GetNumControls(); for (c = 0; c < nc; c++) if (m_arpControl[c] != NULL && m_arpControl[c]->HasOverlay() && (m_arpControl[c]->IsHighlighted() ) && (bEitherEditMode || m_arpControl[c]->IsMapped())) m_arpControl[c]->DrawOverlay(hDC); for (c = 0; c < nc; c++) { CDeviceControl *pControl = m_arpControl[c]; if (pControl != NULL && (bEitherEditMode || pControl->IsMapped()) && !(pControl->GetMinY() > maxy || pControl->GetMaxY() < miny)) pControl->OnPaint(hDC); } if (bScroll || m_bScrollEnable) { RestoreDC(hDC, sdc); sdc = 0; } // Black fill the top portion if this is a list view if (bScroll) { GetClientRect(&fillrc); fillrc.bottom = g_iListHeaderHeight; FillRect(hDC, &fillrc, (HBRUSH)GetStockObject(BLACK_BRUSH)); } // Print out the headers TCHAR tszHeader[MAX_PATH]; // Control column if (m_arpText.GetSize()) { CPaintHelper ph(m_ui.m_uig, hDC); ph.SetElement(UIE_CALLOUT); for (int i = 0; i < 2; i++) { // Check if there are two columns, break out the 2nd iteration if not 2 columns. if (i == 1 && !(GetNumControls() > 1 && m_arpControl[0]->GetCalloutMaxRect().top == m_arpControl[1]->GetCalloutMaxRect().top)) break; RECT rcheader; if (m_arpText.GetSize()) { rcheader = m_arpText[i]->GetRect(); rcheader.bottom -= rcheader.top; rcheader.top = 0; LoadString(g_hModule, IDS_LISTHEADER_CTRL, tszHeader, MAX_PATH); DrawText(hDC, tszHeader, -1, &rcheader, DT_LEFT|DT_NOPREFIX|DT_CALCRECT); if (rcheader.right > m_arpText[i]->GetRect().right) rcheader.left -= rcheader.right - m_arpText[i]->GetRect().right; DrawText(hDC, tszHeader, -1, &rcheader, DT_LEFT|DT_NOPREFIX); // Action column rcheader = m_arpControl[i]->GetCalloutMaxRect(); rcheader.bottom -= rcheader.top; rcheader.top = 0; LoadString(g_hModule, IDS_LISTHEADER_ACTION, tszHeader, MAX_PATH); DrawText(hDC, tszHeader, -1, &rcheader, DT_CENTER|DT_NOPREFIX); } } } if (!InRenderMode()) { if (pbm != NULL) { if (hBDC != NULL) { pbm->EndPaintInto(hBDC); pbm->Draw(hODC); } delete pbm; } } }