从CEdit派生一个新类,模拟XP下CueBannerl功能

#pragma once


// CCueBannerEditCtrl

class CCueBannerEditCtrl : public CEdit
{
  DECLARE_DYNAMIC(CCueBannerEditCtrl)

public:
  CCueBannerEditCtrl();
  virtual ~CCueBannerEditCtrl();

protected:
  BOOL bShowCueBanner;
  BOOL bDrawIfFocused;
  CString CueBannerString;
  void UpdateCueBanner(BOOL bHide=FALSE);
  
public:
  BOOL SetCueBanner(LPCWSTR lpszText, BOOL fDrawIfFocused = FALSE);
  BOOL SetCueBanner(UINT nIDSText, BOOL fDrawIfFocused = FALSE);

protected:
  DECLARE_MESSAGE_MAP()
  afx_msg void OnEnSetfocus();
  afx_msg void OnEnKillfocus();
  afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
  afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  afx_msg void OnPaint();
  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  virtual BOOL PreTranslateMessage(MSG* pMsg);

protected:
  BOOL bEnableKbInput;

public:
  BOOL EnableKbInput(BOOL bEn);
};



 

// CueBannerEditCtrl.cpp : 实现文件
//

#include "stdafx.h"
#include "CueBannerEditCtrl.h"

// CCueBannerEditCtrl

IMPLEMENT_DYNAMIC(CCueBannerEditCtrl, CEdit)

CCueBannerEditCtrl::CCueBannerEditCtrl()
{
  CueBannerString = _T("");
  bDrawIfFocused = FALSE;
  bShowCueBanner = FALSE;
  bEnableKbInput = FALSE;
}

CCueBannerEditCtrl::~CCueBannerEditCtrl()
{
}


BEGIN_MESSAGE_MAP(CCueBannerEditCtrl, CEdit)
  ON_CONTROL_REFLECT(EN_SETFOCUS, OnEnSetfocus)
  ON_CONTROL_REFLECT(EN_KILLFOCUS, OnEnKillfocus)
  ON_WM_CHAR()
  ON_WM_PAINT()
  ON_WM_ERASEBKGND()
  ON_WM_LBUTTONDOWN()
  ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

// CCueBannerEditCtrl 消息处理程序
BOOL CCueBannerEditCtrl::SetCueBanner(LPCWSTR lpszText, BOOL fDrawIfFocused)
{
  CueBannerString = lpszText;
  bDrawIfFocused = fDrawIfFocused; 

  UpdateCueBanner();
  return TRUE;
}

BOOL CCueBannerEditCtrl::SetCueBanner(UINT nIDSText, BOOL fDrawIfFocused)
{
  CStringW strValue;
  if(nIDSText)
    VERIFY(strValue.LoadString(nIDSText));
  
  return SetCueBanner(strValue, fDrawIfFocused);
}

void CCueBannerEditCtrl::OnEnSetfocus()
{
  // TODO: 在此添加控件通知处理程序代码
  if(!CueBannerString.IsEmpty() && !bDrawIfFocused)
  {
    UpdateCueBanner(TRUE);
  }
}

void CCueBannerEditCtrl::OnEnKillfocus()
{
  // TODO: 在此添加控件通知处理程序代码
  UpdateCueBanner();
}

void CCueBannerEditCtrl::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  UpdateCueBanner(FALSE);
  CEdit::OnChar(nChar, nRepCnt, nFlags);
}

void CCueBannerEditCtrl::OnPaint()
{
  CPaintDC dc(this); // device context for painting
  // TODO: 在此处添加消息处理程序代码

  CString szWndText;
  GetWindowText(szWndText);
  if(!szWndText.IsEmpty())
  {
    CFont *pOldFont = dc.SelectObject( GetParent()->GetFont() );
    dc.TextOut(3, 1, szWndText);
    dc.SelectObject(pOldFont);
  }

  CEdit::OnPaint();
}

BOOL CCueBannerEditCtrl::OnEraseBkgnd(CDC* pDC)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  CRect rcRect;
  GetClientRect(rcRect);

  COLORREF bkColor = GetSysColor(COLOR_WINDOW);
  if(! IsWindowEnabled())
    bkColor = GetSysColor(COLOR_3DFACE);
  pDC->FillSolidRect(rcRect, bkColor);

  if(bShowCueBanner && !CueBannerString.IsEmpty())
  {
    pDC->SetTextColor( GetSysColor(COLOR_GRAYTEXT) );
    int BkMode = pDC->SetBkMode(TRANSPARENT);
    CFont *pOldFont = pDC->SelectObject( GetParent()->GetFont() );
    pDC->TextOut(3, 1, CueBannerString);
    pDC->SelectObject( pOldFont );
    pDC->SetBkMode(BkMode);
  }

  return TRUE;
  //return CEdit::OnEraseBkgnd(pDC);
}

void CCueBannerEditCtrl::UpdateCueBanner(BOOL bHide)
{
  BOOL bShowSave = bShowCueBanner;
  if(bHide)
  {
    bShowCueBanner = FALSE;
  }
  else
  {
    CString szWndText;
    GetWindowText(szWndText);
    if(szWndText.IsEmpty() && CueBannerString.IsEmpty())
    {
      bShowCueBanner = TRUE;
    } 
  }
  RedrawWindow();
}

void CCueBannerEditCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  CEdit::OnLButtonDown(nFlags, point);
  UpdateCueBanner();
}

void CCueBannerEditCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
  // TODO: 在此添加消息处理程序代码和/或调用默认值
  CEdit::OnMouseMove(nFlags, point);

  if(nFlags & MK_LBUTTON)
  {
    UpdateCueBanner();    
  }
}

BOOL CCueBannerEditCtrl::PreTranslateMessage(MSG* pMsg)
{
  // TODO: 在此添加专用代码和/或调用基类
  if(!bEnableKbInput)
  {
    if((pMsg->message >= WM_MOUSEFIRST && pMsg->message <= WM_MOUSELAST)
      || (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
      || 0)
      return TRUE;
  }
  return CEdit::PreTranslateMessage(pMsg);
}

BOOL CCueBannerEditCtrl::EnableKbInput(BOOL bEn)
{
  BOOL bRet = bEnableKbInput;
  bEnableKbInput = bEn;
  return bRet;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值