//----------------------------------------------------------------------------- // File: cdeviceviewtext.cpp // // Desc: CDeviceViewText is a class representing a text string in the view // window. It is used when the view type is a list view. CDeviceViewText // will print the text of the control name, while CDeviceControl will // print the text of the action assigned to that control. // // Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved. //----------------------------------------------------------------------------- #include "common.hpp" #include CDeviceViewText::CDeviceViewText(CDeviceUI &ui, CDeviceView &view) : m_ui(ui), m_view(view), m_hFont(NULL), m_rgbText(RGB(255,255,255)), m_rgbBk(RGB(0,0,0)), m_bWrap(FALSE), m_bClipped(FALSE), m_ptszText(NULL) { m_rect.left = m_rect.top = m_rect.right = m_rect.bottom = 0; } CDeviceViewText::~CDeviceViewText() { if (m_ptszText) free(m_ptszText); m_ptszText = NULL; } void CDeviceViewText::SetLook(HFONT a, COLORREF b, COLORREF c) { m_hFont = a; m_rgbText = b; m_rgbBk = c; Invalidate(); } void CDeviceViewText::SetPosition(int x, int y) { int w = m_rect.right - m_rect.left; int h = m_rect.bottom - m_rect.top; m_rect.left = x; m_rect.right = x + w; m_rect.top = y; m_rect.bottom = y + h; Invalidate(); } void CDeviceViewText::SetRect(const RECT &r) { m_rect = r; CheckClipped(); Invalidate(); } void CDeviceViewText::_SetText(LPCTSTR t) { if (m_ptszText) free(m_ptszText); if (t) m_ptszText = AllocLPTSTR(t); } // Check if the text is clipped when printed and set flag appropriately. void CDeviceViewText::CheckClipped() { RECT rect = m_rect; HDC hDC = CreateCompatibleDC(NULL); if (hDC != NULL) { HGDIOBJ hOld = NULL; if (m_hFont) hOld = SelectObject(hDC, m_hFont); DrawText(hDC, m_ptszText, -1, &rect, DT_CALCRECT | DT_NOPREFIX | DT_LEFT); if (m_hFont) SelectObject(hDC, hOld); DeleteDC(hDC); } if (rect.right > m_rect.right || rect.bottom > m_rect.bottom) m_bClipped = TRUE; else m_bClipped = FALSE; } void CDeviceViewText::SetText(LPCTSTR t) { _SetText(t); CheckClipped(); Invalidate(TRUE); } void CDeviceViewText::SetTextAndResizeTo(LPCTSTR t) { _SetText(t); SIZE s = GetTextSize(m_ptszText, m_hFont); m_rect.right = m_rect.left + s.cx; m_rect.bottom = m_rect.top + s.cy; CheckClipped(); Invalidate(TRUE); } void CDeviceViewText::SetTextAndResizeToWrapped(LPCTSTR t) { _SetText(t); if (!m_ptszText) { m_rect.right = m_rect.left; m_rect.bottom = m_rect.top; Invalidate(TRUE); return; } RECT rect = {m_rect.left, m_rect.top, g_sizeImage.cx, m_rect.top + 1}; HDC hDC = CreateCompatibleDC(NULL); if (hDC != NULL) { HGDIOBJ hOld = NULL; if (m_hFont) hOld = SelectObject(hDC, m_hFont); DrawText(hDC, m_ptszText, -1, &rect, DT_CALCRECT | DT_NOPREFIX | DT_WORDBREAK); if (m_hFont) SelectObject(hDC, hOld); DeleteDC(hDC); } m_rect = rect; m_bWrap = TRUE; CheckClipped(); Invalidate(TRUE); } void CDeviceViewText::SetWrap(BOOL bWrap) { m_bWrap = bWrap; Invalidate(); } void CDeviceViewText::Invalidate(BOOL bForce) { if (m_ptszText || bForce) m_view.Invalidate(); } void CDeviceViewText::OnPaint(HDC hDC) { if (!m_ptszText) return; SetTextColor(hDC, m_rgbText); SetBkColor(hDC, m_rgbBk); SetBkMode(hDC, OPAQUE); RECT rect = m_rect; HGDIOBJ hOld = NULL; if (m_hFont) hOld = SelectObject(hDC, m_hFont); DrawText(hDC, m_ptszText, -1, &rect, DT_NOPREFIX | (m_bWrap ? DT_WORDBREAK : 0) | DT_RIGHT | DT_END_ELLIPSIS); if (m_hFont) SelectObject(hDC, hOld); } // We will have to know the view's scrolling offset to adjust the tooltip's position. void CDeviceViewText::OnMouseOver(POINT point) { // Tooltip only if the callout text is clipped. if (m_bClipped) { TOOLTIPINITPARAM ttip; ttip.hWndParent = GetParent(m_view.m_hWnd); // Parent is the page window. ttip.iSBWidth = 0; ttip.dwID = 0; ttip.hWndNotify = m_view.m_hWnd; ttip.tszCaption = GetText(); CFlexToolTip::UpdateToolTipParam(ttip); } else CFlexWnd::s_ToolTip.SetToolTipParent(NULL); } DEVCTRLHITRESULT CDeviceViewText::HitTest(POINT test) { if (PtInRect(&m_rect, test)) return DCHT_CAPTION; return DCHT_NOHIT; }