void CBackgndImageDlg::OnPaint() { CPaintDC dc(this); // device context for painting if (m_Bitmap.GetSafeHandle () == NULL) { dc.FillSolidRect (m_rectPreview, ::GetSysColor (COLOR_3DFACE)); CString str = _T("No image to display"); dc.SetBkMode (TRANSPARENT); dc.DrawText (str, m_rectPreview, DT_CENTER | DT_VCENTER | DT_WORDBREAK); return; } BITMAP bmp; m_Bitmap.GetBitmap (&bmp); int cx = bmp.bmWidth; int cy = bmp.bmHeight; int cxdest; int cydest; CRect rectRest = m_rectPreview; if (cx > cy) { cxdest = m_rectPreview.Width (); cydest = cx > cxdest ? m_rectPreview.Height () * cxdest / cx : m_rectPreview.Height () * cx / cxdest; rectRest.top += cydest; } else { cydest = m_rectPreview.Height (); cxdest = cy > cydest ? m_rectPreview.Width () * cydest / cy : m_rectPreview.Width () * cy / cydest; rectRest.left += cxdest; } dc.FillSolidRect (rectRest, ::GetSysColor (COLOR_3DFACE)); CDC dcMem; dcMem.CreateCompatibleDC (&dc); CBitmap* pBmpOld = dcMem.SelectObject (&m_Bitmap); dc.StretchBlt (m_rectPreview.left, m_rectPreview.top, cxdest, cydest, &dcMem, 0, 0, cx, cy, SRCCOPY); dcMem.SelectObject (pBmpOld); CBCGPDrawManager dm (dc); dm.HighlightRect (CRect (m_rectPreview.TopLeft (), CSize (cxdest, cydest)), m_iBright); }
void CImageStyle::FillArea (CDC* pDC, CRect rect, const CWnd* pWnd, BOOL bIsFloating, BOOL bNCArea) { if (m_bmpBack.GetSafeHandle () == NULL) { globalData.clrBtnText = m_clrText; // Load background bitmap: if (!m_bIsInternalImage) { HBITMAP hbmp = (HBITMAP) ::LoadImage ( AfxGetInstanceHandle (), m_strImagePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); VERIFY (hbmp != NULL); m_bmpBack.Attach (hbmp); } else { m_bmpBack.LoadBitmap (IDB_BACKGROUND); } BITMAP bmp; m_bmpBack.GetBitmap (&bmp); m_sizeBmp = CSize (bmp.bmWidth, bmp.bmHeight); } int xOffset = rect.left; int yOffset = rect.top; if (!bIsFloating && !pWnd->IsKindOf (RUNTIME_CLASS (CBCGPPopupMenuBar))) { CRect rectMainFrame; pWnd->GetTopLevelFrame ()->GetWindowRect (rectMainFrame); pWnd->ScreenToClient (&rectMainFrame); xOffset = rectMainFrame.left % m_sizeBmp.cx; yOffset = rectMainFrame.top % m_sizeBmp.cy; if (bNCArea) { CRect rectWindow; pWnd->GetWindowRect (rectWindow); pWnd->ScreenToClient (rectWindow); CRect rectClientActual; pWnd->GetClientRect (rectClientActual); xOffset += rectClientActual.left - rectWindow.left; yOffset += rectClientActual.top - rectWindow.top; } } for (int x = xOffset; x < rect.right; x += m_sizeBmp.cx) { for (int y = yOffset; y < rect.bottom; y += m_sizeBmp.cy) { pDC->DrawState (CPoint (x, y), m_sizeBmp, &m_bmpBack, 0); } } CBCGPDrawManager dm (*pDC); dm.HighlightRect (rect, m_nHighlight); }