bool CExtAviLabel::AviSizeFromContent( CSize & sizeBefore, CSize & sizeAfter, bool bMoveWindow // = true ) { ASSERT_VALID( this ); if( GetSafeHwnd() == NULL ) return false; if( AviIsEmpty() ) return false; CWnd * pWndParent = GetParent(); if( pWndParent == NULL ) return false; bool bChildMode = ( ( GetStyle() & WS_CHILD ) != 0 ) ? true : false; CRect rcWnd; GetWindowRect( &rcWnd ); if( bChildMode ) pWndParent->ScreenToClient( &rcWnd ); CRect rcClient; GetClientRect( &rcClient ); CSize sizePrevious = rcWnd.Size(); CSize sizeClient = rcClient.Size(); CSize sizeNonClient = sizePrevious - sizeClient; CSize sizeAviFrame = AviFrameGetSize(); CRect rcDst( rcWnd.left, rcWnd.top, rcWnd.left + sizeNonClient.cx + sizeAviFrame.cx, rcWnd.top + sizeNonClient.cy + sizeAviFrame.cy ); CSize sizeDst = rcDst.Size(); sizeBefore = sizePrevious; sizeAfter = sizeDst; if( sizeDst == sizePrevious ) return false; if( bMoveWindow ) MoveWindow( &rcDst ); return true; }
void ViewTest2::TestDrawRoot() { // Attempt valid call. This is after Layout has been called m_psts->Output(" FUNCTION: DrawRoot(m_qvg, {0,0,96,96}, {0,0,192,192}) \n"); Rect rcSrc(0,0,96,96); Rect rcDst(0,0,182,182); CheckHr(m_qrootb->DrawRoot(m_qvg, rcSrc, rcDst)); TestHeight(); TestWidth(); TestLayout(200); m_psts->Output("\n FUNCTION: DrawRoot(m_qvg, {0,0,96,96}, {0,0,96,96}) \n"); CheckHr(m_qrootb->DrawRoot(m_qvg, rcSrc, rcSrc)); TestHeight(); TestWidth(); }
void CRenderUtility::DrawImage( HDC hDC, Image* pImage, RECT &rctDst, RECT&rctSrc, int nAlpha /*= 255*/ ) { if(pImage == NULL || nAlpha == 0) return; float fAlpha = (float)nAlpha / 255.0f; Graphics graph(hDC); ColorMatrix colorMatrix={1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, fAlpha, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; ImageAttributes imgAtt; imgAtt.SetColorMatrix(&colorMatrix); Rect rcDst(rctDst.left, rctDst.top, RECT_WIDTH(rctDst), RECT_HEIGHT(rctDst)); graph.DrawImage(pImage, rcDst, rctSrc.left, rctSrc.top, RECT_WIDTH(rctSrc), RECT_HEIGHT(rctSrc), UnitPixel, &imgAtt); }
////////////////// // Create bitmap from contents of screen rectangle // This must be called right after creating a bitmap using the // default constructor; e.g. // WPBitmap foo; // foo.copyScreen(myrect); // void WPBitmap::copyScreen(WPRect &rc) { WPDisplay dcScreen; // the whole display // Intersect rectangle with screen dimensions WPRect rcScreen((WPWin*)NULL); rc &= rcScreen; // Initialize bitmap to appropriate size destroy(); hobj = CreateCompatibleBitmap(dcScreen, rc.width(), rc.height()); assert(hobj); del = TRUE; init(); // Copy the bits WPMemDC dcMem(&dcScreen, this); WPRect rcDst(0,0,rc.width(),rc.height()); dcMem.bitBlt(rcDst, dcScreen, rc.origin()); }
HRESULT ViewTest2::Run() { // Make a special VwGraphics (#define BASELINE in compiling it turns on special features). // This VwGraphics will not draw (2nd arg false) but will record attempts at drawing into // the baseline. m_psts = NewObj SilTestSite(); m_qst.Attach(m_psts); m_qvg.Attach(NewObj VwGraphics(m_psts, false, true)); m_qst->SetBaselineFile(SmartBstr(L"c:\\fw\\testlog\\log\\VwGraphics").Bstr()); // Todo LukeU(JohnT): make an off-screen bitmap HDC and initialize the VwGraphics to use it. // Here is your off-screen bitmap and memory surface HDC hdcScr, hdcMem; hdcScr = GetDC(NULL); hdcMem = CreateCompatibleDC(hdcScr); HBITMAP hBitmap = CreateCompatibleBitmap(hdcMem, 400, 400); SelectObject(hdcMem, hBitmap); ReleaseDC(NULL, hdcScr); m_qvg->Initialize(hdcMem); // Make a dummy root site for the Root box to talk back to m_qtrs.Attach(NewObj VwTestRootSite); m_qtrs->SetVgObject(m_qvg); Rect rcSrc(0, 0, 96, 96); Rect rcDst(0, 0, 96, 96); m_qtrs->SetSrcRoot(rcSrc); m_qtrs->SetDstRoot(rcDst); // Make our view constructor. m_qtvc.Attach(NewObj TestStVc); // Put some dummy data into a cache. HVO 1 identifies the text as a whole. // Arbitrarily objects 2, 3, and 4 are the three paragraphs of our test data. m_qda.Attach(NewObj VwCacheDa); HVO rghvoPara[3] = {2, 3, 4}; m_qda->CacheVecProp(1, kflidStText_Paragraphs, rghvoPara, 3); ITsStrFactoryPtr qtsf; qtsf.CreateInstance(CLSID_TsStrFactory); ITsStringPtr qtss; int enc = 100; StrUni stuPara0 = L"This is the first paragraph"; StrUni stuPara1 = L"Here is another paragraph, quite silly and trivial but it should " L"help test things"; StrUni stuPara2 = L"I try to keep the text in these quite different so they can't be " L"confused"; CheckHr(qtsf->MakeStringRgch(stuPara0.Chars(), stuPara0.Length(), enc, &qtss)); m_qda->CacheStringProp(rghvoPara[0], kflidStTxtPara_Contents, qtss); CheckHr(qtsf->MakeStringRgch(stuPara1.Chars(), stuPara1.Length(), enc, &qtss)); m_qda->CacheStringProp(rghvoPara[1], kflidStTxtPara_Contents, qtss); CheckHr(qtsf->MakeStringRgch(stuPara2.Chars(), stuPara2.Length(), enc, &qtss)); m_qda->CacheStringProp(rghvoPara[2], kflidStTxtPara_Contents, qtss); ITsPropsBldrPtr qtpb; qtpb.CreateInstance(CLSID_TsPropsBldr); StrUni stuNormal = L"Normal"; CheckHr(qtpb->SetStrPropValue(kspNamedStyle, stuNormal.Bstr())); // Make the root box and initialize it. m_qrootb.CreateInstance(CLSID_VwRootBox); // OK, we have a root box set up. Now we can try some tests on it! TestInit(); TestDataAccess(); TestLayout(350); TestDrawRoot(); TestOverlay(); TestMakeSimpleSel(); TestMakeTextSelection(); TestKeys(); TestMouse(); Testget_Site(); TestLoseFocus(); TestListener(); m_qrootb->Close(); m_qrootb.Clear(); m_qda.Clear(); DeleteDC(hdcMem); DeleteObject(hBitmap); return S_OK; }
void CExtAviLabel::DoPaint( CDC * pDC, CRect & rcClient ) { ASSERT_VALID( this ); CSize sizeClient = rcClient.Size(); if( sizeClient.cx <= 0 || sizeClient.cy <= 0 ) return; if( ! ::RectVisible( pDC->GetSafeHdc(), &rcClient ) ) return; CExtMemoryDC dc( pDC, &rcClient ); CRgn rgnClient; if( rgnClient.CreateRectRgnIndirect( &rcClient ) ) dc.SelectClipRgn( &rgnClient ); OnEraseBackground( dc, rcClient ); if( ( ! AviIsEmpty() ) && ( m_bSeek || m_bPlaying || ( ( ! m_bPlaying ) && ( ( AviStyleGet() & __EXT_AVI_EMPTY_BACKGROUND_ON_STOP ) == 0 ) ) ) ) { // OnAviPaintCurrentFrame( dc, rcClient, m_sizeAvi ); DWORD dwWndStyle = GetStyle(); DWORD dwWndType = (dwWndStyle&SS_TYPEMASK); bool bCenterImage = ( (dwWndStyle&SS_CENTERIMAGE) != 0 ); e_ImageMode_t eImageMode = GetImageMode(); if( eImageMode == eStretch ) { CSize sizeAvi = rcClient.Size(); OnAviPaintCurrentFrame( dc, rcClient, sizeAvi ); } else if( eImageMode == eTouchInside || eImageMode == eTouchOutside ) { CRect rcTouchSurface = rcClient; CExtMemoryDC dcTouch( &dc, rcTouchSurface, CExtMemoryDC::MDCOPT_TO_MEMORY|CExtMemoryDC::MDCOPT_FILL_BITS|CExtMemoryDC::MDCOPT_RTL_COMPATIBILITY ); if( dcTouch.GetSafeHdc() ) { CSize sizeTouchSrc = rcTouchSurface.Size(); CSize sizeBmp = m_sizeAvi; double lfAspectX = double(rcTouchSurface.Width()) / double(sizeBmp.cx); double lfAspectY = double(rcTouchSurface.Height()) / double(sizeBmp.cy); double lfAspect = ( eImageMode == eTouchInside ) ? ( min( lfAspectX, lfAspectY ) ) : ( max( lfAspectX, lfAspectY ) ); CSize sizeNew( LONG(double(sizeBmp.cx)*lfAspect), LONG(double(sizeBmp.cy)*lfAspect) ); CRect rcTouchDst( rcTouchSurface.left, rcTouchSurface.top, rcTouchSurface.left + sizeNew.cx, rcTouchSurface.top + sizeNew.cy ); if( eImageMode == eTouchInside ) { if( sizeNew.cx > sizeTouchSrc.cx ) rcTouchDst.OffsetRect( ( sizeNew.cx - sizeTouchSrc.cx ) / 2, 0 ); if( sizeNew.cy > sizeTouchSrc.cy ) rcTouchDst.OffsetRect( 0, ( sizeNew.cy - sizeTouchSrc.cy ) / 2 ); } else { rcTouchDst.OffsetRect( - ( sizeNew.cx - sizeTouchSrc.cx ) / 2, 0 ); rcTouchDst.OffsetRect( 0, - ( sizeNew.cy - sizeTouchSrc.cy ) / 2 ); } CSize sizeAvi = rcTouchDst.Size(); OnAviPaintCurrentFrame( dcTouch, rcTouchDst, sizeAvi ); } } else if( eImageMode == eTile ) { UINT nStepCountH = sizeClient.cx / m_sizeAvi.cx + ( ( sizeClient.cx % m_sizeAvi.cx ) ? 1 : 0 ); UINT nStepCountV = sizeClient.cy / m_sizeAvi.cy + ( ( sizeClient.cy % m_sizeAvi.cy ) ? 1 : 0 ); if( nStepCountH > 0 && nStepCountV > 0 ) { UINT nStepIndexH, nStepIndexV; for( nStepIndexV = 0; nStepIndexV < nStepCountV; nStepIndexV ++ ) { CRect rcWalk( rcClient.TopLeft(), m_sizeAvi ); rcWalk.OffsetRect( 0, m_sizeAvi.cy * nStepIndexV ); for( nStepIndexH = 0; nStepIndexH < nStepCountH; nStepIndexH ++ ) { if( ::RectVisible( dc.GetSafeHdc(), &rcWalk ) ) OnAviPaintCurrentFrame( dc, rcWalk, m_sizeAvi ); rcWalk.OffsetRect( m_sizeAvi.cx, 0 ); } } } } else if( eImageMode == eAlign ) { CRect rcDst( rcClient.left, rcClient.top, rcClient.left + m_sizeAvi.cx, rcClient.top + m_sizeAvi.cy ); bool bCenterHorizontally = false; switch( dwWndType ) { case SS_RIGHT: rcDst.OffsetRect( rcClient.right - rcDst.right, 0 ); break; case SS_CENTER: bCenterHorizontally = true; break; default: /* all the other types assumed as left */ break; } if( bCenterHorizontally ) rcDst.OffsetRect( ( (rcClient.right - rcClient.left) - (rcDst.right - rcDst.left) ) / 2, 0 ); if( bCenterImage ) rcDst.OffsetRect( 0, ( (rcClient.bottom - rcClient.top) - (rcDst.bottom - rcDst.top) ) / 2 ); OnAviPaintCurrentFrame( dc, rcDst, m_sizeAvi ); } } PmBridge_GetPM()->OnPaintSessionComplete( this ); if( rgnClient.GetSafeHandle() != NULL ) dc.SelectClipRgn( &rgnClient ); }
void CExtLabel::DoPaint( CDC * pDC, CRect & rcClient ) { ASSERT_VALID( this ); ASSERT_VALID( pDC ); CExtMemoryDC dc( pDC, &rcClient ); CRgn rgnClient; if( rgnClient.CreateRectRgnIndirect( &rcClient ) ) dc.SelectClipRgn( &rgnClient ); OnEraseBackground( dc, rcClient ); DWORD dwWndStyle = GetStyle(); DWORD dwWndType = (dwWndStyle&SS_TYPEMASK); bool bCenterImage = ( (dwWndStyle&SS_CENTERIMAGE) != 0 ); if( ! m_bmp.IsEmpty() ) { bool bSmootherAsPossible = true; e_ImageMode_t eImageMode = GetImageMode(); if( eImageMode == eStretch ) m_bmp.AlphaBlendSkinParts( dc.GetSafeHdc(), rcClient, CRect(0,0,0,0), CExtBitmap::__EDM_STRETCH, true, bSmootherAsPossible ); else if( eImageMode == eTouchInside || eImageMode == eTouchOutside ) { CRect rcTouchSurface = rcClient; CExtMemoryDC dcTouch( &dc, rcTouchSurface, CExtMemoryDC::MDCOPT_TO_MEMORY|CExtMemoryDC::MDCOPT_FILL_BITS|CExtMemoryDC::MDCOPT_RTL_COMPATIBILITY ); if( dcTouch.GetSafeHdc() ) { CSize sizeTouchSrc = rcTouchSurface.Size(); CSize sizeBmp = m_bmp.GetSize(); double lfAspectX = double(rcTouchSurface.Width()) / double(sizeBmp.cx); double lfAspectY = double(rcTouchSurface.Height()) / double(sizeBmp.cy); double lfAspect = ( eImageMode == eTouchInside ) ? ( min( lfAspectX, lfAspectY ) ) : ( max( lfAspectX, lfAspectY ) ); CSize sizeNew( LONG(double(sizeBmp.cx)*lfAspect), LONG(double(sizeBmp.cy)*lfAspect) ); CRect rcTouchDst( rcTouchSurface.left, rcTouchSurface.top, rcTouchSurface.left + sizeNew.cx, rcTouchSurface.top + sizeNew.cy ); if( eImageMode == eTouchInside ) { if( sizeNew.cx > sizeTouchSrc.cx ) rcTouchDst.OffsetRect( ( sizeNew.cx - sizeTouchSrc.cx ) / 2, 0 ); if( sizeNew.cy > sizeTouchSrc.cy ) rcTouchDst.OffsetRect( 0, ( sizeNew.cy - sizeTouchSrc.cy ) / 2 ); } else { rcTouchDst.OffsetRect( - ( sizeNew.cx - sizeTouchSrc.cx ) / 2, 0 ); rcTouchDst.OffsetRect( 0, - ( sizeNew.cy - sizeTouchSrc.cy ) / 2 ); } INT nOldStretchBltMode = bSmootherAsPossible ? ( ::GetStretchBltMode( dcTouch.m_hDC ) ) : ( COLORONCOLOR ) ; if( bSmootherAsPossible ) ::SetStretchBltMode( dcTouch.m_hDC, ( g_PaintManager.m_bIsWinNT ) ? HALFTONE : COLORONCOLOR ); m_bmp.AlphaBlend( dcTouch.m_hDC, rcTouchDst ); if( bSmootherAsPossible ) ::SetStretchBltMode( dcTouch.m_hDC, nOldStretchBltMode ); } } else if( eImageMode == eTile ) m_bmp.AlphaBlendSkinParts( dc.GetSafeHdc(), rcClient, CRect(0,0,0,0), CExtBitmap::__EDM_TILE, true, bSmootherAsPossible ); else if( eImageMode == eAlign ) { CSize szSize = m_bmp.GetSize(); CRect rcDst( rcClient.left, rcClient.top, rcClient.left + szSize.cx, rcClient.top + szSize.cy ); bool bCenterHorizontally = false; switch( dwWndType ) { case SS_RIGHT: rcDst.OffsetRect( rcClient.right - rcDst.right, 0 ); break; case SS_CENTER: bCenterHorizontally = true; break; default: /* all the other types assumed as left */ break; } if( bCenterHorizontally ) rcDst.OffsetRect( ( (rcClient.right - rcClient.left) - (rcDst.right - rcDst.left) ) / 2, 0 ); if( bCenterImage ) rcDst.OffsetRect( 0, ( (rcClient.bottom - rcClient.top) - (rcDst.bottom - rcDst.top) ) / 2 ); CRect rcSrc( 0, 0, szSize.cx, szSize.cy ); rcDst.top = max( rcDst.top, rcClient.top ); rcDst.left = max( rcDst.left, rcClient.left ); rcDst.bottom = min( rcDst.bottom, rcClient.bottom ); rcDst.right = min( rcDst.right, rcClient.right ); if( ::RectVisible( dc.GetSafeHdc(), &rcDst ) ) { INT nOldStretchBltMode = bSmootherAsPossible ? ( ::GetStretchBltMode( dc.m_hDC ) ) : ( COLORONCOLOR ); if( bSmootherAsPossible ) ::SetStretchBltMode( dc.m_hDC, ( g_PaintManager.m_bIsWinNT ) ? HALFTONE : COLORONCOLOR ); m_bmp.AlphaBlend( dc.m_hDC, rcDst, rcSrc ); if( bSmootherAsPossible ) ::SetStretchBltMode( dc.m_hDC, nOldStretchBltMode ); } } } else if( dwWndType == SS_ICON ) { HICON hIcon = GetIcon(); if( hIcon != NULL ) { CExtCmdIcon _icon; _icon.AssignFromHICON( hIcon, true ); CSize szIcon = _icon.GetSize(); int nOffsetX = bCenterImage ? (rcClient.Width() - szIcon.cx) / 2 : 0; int nOffsetY = bCenterImage ? (rcClient.Height() - szIcon.cy) / 2 : 0; _icon.Paint( PmBridge_GetPM(), dc.GetSafeHdc(), rcClient.left + nOffsetX, rcClient.top + nOffsetY, -1, -1, IsWindowEnabled() ? CExtCmdIcon::__PAINT_NORMAL : CExtCmdIcon::__PAINT_DISABLED ); } } else { CExtSafeString strText; int nTextLen = GetWindowTextLength(); if( nTextLen > 0 ) { GetWindowText( strText.GetBuffer( nTextLen + 2 ), nTextLen + 1 ); strText.ReleaseBuffer(); } if( strText.GetLength() > 0 ) { DWORD dwDrawTextFlags = 0; switch( dwWndType ) { case SS_RIGHT: dwDrawTextFlags = DT_RIGHT; break; case SS_CENTER: dwDrawTextFlags = DT_CENTER; break; case SS_LEFTNOWORDWRAP: dwDrawTextFlags = DT_LEFT; break; default: /* all the other types assumed as left */ dwDrawTextFlags = DT_LEFT; break; } // switch( dwWndType ) if( strText.Find( _T('\t') ) != -1 ) // do tabs expanding dwDrawTextFlags |= DT_EXPANDTABS; if( (dwWndType == SS_SIMPLE) || (dwWndStyle&(SS_CENTERIMAGE|SS_ENDELLIPSIS|SS_PATHELLIPSIS)) != 0 ) { dwDrawTextFlags |= DT_SINGLELINE; if( (dwWndStyle&SS_CENTERIMAGE) != 0 ) dwDrawTextFlags |= DT_VCENTER; if( (dwWndStyle&SS_ENDELLIPSIS) != 0 ) dwDrawTextFlags |= DT_END_ELLIPSIS; if( (dwWndStyle&SS_PATHELLIPSIS) != 0 ) dwDrawTextFlags |= DT_PATH_ELLIPSIS; } else dwDrawTextFlags |= DT_WORDBREAK; if( dwWndType == SS_LEFTNOWORDWRAP ) dwDrawTextFlags &= ~(DT_WORDBREAK|DT_SINGLELINE); if( (dwWndStyle&SS_NOPREFIX) != 0 ) dwDrawTextFlags |= DT_NOPREFIX; bool bEnabled = IsWindowEnabled() ? true : false; OnDrawLabelText( dc, rcClient, strText, dwDrawTextFlags, bEnabled ); } // if( strText.GetLength() > 0 ) } PmBridge_GetPM()->OnPaintSessionComplete( this ); if( rgnClient.GetSafeHandle() != NULL ) dc.SelectClipRgn( &rgnClient ); }