mfc添加气球式提示栏

//    TOOLTIPWND.H  添加气球式提示栏

#if !defined(AFX_TOOLTIPWND_H__2C52D3E4_2F5B_11D2_8FC9_000000000000__INCLUDED_)
#define AFX_TOOLTIPWND_H__2C52D3E4_2F5B_11D2_8FC9_000000000000__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

// ToolTipWnd.h : header file
//
// Written by Shankar (sshank@mailcity.com)
// Last Revised : August 29 1998.
// Copyright (c) 1998.
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage whatsoever.
// Distribute freely.
// Send bug reports, bug fixes, enhancements. You can reach
// me at sshank@mailcity.com

// Acknowledgements:
// Thanks to Venkatesh who helped me in calculating the intersecting
// point in the ellipse.

/////////////////////////////////////////////////////////////////////////////
// CToolTipWnd window
struct BTOOLINFO {

    HWND    hwndTool;
    CString strToolText;
    COLORREF clrToolTextClr;

};

class CToolTipWnd : public CWnd
{

private:
// Construction
    LPCTSTR lpWndCls;
public:
    CToolTipWnd();
    HWND pCurrwnd;
    // Attributes
public:
    void RelayEvent(LPMSG);
    BOOL Create(CWnd*);
    bool m_bStuck;

    void AddTool(CWnd *pWnd, CString strText, COLORREF clrTextColor=NULL);
    void SetWidth(int iWidth) { m_iWidth = iWidth; }
    void SetHeight(int iHeight) { m_iHeight = iHeight; }
    void SetBkColor(COLORREF clrRef) { m_clrBkColor = clrRef; }
    void SetFrameColor(COLORREF clrRef) { m_clrFrameColor = clrRef; }
    void SetDefTextColor(COLORREF clrRef) { m_clrTextColor = clrRef; }
    void SetFontHeight(int iHeight) { m_iFontHeight = iHeight; }
    void SetFontName(CString strFontName) { m_strFontName = strFontName; }

private:
    CRgn rgn;
    CRgn rgnComb;
    CRgn rgnTri;
    CRect m_RectText;
    CFont m_fontText;
   
    CString m_strText;
    bool m_bMouseIn;
    COLORREF m_clrTextColor;
    COLORREF m_clrBkColor;
    COLORREF m_clrFrameColor;
    CMapPtrToPtr m_ToolPtr;
    int m_iWidth;
    int m_iHeight;
    int m_iFontHeight;
    CString m_strFontName;

    HWND m_hParentWnd;
public:

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CToolTipWnd)
    protected:
    //}}AFX_VIRTUAL
   

// Implementation
public:
    virtual ~CToolTipWnd();

    // Generated message map functions
protected:
    //{{AFX_MSG(CToolTipWnd)
    afx_msg void OnPaint();
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before

the previous line.

#endif // !defined(AFX_TOOLTIPWND_H__2C52D3E4_2F5B_11D2_8FC9_000000000000__INCLUDED_)

//    TOOLTIPWND.CPP

// ToolTipWnd.cpp : implementation file
//

#include "stdafx.h"
#include "ToolTipWnd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CToolTipWnd

CToolTipWnd::CToolTipWnd()
{

    lpWndCls    = AfxRegisterWndClass(0);
   
    //Defaults
    m_bMouseIn    = false;
    m_bStuck    = false;
   
    m_iWidth = 100;
    m_iHeight = 60;

    m_clrBkColor = RGB(249,254,188); //light yellow
    m_clrFrameColor = RGB(0,0,255);  //blue
    m_clrTextColor = RGB(0,0,0);     //black

    m_iFontHeight = 14;
    m_strFontName = "Arial";

    pCurrwnd = NULL;
}

CToolTipWnd::~CToolTipWnd()
{

    BTOOLINFO *stToolInfo;
    CWnd *pWnd;
    for(POSITION pos = m_ToolPtr.GetStartPosition(); pos != NULL;)
    {
        m_ToolPtr.GetNextAssoc(pos, (void *&)pWnd, (void*&) stToolInfo);
        delete stToolInfo;
    }
    m_ToolPtr.RemoveAll();

}

BEGIN_MESSAGE_MAP(CToolTipWnd, CWnd)
    //{{AFX_MSG_MAP(CToolTipWnd)
    ON_WM_PAINT()
    ON_WM_CREATE()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CToolTipWnd message handlers
BOOL CToolTipWnd::Create(CWnd* pParentWnd)
{

    BOOL bRet = CWnd::CreateEx(NULL, lpWndCls, NULL,
        WS_POPUP, 0, 0, m_iWidth, m_iHeight,
        pParentWnd->GetSafeHwnd(), NULL, NULL);

    m_hParentWnd = pParentWnd->GetSafeHwnd();
   
    if(bRet)
        SetOwner(pParentWnd);

    return bRet;

}

void CToolTipWnd::OnPaint()
{
    CPaintDC dc(this); // device context for painting
   
    CRect rectCl;
    GetClientRect(&rectCl);

    CRgn rgnComb;   
    rgnComb.CreateRectRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);

    int iRetComb = rgnComb.CombineRgn(&rgnTri, &rgn, RGN_OR);
    if(iRetComb==ERROR)
    {
        AfxMessageBox("ERROR in Combining Region");
        return;
    }

    CBrush pBrush;
    pBrush.CreateSolidBrush(m_clrFrameColor);
   
    CBrush pBrush1;
    pBrush1.CreateSolidBrush(m_clrBkColor);
   
    dc.FillRgn( &rgnComb, &pBrush1);
    dc.FrameRgn(&rgnComb, &pBrush, 2, 1);

    dc.SetBkMode(TRANSPARENT);
    dc.SetTextColor(m_clrTextColor);
   
    CFont *pFont = dc.SelectObject(&m_fontText);
    //dc.Rectangle(&m_RectText);

    CSize czTextWidth = dc.GetTextExtent(m_strText);
   
    if( czTextWidth.cx < m_RectText.Width())
        dc.DrawText(m_strText, m_RectText, DT_CENTER | DT_VCENTER |

DT_SINGLELINE);
    else
        dc.DrawText(m_strText, m_RectText, DT_CENTER | DT_WORDBREAK);
   
   

    dc.SelectObject(pFont);
   
}

int CToolTipWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
   
    CRect rectCl;
    GetClientRect(&rectCl);

    int x=0, y=0;
    CRect rectTemp;

    rectTemp = rectCl;
    rectTemp.left = rectTemp.left + 10;
   
    x = (int)( (float)((float)rectTemp.Width() / 2.0) / 1.41421);
    y = (int)( (float)((float)rectTemp.Height() / 2.0) / 1.41421);

    m_RectText.top = ( (rectTemp.Height() / 2) - y);
    m_RectText.left = ( (rectTemp.Width() / 2) - x) + 10;
    m_RectText.right = ( (rectTemp.Width() / 2) + x) + 10;
    m_RectText.bottom = ( (rectTemp.Height() / 2) + y);

    rgn.m_hObject = NULL;
    rgnTri.m_hObject = NULL;
    rgnComb.m_hObject = NULL;

    BOOL bRegRet = rgn.CreateEllipticRgn

(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
       
    CPoint ptTri[3];
    ptTri[0].x = rectCl.left;
    ptTri[0].y = (rectCl.bottom / 2) - 10;

    ptTri[1].x = rectCl.left + 15;
    ptTri[1].y = (rectCl.bottom / 2) - 5;

    ptTri[2].x = rectCl.left + 15;
    ptTri[2].y = (rectCl.bottom / 2) + 5;
   
    ptTri[3].x = rectCl.left;
    ptTri[3].y = (rectCl.bottom / 2) - 10;

    BOOL bRegTriRet = rgnTri.CreatePolygonRgn(ptTri, 3, ALTERNATE);

    rgnComb.CreateRectRgn(rectCl.left+10,rectCl.top,rectCl.right,rectCl.bottom);
    int iRetComb = rgnComb.CombineRgn(&rgnTri, &rgn, RGN_OR);

    if(iRetComb == ERROR)
    {
        AfxMessageBox("ERROR in Combining Region");
        return -1;
    }

    int bRgnWnd = SetWindowRgn(rgnComb.operator HRGN( ), TRUE);   

    m_fontText.CreateFont(m_iFontHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0,m_strFontName);   
   
    return 0;
}

void CToolTipWnd::RelayEvent(LPMSG lpMsg)
{

    switch(lpMsg->message)
    {
    case WM_KEYDOWN:
            if(IsWindowVisible())
            {       
                ShowWindow(SW_HIDE);
            }
            break;

    case WM_LBUTTONDOWN:
    case WM_RBUTTONDOWN:
            if(IsWindowVisible())
            {
                ShowWindow(SW_HIDE);
            }
            break;

    case WM_MOUSEMOVE:
        {
            CWnd *pFocusWnd = AfxGetApp()->m_pMainWnd->GetFocus();
            if(pFocusWnd==NULL)
                break;
            CWnd* pWnd = CWnd::FromHandle(lpMsg->hwnd);

            HWND hWndTemp = ::GetParent(lpMsg->hwnd);
           
            CPoint pt;
            pt.x = lpMsg->pt.x;
            pt.y = lpMsg->pt.y;
           
            BTOOLINFO *stToolInfo;
            CWnd *pBToolWnd;
           
            for(POSITION pos = m_ToolPtr.GetStartPosition(); pos != NULL;)
            {
                m_ToolPtr.GetNextAssoc(pos, (void *&)pBToolWnd,

(void*&) stToolInfo);
               
                if(!m_bMouseIn)
                {
                    if(lpMsg->hwnd == stToolInfo->hwndTool)
                    {
                   
                        if(m_bStuck && IsWindowVisible())
                        {
                            SetWindowPos

(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
                            ShowWindow(SW_SHOWNOACTIVATE);
                        }

                        m_bMouseIn = true;
                        m_clrTextColor = stToolInfo-

>clrToolTextClr;
                        m_strText = stToolInfo->strToolText;
                       
                        SetWindowPos

(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
                        ShowWindow(SW_SHOWNOACTIVATE);
                       
                        pCurrwnd = stToolInfo->hwndTool;

                        break;
                    }
                }
                else
                {
                    CRect rect;
                    ::GetWindowRect(pCurrwnd, &rect);
                    if(m_bStuck && IsWindowVisible())
                    {
                        SetWindowPos

(&wndTop,pt.x,pt.y,m_iWidth,m_iHeight,SWP_NOACTIVATE);
                        ShowWindow(SW_SHOWNOACTIVATE);
                    }
                   
                   
                    CWnd* pWnd = CWnd::FromHandle(lpMsg->hwnd);
                    CWnd *WndPt = pWnd->WindowFromPoint(lpMsg-

>pt);
                    if(WndPt->GetSafeHwnd() != pCurrwnd)
                    {
                        m_bMouseIn = false;
                        ShowWindow(SW_HIDE);
                    }
                   

                    break;
                }
            }
           
        }   
        break; //WM_MOUSEMOVE
    }
    
}

void CToolTipWnd::AddTool(CWnd *pWnd, CString strText, COLORREF clrTextColor)
{

    BTOOLINFO *stToolInfo;

    if(!m_ToolPtr.Lookup( pWnd, ( void*& )  stToolInfo))
    {
        stToolInfo = new BTOOLINFO;
        stToolInfo->hwndTool = pWnd->GetSafeHwnd();
        stToolInfo->strToolText = strText;
        if(clrTextColor==NULL)
            stToolInfo->clrToolTextClr = m_clrTextColor;
        else
            stToolInfo->clrToolTextClr = clrTextColor;
   
        m_ToolPtr.SetAt(pWnd, stToolInfo);
    }

}

//使用方法
、Dlg类中添加变量
public:
CToolTipWnd m_BalloonToolTip;
//Dlg::OnInitDialg()添加初始化代码
、添加气球式提示栏
m_BalloonToolTip.Create(this);
m_BalloonToolTip.AddTool(GetDlgItem(IDC_ENABLE_BTN),"禁止/允许面板走纸按键", RGB

(255,0,0));

3、 Dlg::PreTranslateMessage(MSG* pMsg) 添加代码
 if(m_BalloonToolTip)
    m_BalloonToolTip.RelayEvent(pMsg);
  return CDialog::PreTranslateMessage(pMsg);

二 添加按钮 IDC_ENABLE_BTN
1,rc文件中BEGIN END之间添加
PUSHBUTTON      "禁止按键",IDC_ENABLE_BTN,119,83,46,16,BS_FLAT
2,Dlg::DoDataExchange(CDataExchange* pDX)添加
DDX_Control(pDX, IDC_ENABLE_BTN, m_btnEnable);
3,BEGIN_MESSAGE_MAP(*Dlg, CDialog)中添加点击消息
    ON_BN_CLICKED(IDC_ENABLE_BTN, OnEnableBtn)
   Dlg::OnEnableBtn() {}

4,设置按钮内容
SetDlgItemText(IDC_ENABLE_BTN,"允许按键");
Resource.h添加
#define IDC_ENABLE_BTN                  1007

三 CListBox添加
Dlg类的AFX_DATA中添加
CListBox    m_ctlList;
Dlg::DoDataExchange(CDataExchange* pDX)的//{{AFX_DATA_MAP()中添加
    DDX_Control(pDX, IDC_LIST_ANY, m_ctlList);
使用
 m_ctlList.InsertString(-1,"连接打印机失败...");
rc文件添加listbox
  LISTBOX         IDC_LIST_ANY,13,54,91,152,LBS_SORT |
                    LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
Resource.h文件中添加
    #define IDC_LIST_ANY                    1004
四,显示和隐藏右边界面
添加按钮
 #define IDC_SETDIP_BTN                  1010
 PUSHBUTTON      "设置DIP",IDC_SETDIP_BTN,188,141,46,16,BS_FLAT
dlg类中定义并AFX_DATA_MAP中 绑定变量
    CButton    m_btnSetdip;
DDX_Control(pDX, IDC_SETDIP_BTN, m_btnSetdip);
BEGIN_MESSAGE_MAP 添加点击消息
ON_BN_CLICKED(IDC_SETDIP_BTN, OnSetdipBtn)
添加消息OnSetdipBtn
    static BOOL bExpand = TRUE;
    ExpandDialog(IDC_DIVIDER, bExpand);
    bExpand = !bExpand;   
Dlg::ExpandDialog(int nResourceID, BOOL bExpand)
{
    static CRect rcLarge;
    static CRect rcSmall;
    CString sExpand;

    if(rcLarge.IsRectNull())
    {
       CRect rcLandmark;
       CWnd* pWndLandmark = GetDlgItem(nResourceID);
       ASSERT(pWndLandmark);
       GetWindowRect(rcLarge);
       pWndLandmark->GetWindowRect(rcLandmark);
       rcSmall = rcLarge;
       rcSmall.right = rcLandmark.left;
    }
    if(bExpand)
    {
         SetWindowPos(NULL, 0, 0, rcLarge.Width(), rcLarge.Height(),
         SWP_NOMOVE | SWP_NOZORDER);
         sExpand = "设置DIP<<";
    }
    else
    {
        SetWindowPos(NULL, 0, 0, rcSmall.Width(), rcSmall.Height(),
        SWP_NOMOVE | SWP_NOZORDER);
        sExpand = "设置DIP>>";
    }
    SetDlgItemText(IDC_SETDIP_BTN, sExpand);
}
rc中picture Properties IDC_DIVIDER 添加
  CONTROL         "",IDC_DIVIDER,"Static",SS_BLACKFRAME,257,7,170,205
#define IDC_DIVIDER                     1034
使用 ExpandDialog(IDC_DIVIDER, bExpand);

五 添加COMBOBOX
1, rc文件中添加 COMBOBOX        IDC_COMBO_PORT,44,17,44,58,CBS_DROPDOWNLIST |
                    CBS_UPPERCASE | WS_VSCROLL | WS_TABSTOP,
                    WS_EX_DLGMODALFRAME
    #define IDC_COMBO_PORT                  1000
添加 列表
//
// Dialog Info
//

IDD_POS2000DEMO_DIALOG DLGINIT
BEGIN
    IDC_COMBO_PORT, 0x403, 5, 0
0x4f43, 0x314d, "\000"
    IDC_COMBO_PORT, 0x403, 5, 0
0x4f43, 0x324d, "\000"
    IDC_COMBO_PORT, 0x403, 5, 0
0x4f43, 0x334d, "\000"
    IDC_COMBO_PORT, 0x403, 5, 0
0x544c, 0x3150, "\000"
    IDC_COMBO_PORT, 0x403, 5, 0
0x544c, 0x3250, "\000"
    IDC_COMBO_BAUD, 0x403, 5, 0
0x3639, 0x3030, "\000"
    IDC_COMBO_BAUD, 0x403, 6, 0
0x3931, 0x3032, 0x0030,
    IDC_COMBO_BAUD, 0x403, 6, 0
0x3833, 0x3034, 0x0030,
END
Dlg::DoDataExchange(CDataExchange* pDX) 绑定变量
DDX_CBIndex(pDX, IDC_COMBO_PORT, m_Port);
消息函数BEGIN_MESSAGE_MAP(
ON_CBN_SELCHANGE(IDC_COMBO_PORT, OnSelchangeComboPort)

5使其无效GetDlgItem(IDC_COMBO_BAUD)->EnableWindow(false);

时间: 2024-10-31 13:13:42

mfc添加气球式提示栏的相关文章

在Mac OS中为命令行界面和VIM添加状态提示栏的教程

  什么是powerline 如果你不是通过搜索引擎搜到这篇文章的话,也许你还没有听说过powerline.而你又恰巧是个*UNIX党,或者VIM党的话,那么强烈建议你了解并使用powerline.powerline是一个stateless status line,即一个全局状态/提示栏.如果你成功为你的bash,Terminal,iTerm2,VIM配置上powerline的话,那么效果将会是这样的: Bash的提示符将会是这样的: VIM的状态栏将会是这样的: VIM的整体效果图: 相信看了

iOS实现顶部标签式导航栏及下拉分类菜单_IOS

本文实例为大家分享了iOS实现顶部标签式导航栏及下拉分类菜单的全部过程,供大家参考,具体内容如下 当内容及分类较多时,往往采用顶部标签式导航栏,例如网易新闻客户端的顶部分类导航,最近刚好有这样的应用场景,参考网络上一些demo,实现了这种导航效果,记录一些要点. 效果图(由于视频转GIF掉帧,滑动和下拉动画显得比较生硬,刚发现quickTime可以直接录制手机视频,推荐一下,很方便) 1.顶部标签式导航栏 (1)实现思路 其实就是在上下两个UIScrollView上做文章,实现联动选择切换的效果

Bootstrap实现响应式导航栏效果_javascript技巧

为了给导航栏添加响应式特性,您要折叠的内容必须包裹在带有 classes .collapse..navbar-collapse 的 <div> 中.折叠起来的导航栏实际上是一个带有class .navbar-toggle 及两个 data- 元素的按钮.第一个是 data-toggle,用于告诉 JavaScript 需要对按钮做什么,第二个是 data-target,指示要切换到哪一个元素.三个带有 class .icon-bar 的 <span> 创建所谓的汉堡按钮.这些会切换

mfc-VC++6.0在MFC添加ACCESS 数据源出错

问题描述 VC++6.0在MFC添加ACCESS 数据源出错 我在看MFC的视频的教程,按照视频里的方法,在VC里添加数据源,然后编译执行,编译没有出错,但是执行后就出现如下图片所示 求各位大神看看是哪里出了问题,是我的编译器吗?还是其他 解决方案 sql语句是否正确,可能执行出错了

c++-MFC添加RadioButton后方向键的其他响应出现问题

问题描述 MFC添加RadioButton后方向键的其他响应出现问题 我想用MFC实现一个基于对话框的贪吃蛇游戏,起初运行正常,但是我发现在用方向键控制蛇的移动的时候,界面右侧我预先做的几个radioButton按钮上总会有虚线框来回跳动(和我方向键的应用构成了响应),这样很影响之后的操作,于是我在贪吃蛇游戏的onTime函数里面写了enableWindow(FALSE)想在游戏运行过程中禁用那些暂时不需要的radioButton,但是全禁用后,发现方向键失灵了,蛇也无法由玩家操纵移动了.求教各

扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip

infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的炫目的Windows.Web.WPF和Silverlight控件,相信很多人在使用它们.我们现在的项目就在使用Infragistics的Windows Form控件集.虽然这些控件功能强大,也不可能满足你所有的需求,尤其是那些比较苛刻的最终用户的需求.比如,我们最近就接收到这样一个变态的需求:让所以菜单项.工具栏按钮.网格单元的ToolTip以气球式的样式显示.最终,我不得不通过对现有控件的扩展实

《百度谷歌那种提示栏》就是输入一个‘字’,弹出相关这个‘字’的提示

问题描述 各位大侠...我想做个像谷歌,百度那种能输入一个字后能提示的网页...如果用AJAX做,那我能把提示的数据直接放在XML里吗??如果可以,怎么用啊???求百度,谷歌提示栏AJAX做法的程序...在此拜谢了~~~~ 解决方案 解决方案二:我记得以前看过这种实现给文本框的textChange事件设置一个方法每次用户输入就会启动一个0.5秒的倒计时,如果倒计时到就去请求数据这样用户连续输入的时候不会请求数据,只有用户停止输入才会请求数据.请求数据一般用的是JSON格式,你可以去百度一下JSO

c++-关于MFC添加了变量后报错

问题描述 关于MFC添加了变量后报错 做了三个简单界面,登录/菜单/注册 首先我先直接做了这三个窗体并未菜单和注册分别定义了类,通过菜单的登录和注册按钮通过类调用跳转至相应的窗体调试后并未出现任何问题. 但是在给注册窗体的edit control定义了变量后调试,正常进入登录界面,在输入相应的账号和密码后同样可以跳转至相应的菜单窗口.问题就出在注册窗口,点击后直接弹出一个错误窗口(截图如下)有人能告诉我该怎么解决这个问题吗?菜鸟一枚望知道的指导一下!! 解决方案 你希望有人能告诉你怎么解决问题,

arc engine- arcgis engine10怎样授权啊,VS2010添加组件就提示错误

问题描述 arcgis engine10怎样授权啊,VS2010添加组件就提示错误 desktop10已经可以使用(但arcgis administer里可用性为0,license administer一直都打不开,重装很多回了都是打开时出错),runtime已经装过了,那个ecp授权具体怎样弄的啊,在线求解答.