void CLCDStreamingText::RecalcTextBoxOrigins() { if (m_Objects.size() <= 1) return; // draw everyone to the left by the offset int nOrgOffset = 0; LCD_OBJECT_LIST::iterator it = m_Objects.begin(); while(it != m_Objects.end()) { CLCDBase* pObject = *it; CLCDText* pText = (CLCDText*)pObject; assert(NULL != pObject); pText->SetLogicalSize(pText->GetHExtent().cx, pText->GetHExtent().cy); // string can be empty which generates zero logical space //assert(pText->GetLogicalSize().cx); //assert(pText->GetLogicalSize().cy); POINT& ptOrigin = pText->GetLogicalOrigin(); if (nOrgOffset == 0) { nOrgOffset = pText->GetLogicalOrigin().x; } pText->SetLogicalOrigin(nOrgOffset, ptOrigin.y); nOrgOffset += pText->GetHExtent().cx; ++it; } }
HRESULT CEzLcdPage::SetText(HANDLE handle, LPCTSTR text, BOOL resetScrollingTextPosition) { CLCDBase* myObject = GetObject(handle); if (NULL != myObject) { if (!((LG_STATIC_TEXT == myObject->GetObjectType() || LG_SCROLLING_TEXT == myObject->GetObjectType() || LG_RIGHTFOCUS_TEXT == myObject->GetObjectType() ))) return E_FAIL; if (LG_STATIC_TEXT == myObject->GetObjectType()) { CLCDText* staticText = static_cast<CLCDText*>(myObject); if (NULL == staticText) return E_FAIL; staticText->SetText(text); return S_OK; } else if (LG_SCROLLING_TEXT == myObject->GetObjectType()) { CLCDStreamingText* streamingText = static_cast<CLCDStreamingText*>(myObject); if (NULL == streamingText) return E_FAIL; streamingText->SetText(text); if (resetScrollingTextPosition) { streamingText->ResetUpdate(); } return S_OK; } else if (LG_RIGHTFOCUS_TEXT == myObject->GetObjectType()) { CLCDText* rightFocusText = static_cast<CLCDText*>(myObject); if (NULL == rightFocusText) return E_FAIL; rightFocusText->SetText(text); rightFocusText->CalculateExtent(true); // if out of focus, set alignment to right in order to follow what is written if (rightFocusText->GetHExtent().cx>=rightFocusText->GetSize().cx) rightFocusText->SetAlignment(DT_RIGHT); else rightFocusText->SetAlignment(DT_LEFT); return S_OK; } } return E_FAIL; }
BOOL CLCDStreamingText::RecalcTextBoxes(CLCDGfx &rGfx) { // check if we need to add another text box LCD_OBJECT_LIST::iterator it = m_Objects.begin(); if (it == m_Objects.end()) return FALSE; CLCDBase* pObject = *it; CLCDText* pText = (CLCDText*)pObject; assert(NULL != pObject); LOGFONT lf; GetObject(m_hFont, sizeof(LOGFONT), &lf); pText->SetFont(lf); // this will re-evaluate the main text object assert(m_Objects.size() == 1); CLCDCollection::OnDraw(rGfx); if (it != m_Objects.end()) { if (pText->GetHExtent().cx > GetWidth()) { pText->SetAlignment(DT_LEFT); // add a gap AddText(m_szGapText); // add another text AddText(m_szText); // add last gap AddText(m_szGapText); } else { pText->SetAlignment(m_nTextAlignment); } } // this will re-evaluate the other text objects CLCDCollection::OnDraw(rGfx); RecalcTextBoxOrigins(); return TRUE; }