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

2016-01-29 12:00 2 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

介绍一个有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)
                        

来源:https://www.tulaoshi.com/n/20160129/1484178.html

延伸阅读
标签: Web开发
基本用法: 代码如下: var ajax = new AjaxObj(url); ajax.addListener(200, function(r){ alert(r); }); ajax.send(); 也可以连续调用: 代码如下: var ajax = new AjaxObj(url).addListener(200, function(r){ alert(r); }).send(); 另外还支持自定义的POST或GET方式请求,以及监视不同的HTTP状态码,自己看代码琢磨...
标签: Web开发
结合一个存储过程,将分页做成最简单,请看以下源码 此分页类所操作的存储过程#region 此分页类所操作的存储过程 /**//*********************************************************  *  * 功能强大,配合以下这个存储过程  *  * *******************************************************...
先看看效果图 第1步: 找一个比较粗壮的字体,我选的是VAL字体,60pt。用文本工具打出想要的字。 第2步: 将这个文字的填充及描边都设为空,就像下面这样,看不见文字了。这样是为了方便之后在外观appearance面板为其添加更为弹性的描边和填充。 第3步: 在外观appearance面板右上角的下拉菜单为其添加一个填充,默认为黑色。 ...
制作一个好的网页,需要花费大量的时间,包含的内容也是非常多的,其中有按钮、横幅、图标及其它素材等。制作的时候先规划好大致的框架,然后由上至下慢慢细化各部分的内容,注意好整体搭配。 最终效果 1、在我们打开PSD网格模板创作前, 我们首先需要先构造一下想象中的结构. 从上面的这张图,你可以看出来:因为在一个排版中又有排版...
介绍一个专门处理C++异常的类 作者:PJ Naughter 下载源代码和例子 简介: CExceptionLogger ,是一个可以免费使用的C++类,用它可以截获未处理异常,如:非法存取、栈溢出、被零除等,并可以将异常详细信息记录到日志文件。这个类源自于MSDN...

经验教程

266

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部