介绍一个有Toolbar功能的可重用类 CPopupText

aa398534147

aa398534147

2016-01-29 12:00

介绍一个有Toolbar功能的可重用类 CPopupText,介绍一个有Toolbar功能的可重用类 CPopupText
介绍一个有Toolbar功能的可重用类 CPopupText 赵湘宁 本文例子代码背景:我用一个CListBox派生类实现宿主(owner-draw)列表框,这个列表框的项目宽度超过了列表框本身的宽度,因此当鼠标指针指向大宽度的列表框项时,我想显示一个类似Toolbar的提示窗口,在窗口中显示完整的列表框项目文本。
起初我想使用CToolTipCtrl::AddTool的第三个参数lpRectTool来实现这个功能,但没有成功。后来,我采用了自立更生的解决方案,创建了一个可重用窗口类:
CPopupText 类定义和实现 ////////////////////////////////////////////////////////////////// PupText.h  // #pragma once// Get NONCLIENTMETRICS info: ctor calls SystemParametersInfo.//class CNonClientMetrics : public NONCLIENTMETRICS {public:   CNonClientMetrics() {      cbSize = sizeof(NONCLIENTMETRICS);      SystemParametersInfo(SPI_GETNONCLIENTMETRICS,0,this,0);   }};// Popup text window, like tooltip.// Can be right or left justified relative to creation point.//class CPopupText : public CWnd {public:   CSize m_szMargins;      // extra space around text: change if you like   enum {JUSTIFYLEFT=0, JUSTIFYRIGHT};   CPopupText();   virtual ~CPopupText();   BOOL Create(CPoint pt, CWnd* pParentWnd, UINT nStyle=0, UINT nID=0);   void ShowDelayed(UINT msec);   void Cancel();protected:   CFont m_font;           // font to use (same as tooltips)   UINT  m_nStyle;         // style (see enum below)   virtual void PostNcDestroy();   virtual BOOL PreCreateWindow(CREATESTRUCT& cs);   afx_msg void OnPaint();   afx_msg void OnTimer(UINT nIDEvent);   afx_msg LRESULT OnSetText(WPARAM wp, LPARAM lp);   DECLARE_DYNAMIC(CPopupText);   DECLARE_MESSAGE_MAP();};PupText.cpp ////////////////////////////////////////////////////////////////// VCKBASE -- September 2000 // Visual C++ 6.0 环境编译, Windows 98 和 NT 环境运行.// #include "stdafx.h"#include "puptext.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifIMPLEMENT_DYNAMIC(CPopupText,CWnd)BEGIN_MESSAGE_MAP(CPopupText,CWnd)   ON_WM_PAINT()   ON_MESSAGE(WM_SETTEXT, OnSetText)   ON_WM_TIMER()END_MESSAGE_MAP()CPopupText::CPopupText(){   m_szMargins = CSize(4,4);   // create font ?use system tooltip font   CNonClientMetrics ncm;   m_font.CreateFontIndirect(&ncm.lfStatusFont);}CPopupText::~CPopupText(){}// Create window. pt is upper-left or upper-right corner depending on // nStyle.//CPopupText::Create(CPoint pt, CWnd* pParentWnd, UINT nStyle, UINT nID){   m_nStyle = nStyle;   return CreateEx(0,      NULL,      NULL,      WS_POPUP|WS_VISIBLE,      CRect(pt,CSize(0,0)),      pParentWnd,      nID);}// Someone changed the text: resize to fit new text//LRESULT CPopupText::OnSetText(WPARAM wp, LPARAM lp){   CClientDC dc = this;   CFont* pOldFont = dc.SelectObject(&m_font);   CRect rc;   GetWindowRect(&rc);   int x = (m_nStyle & JUSTIFYRIGHT) ? rc.right : rc.left;   int y = rc.top;   dc.DrawText(CString((LPCTSTR)lp), &rc, DT_CALCRECT);   rc.InflateRect(m_szMargins);   if (m_nStyle & JUSTIFYRIGHT)      x -= rc.Width();   SetWindowPos(NULL,x,y,rc.Width(),rc.Height(), SWP_NOZORDER|SWP_NOACTIVATE);   return Default();}// Paint the text. Use system colors//void CPopupText::OnPaint(){   CPaintDC dc(this);   CRect rc;   GetClientRect(&rc);   CString s;   GetWindowText(s);   CBrush b(GetSysColor(COLOR_INFOBK)); // use tooltip bg color   dc.FillRect(&rc, &b);   // draw text   dc.SetBkMode(TRANSPARENT);   CFont* pOldFont = dc.SelectObject(&m_font);   dc.SetTextColor(GetSysColor(COLOR_INFOTEXT)); // tooltip text color   dc.DrawText(s, &rc, DT_SINGLELINE|DT_CENTER|DT_VCENTER);   dc.SelectObject(pOldFont);}// Register class if needed//BOOL CPopupText::PreCreateWindow(CREATESTRUCT& cs)      
展开更多 50%)
分享

猜你喜欢

介绍一个有Toolbar功能的可重用类 CPopupText

C语言教程 C语言函数
介绍一个有Toolbar功能的可重用类 CPopupText

有Toolbar功能的可重用类 CPopupText

编程语言 网络编程
有Toolbar功能的可重用类 CPopupText

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

一个可重用的RAS类

编程语言 网络编程
一个可重用的RAS类

完善 CPopupText 类

C语言教程 C语言函数
完善 CPopupText 类

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

一个Ajax类

Web开发
一个Ajax类

Illustrator创建一个可以无限重用的按钮样式

Illustrator CorelDRAW
Illustrator创建一个可以无限重用的按钮样式

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

DIESEL的概念及其函数

DIESEL的概念及其函数

AutoCAD中的坐标系

AutoCAD中的坐标系
下拉加载更多内容 ↓