// TipWnd.cpp: implementation of the CTipWnd class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "TipWnd.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNAMIC(CTipWnd, CWnd) CTipWnd::CTipWnd() { } CTipWnd::~CTipWnd() { } BEGIN_MESSAGE_MAP(CTipWnd, CWnd) //{{AFX_MSG_MAP(CObjectTipWnd) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() void CTipWnd::OnPaint() { if(!m_lstInfo) return; CRect Rect; GetClientRect(Rect); CPaintDC dc(this); // device context for painting CFont *pFont=dc.SelectObject(&m_font); { CBrush hb1; hb1.CreateSolidBrush(::GetSysColor(COLOR_INFOBK)); CBrush *pBrush1=dc.SelectObject(&hb1); dc.Rectangle(0,0,Rect.right,Rect.bottom); dc.SelectObject(pBrush1); } CBrush hb2; hb2.CreateSolidBrush(RGB(0,0,0)); dc.FrameRect(&Rect,&hb2); int nGap=4; CPoint pos(0,0); pos.x = nGap + m_sizeLab.cx + nGap; { CPen pen(PS_DOT, 1, RGB(0,0,0)); CPen *pOldPen=dc.SelectObject(&pen); dc.MoveTo(pos.x, Rect.top); dc.LineTo(pos.x, Rect.bottom); dc.SelectObject(pOldPen); } dc.SetTextColor(::GetSysColor(COLOR_INFOTEXT)); dc.SetBkColor(::GetSysColor(COLOR_INFOBK)); for(int i=0; im_csRecord; CString csVal=pObjUnit->m_csDesName; CRect rectLab(nGap, pos.y, pos.x-nGap, pos.y+max(m_sizeLab.cy, m_sizeVal.cy)); dc.DrawText(csLab, rectLab, DT_RIGHT); CRect rectVal(pos.x+nGap, pos.y, nGap*3+m_sizeLab.cx+m_sizeVal.cx, pos.y+max(m_sizeLab.cy,m_sizeVal.cy)); dc.DrawText(csVal, rectVal, DT_LEFT); pos.y += max(m_sizeLab.cy,m_sizeVal.cy); } //dc.DrawText(m_sText,-1,CRect(2,2,Rect.right-4,Rect.bottom-4),DT_LEFT); // Do not call CWnd::OnPaint() for painting messages } BOOL CTipWnd::Create(DList &lstInfo,int x,int y, CWnd *pParent) { LOGFONT m_lf; ZeroMemory ((PVOID) &m_lf,sizeof (LOGFONT)); NONCLIENTMETRICS nm; //nm.cbSize = sizeof (NONCLIENTMETRICS); 2010-5-6 Éòî£É¾³ý£¬2010ϱÀÀ£ //#if ADS<18 nm.cbSize = sizeof (NONCLIENTMETRICS); //#else //nm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(nm.iPaddedBorderWidth); //#endif VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, nm.cbSize,&nm,0)); m_lf = nm.lfMenuFont; m_font.CreateFontIndirect (&m_lf); // Obtain the width of the text: CWnd *pWnd = AfxGetMainWnd(); // Get main window CDC *pDC = pWnd->GetDC(); // Get device context CFont* pFont=NULL; // Select menu font in... pFont = pDC->SelectObject (&m_font);// Select menu font in... lstInfo.SetDelFlag(FALSE); m_lstInfo.Reset(); m_sizeLab=CSize(0,0); m_sizeVal=CSize(0,0); for(int i=0; im_csDesName == "") pObjUnit->m_csDesName = "ÎÞÐÅÏ¢"; m_lstInfo.Append(pObjUnit); CSize size=pDC->GetTextExtent(CString(pObjUnit->m_csRecord)); m_sizeLab.cx = max(m_sizeLab.cx, size.cx); m_sizeLab.cy = max(m_sizeLab.cy, size.cy); size=pDC->GetTextExtent(CString(pObjUnit->m_csDesName)); m_sizeVal.cx = max(m_sizeVal.cx, size.cx); m_sizeVal.cy = max(m_sizeVal.cy, size.cy); } pDC->SelectObject (pFont); // Select old font in pWnd->ReleaseDC(pDC); // Release the DC if(m_sizeLab.cx>200) m_sizeLab.cx=200; if(m_sizeVal.cx>200) m_sizeVal.cx=200; CSize sizeWnd; int nGap=4; sizeWnd.cx = nGap + m_sizeLab.cx + nGap*2 + m_sizeVal.cx + nGap; sizeWnd.cy = nGap + (max(m_sizeLab.cy, m_sizeVal.cy) + nGap)*lstInfo.Length(); CRect rect; rect.left = x; rect.top = y; rect.right = x + sizeWnd.cx; rect.bottom = y + sizeWnd.cy; CWnd *pFrameWnd=pParent; ASSERT(pFrameWnd); CRect rectClient; pFrameWnd->GetClientRect(&rectClient); if(rect.bottom > rectClient.bottom) { rect.top -= rect.bottom-rectClient.bottom; rect.bottom = rectClient.bottom; } if(rect.right > rectClient.right) { rect.left -= rect.right-rectClient.right; rect.right = rectClient.right; } BOOL bRet= CWnd::Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rect,pFrameWnd,0); SetTimer(1,200,NULL); return bRet; }