// This function is called every time the button background needs to be painted. // If the button is in transparent mode this function will NOT be called. // // Parameters: // [IN] pDC // Pointer to a CDC object that indicates the device context. // [IN] pRect // Pointer to a CRect object that indicates the bounds of the // area to be painted. // // Return value: // BTNST_OK // Function executed successfully. // DWORD CButtonST::OnDrawBackground(CDC* pDC, LPCRECT pRect) { COLORREF crColor; if (m_bMouseOnButton || m_bIsPressed) { crColor = m_crColors[BTNST_COLOR_BK_IN]; } else { crColor = m_crColors[BTNST_COLOR_BK_OUT]; } CBrush brBackground(crColor); pDC->FillRect(pRect, &brBackground); return BTNST_OK; } // End of OnDrawBackground
/////////////////////////////////////////////////////////////////////////////// // Draw void CXButton::Draw(CDC *pDC, CRect& rect) { //XLISTCTRL_TRACE(_T("in CXButton::Draw: <%s>\n"), m_strText); //TRACERECT(rect); if (m_hTheme == NULL) { // open theme for Button if (ThemeHelper.IsThemeLibAvailable()) { //XLISTCTRL_TRACE(_T("opening theme data ~~~~~\n")); m_hTheme = ThemeHelper.OpenThemeData(m_pParent->m_hWnd, _T("Button")); } } CFont *pFont = m_pParent->GetFont(); CFont *pOldFont = NULL; if (pFont) pOldFont = pDC->SelectObject(pFont); CRect rectButton(rect); m_rect.CopyRect(rectButton); //dc.SetBkMode(TRANSPARENT); pDC->SetBkMode(OPAQUE); DWORD part = BP_PUSHBUTTON; BOOL bIsThemed = IsThemed(m_hTheme); if (bIsThemed) { DWORD state = m_bPressed ? PBS_PRESSED : PBS_NORMAL; if (state == PBS_NORMAL) { if (!m_bEnabled) state = PBS_DISABLED; if (m_bMouseOver) state = PBS_HOT; } ThemeHelper.DrawThemeBackground(m_hTheme, pDC->m_hDC, part, state, &rectButton, NULL); } else { CBrush brBackground(GetSysColor(COLOR_BTNFACE)); pDC->FillRect(&rectButton, &brBackground); // draw pressed button if (m_bPressed) { CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW)); pDC->FrameRect(&rectButton, &brBtnShadow); } else // ...else draw non pressed button { UINT uState = DFCS_BUTTONPUSH | (m_bMouseOver ? DFCS_HOT : 0) | ((m_bPressed) ? DFCS_PUSHED : 0); pDC->DrawFrameControl(&rectButton, DFC_BUTTON, uState); } } BOOL bHasText = !m_strText.IsEmpty(); UINT uTextAlignment = DT_CENTER | DT_SINGLELINE | DT_VCENTER | DT_WORDBREAK; // write the button title (if any) if (bHasText) { // draw the button's title - // if button is pressed then "press" title also if (m_bPressed && !bIsThemed) rectButton.OffsetRect(1, 1); if (bIsThemed) { ThemeHelper.DrawThemeText(m_hTheme, pDC->m_hDC, part, m_bEnabled ? PBS_NORMAL : PBS_DISABLED, m_strText, uTextAlignment, 0, &rectButton); } else { pDC->SetBkMode(TRANSPARENT); if (!m_bEnabled) { rectButton.OffsetRect(1, 1); pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT)); pDC->DrawText(m_strText, -1, &rectButton, uTextAlignment); rectButton.OffsetRect(-1, -1); pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW)); pDC->DrawText(m_strText, -1, &rectButton, uTextAlignment); } else { pDC->SetTextColor(::GetSysColor(COLOR_BTNTEXT)); pDC->SetBkColor(::GetSysColor(COLOR_BTNFACE)); pDC->DrawText(m_strText, -1, &rectButton, uTextAlignment); } } } if (pOldFont) pDC->SelectObject(pOldFont); }
void CLREnvelopeEditorCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { //build memory device context to draw to CDC DrawDC; CDC* pDrawDC=&DrawDC; CBitmap MemoryBitmap; CBitmap* pMemoryBitmap=&MemoryBitmap; CBitmap* pOldBitmap; pDrawDC->CreateCompatibleDC(pdc); pMemoryBitmap->CreateCompatibleBitmap(pdc,rcBounds.right,rcBounds.bottom); pOldBitmap=pDrawDC->SelectObject(pMemoryBitmap); //refresh m_RCCtrlArea with valid one m_RCCtrlArea=rcBounds; m_RCCtrlArea.bottom-=CONTROL_BAR_HEIGHT; //clear background CBrush brBackground(TranslateColor(AmbientBackColor())); pDrawDC->FillRect(m_RCCtrlArea, &brBackground); //draw selected area if present if(m_bHasSelection) { CBrush brSelection; COLORREF selection_color=TranslateColor(AmbientBackColor()); BYTE r_color,g_color,b_color; r_color=GetRValue(selection_color); g_color=GetGValue(selection_color); b_color=GetBValue(selection_color); int sum3=((int)r_color+(int)g_color+(int)b_color)/3; if(sum3>30) { if(r_color>30) r_color-=30; else r_color=0; if(g_color>30) g_color-=30; else g_color=0; if(b_color>30) b_color-=30; else b_color=0; } else { if(r_color<225) r_color+=30; else r_color=255; if(g_color<225) g_color+=30; else g_color=255; if(b_color<225) b_color+=30; else b_color=255; } selection_color=RGB(r_color,g_color,b_color); brSelection.CreateSolidBrush(selection_color); CRect selection_rect; selection_rect.top=0; selection_rect.bottom=m_RCCtrlArea.bottom; selection_rect.left=translateEnvelopeXToScreenX(m_lFirstSelectedPosition); selection_rect.right=translateEnvelopeXToScreenX(m_lLastSelectedPosition); pDrawDC->FillRect(&selection_rect,&brSelection); } //draw X and Y axes CPen axis_pen; axis_pen.CreatePen(PS_SOLID,2,RGB(0,0,0)); CPen* old_pen; old_pen=pDrawDC->SelectObject(&axis_pen); //X pDrawDC->MoveTo(0,translateEnvelopeYToScreenY(0.0f)); pDrawDC->LineTo(m_RCCtrlArea.right,translateEnvelopeYToScreenY(0.0f)); //Y pDrawDC->MoveTo(translateEnvelopeXToScreenX(0),0); pDrawDC->LineTo(translateEnvelopeXToScreenX(0),m_RCCtrlArea.bottom); //draw grid CPen grid_pen; grid_pen.CreatePen(PS_SOLID,1,RGB(0,0,0)); pDrawDC->SelectObject(&grid_pen); //draw control border pDrawDC->MoveTo(0,0); pDrawDC->LineTo(m_RCCtrlArea.right-1,0); pDrawDC->LineTo(m_RCCtrlArea.right-1,m_RCCtrlArea.bottom-1); pDrawDC->LineTo(0,m_RCCtrlArea.bottom-1); pDrawDC->LineTo(0,0); //here grid drawing starts long x_step=calcEnvelopeXStep(); float y_step=calcEnvelopeYStep(); long x_pos; float y_pos; //y x_pos=(m_lFirstKeyPosition/x_step+1)*x_step; while(x_pos<m_lLastKeyPosition) { pDrawDC->MoveTo(translateEnvelopeXToScreenX(x_pos),0); pDrawDC->LineTo(translateEnvelopeXToScreenX(x_pos),m_RCCtrlArea.bottom); x_pos+=x_step; } //x y_pos=((float)floor(m_fLowValue/y_step)+1.0f)*y_step; while(y_pos<m_fHighValue) { pDrawDC->MoveTo(0,translateEnvelopeYToScreenY(y_pos)); pDrawDC->LineTo(m_RCCtrlArea.right,translateEnvelopeYToScreenY(y_pos)); y_pos+=y_step; } //draw curve CPen cpEnvelope; cpEnvelope.CreatePen(PS_SOLID,2,m_CurveColor); pDrawDC->SelectObject(&cpEnvelope); x_pos=0; //beware that now it is screen, not envelope coordinate float fEvalRes=m_pEnvelope->evalEnvelope(translateScreenXToSeconds(x_pos)); pDrawDC->MoveTo(x_pos,translateEnvelopeYToScreenY(fEvalRes)); while(x_pos<m_RCCtrlArea.right) { fEvalRes=m_pEnvelope->evalEnvelope(translateScreenXToSeconds(x_pos)); pDrawDC->LineTo(x_pos,translateEnvelopeYToScreenY(fEvalRes)); x_pos++; } //draw keys if(!(m_bDirtyPositions || m_bDirtyValues)) { long i; long lNumKeys=m_pEnvelope->getNumKeys(); for(i=0;i<lNumKeys;i++) { drawKey(i,pDrawDC); } } //draw bottom bar CBrush white_brush; white_brush.CreateSolidBrush(RGB(255,255,255)); CRect rcBottom=rcBounds; rcBottom.top=rcBounds.bottom-CONTROL_BAR_HEIGHT; pDrawDC->FillRect(rcBottom,&white_brush); pDrawDC->SelectObject(&grid_pen); //draw bottom bar border pDrawDC->MoveTo(0,rcBottom.top); pDrawDC->LineTo(rcBottom.right-1,rcBottom.top); pDrawDC->LineTo(rcBottom.right-1,rcBottom.bottom-1); pDrawDC->LineTo(0,rcBottom.bottom-1); pDrawDC->LineTo(0,rcBottom.top); //draw vertical lines and frame numbers every 10 x_steps in bottom bar CFont cfFrameFont; CString csFrameString; cfFrameFont.CreateFont(8,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEVICE_PRECIS, CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH,NULL); pDrawDC->SelectObject(&cfFrameFont); pDrawDC->SetBkMode(TRANSPARENT); x_pos=m_lFirstKeyPosition-m_lFirstKeyPosition%(10*x_step)-10*x_step; while(x_pos<m_lLastKeyPosition) { if((x_pos%(10*x_step))==0) { pDrawDC->MoveTo(translateEnvelopeXToScreenX(x_pos),rcBottom.top); pDrawDC->LineTo(translateEnvelopeXToScreenX(x_pos),rcBottom.bottom); csFrameString.Format("%d",x_pos); pDrawDC->TextOut(translateEnvelopeXToScreenX(x_pos), rcBottom.top,csFrameString); } x_pos+=x_step; } pDrawDC->SelectObject(old_pen); pdc->BitBlt(0,0,rcBounds.right,rcBounds.bottom,pDrawDC,0,0,SRCCOPY); pDrawDC->SelectObject(pOldBitmap); pDrawDC->DeleteDC(); }
void CVisualSynanView::OnPaint() { CString S = GetDocument()->m_VisualSentences.m_WorkTimeStr; ((CFrameWnd*)((CVisualSynanApp*)AfxGetApp())->m_pMainWnd)->SetMessageText(S); ASSERT( GetDocument() ); CClientDC clDC(this); CView::OnPaint(); CRect clientRect; CDC memDC; CBitmap bmBmp; CRect rectDevice; //creating memory DC GetClientRect(&clientRect); rectDevice = clientRect; OnPrepareDC(&clDC); clDC.DPtoLP(&clientRect); bmBmp.CreateCompatibleBitmap(&clDC, rectDevice.right , rectDevice.bottom); memDC.CreateCompatibleDC(&clDC); CBitmap* pOldBitmap = memDC.SelectObject(&bmBmp); CBrush brBackground(::GetSysColor(COLOR_WINDOW)); memDC.FillRect(&rectDevice, &brBackground); memDC.SetBkColor(::GetSysColor(COLOR_WINDOW)); //selecting choosen font CFont* pOldFont; if( m_bExistUsefulFont) { pOldFont = memDC.SelectObject(&m_FontForWords); } if( m_bFirsTime && !GetDocument()->NoSentences() ) { m_bFirsTime = FALSE; GetDocument()->CalculateCoordinates(&memDC,clientRect.right, m_bShowGroups); } int iOffset = clientRect.top - rectDevice.top; //drawing sentences in memory DC GetDocument()->PrintSentences(&memDC,clientRect, iOffset); //drawing it on the screen clDC.BitBlt(0,clientRect.top, rectDevice.right,rectDevice.bottom,&memDC,0,0,SRCCOPY); //restoring old bitmap and old font memDC.SelectObject(pOldBitmap); if( m_bExistUsefulFont) memDC.SelectObject(pOldFont); memDC.DeleteDC(); ResizeScroll(); }