正在进行中的功能--动态消息对话框(.cpp)

类别:VC语言 点击:0 评论:0 推荐:

// InformationTip.cpp : implementation file
//

#include "stdafx.h"
#include "taskmng.h"
#include "InformationTip.h"

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

/////////////////////////////////////////////////////////////////////////////
// CInformationTip dialog


CInformationTip::CInformationTip(CWnd* pParent /*=NULL*/)
 : CDialog(CInformationTip::IDD, pParent)
{
 //{{AFX_DATA_INIT(CInformationTip)
 //}}AFX_DATA_INIT
 
}


void CInformationTip::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CInformationTip)
 DDX_Control(pDX, IDC_BUTTON_TIPINFO, m_ButtonCtrl_TipInfo);
 //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CInformationTip, CDialog)
 //{{AFX_MSG_MAP(CInformationTip)
 ON_WM_SIZE()
 ON_WM_TIMER()
 ON_WM_KILLFOCUS()
 ON_WM_MOUSEMOVE()
 ON_WM_MOVE()
 ON_WM_CTLCOLOR()
 ON_WM_DESTROY()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInformationTip message handlers

BOOL CInformationTip::OnInitDialog()
{
 CDialog::OnInitDialog();
 
 // TODO: Add extra initialization here
 /*获得屏幕高度和宽度*/
 m_ScreenPos.m_ScreenX = ::GetSystemMetrics(SM_CXSCREEN);
 m_ScreenPos.m_ScreenY = ::GetSystemMetrics(SM_CYSCREEN);
 m_dwTime = 2000;              /*初始停留时间:10秒*/
 m_dwStep = 20;                /*初始平滑度*/
 m_iRate = 0;                /*对话框充实度*/
 m_IsAlreadyShow = TRUE;
 m_DlkBkBrush.CreateSolidBrush(RGB(212,208,200));
 m_TipInf_Font.CreateFont(16,0,0,0,FW_BOLD,FALSE,TRUE,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"宋体");
// m_TipInfoImage.Create(32,32,TRUE|ILC_COLOR8,4,0);
// m_TipInfoImage.Add(((CTaskMngApp*)AfxGetApp())->LoadIcon(IDI_ICON_USERS));
 InitMemCtrl();
 SetTimer(WM_TIMER,m_dwTime,NULL);
 /****************************************************************/
 /****************************************************************/
 ::SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
 m_hUser32DLL = ::LoadLibrary("User32.DLL");
 if(m_hUser32DLL)
 {
  m_fFill = NULL;
  m_fFill = (SET_FILL_CLR)::GetProcAddress(m_hUser32DLL,"SetLayeredWindowAttributes");
  if (m_fFill)
  {
   SetDlgLayoutColor(20);
  }
  
 }
 
 ShowInformations(TRUE);
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

void CInformationTip::SetDlgLayoutColor(int iRate)
{
 if (iRate > 90)
  iRate = 90;
 else if (iRate < 10)
  iRate = 20;
 m_fFill(GetSafeHwnd(),0,(255*iRate)/100,2);
}

void CInformationTip::InitMemCtrl()
{
 m_ButtonCtrl_TipInfo.SetFont(&m_TipInf_Font);
 m_ButtonCtrl_TipInfo.SetWindowText("您有一条新消息!");
}

void CInformationTip::SetDlgBkColor(COLORREF Clr)
{
 m_DlkBkBrush.CreateSolidBrush(Clr);
}

/*设置完毕后,下一次应用改变*/
void CInformationTip::SetShowTipAtWhere(TIPSHOWPOS TSP)
{
}

/*设置完毕后,下一次应用改变*/
void CInformationTip::SetShowTipTime(DWORD dwTime)
{
 m_dwTime = dwTime;
}

/*设置完毕后,下一次应用改变*/
void CInformationTip::SetKeepMoveStep(DWORD dwStep)
{
 m_dwStep = dwStep;
}

void CInformationTip::OnSize(UINT nType, int cx, int cy)
{
 CDialog::OnSize(nType, cx, cy);
 
 // TODO: Add your message handler code here
 
}

void CInformationTip::ShowInformations(BOOL IsShow)
{
 if (!IsShow)
 {
  
  KeepMoveMoveMove(IsShow);
  m_IsAlreadyShow = FALSE;
  return ;
 }
 CRect rect;
 rect.SetRect(0,0,0,0);
 GetWindowRect(&rect);

 SetWindowPos(&wndTopMost,
  m_ScreenPos.m_ScreenX-rect.Width(),
  m_ScreenPos.m_ScreenY-NEAR_SIDE,
  rect.Width(),NEAR_SIDE,SWP_NOSIZE|SWP_SHOWWINDOW);

 KeepMoveMoveMove(IsShow);
 m_IsAlreadyShow = TRUE;
 
}

void CInformationTip::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 POINT pt;
 CRect rc;
 GetCursorPos(&pt);
 GetWindowRect(&rc);
 if (!PtInRect(&rc,pt))/*若鼠标不在窗体内,隐藏窗体*/
 {
  KillTimer(WM_TIMER);
  ShowInformations(FALSE);
 }
 CDialog::OnTimer(nIDEvent);
}

void CInformationTip::KeepMoveMoveMove(BOOL IsShow)
{
 CRect rc;
 rc.SetRect(0,0,0,0);
 GetWindowRect(&rc);
 int i = 100;
 if (!IsShow)
 {
  while (rc.top < (m_ScreenPos.m_ScreenY-NEAR_SIDE))
  {
   SetWindowPos(&wndTopMost,rc.left,rc.top,rc.right,rc.bottom,SWP_NOSIZE|SWP_HIDEWINDOW);
   rc.top += m_dwStep;
   if (rc.top > (m_ScreenPos.m_ScreenY-NEAR_SIDE))
   {
    rc.top = m_ScreenPos.m_ScreenY-NEAR_SIDE;
    break;
   }
   SetWindowPos(&wndTopMost,rc.left,rc.top,rc.right,rc.bottom,SWP_NOSIZE|SWP_SHOWWINDOW);
   if (m_fFill)
    SetDlgLayoutColor((m_iRate-=5,m_iRate));
   ::Sleep(20);
  }
  SetWindowPos(&wndTopMost,rc.left,rc.top,rc.right,rc.bottom,SWP_NOSIZE|SWP_SHOWWINDOW);
 }
 else
 {

  /*
  while (rc.top)
  {
   SetWindowPos(&wndTopMost,rc.left,rc.top,rc.right,rc.bottom,SWP_NOSIZE|SWP_HIDEWINDOW);
   rc.top -= m_dwStep;
   rc.bottom += m_dwStep;
   if (rc.top <= 0)
   {
    rc.top = 0;
    SetWindowPos(&wndTopMost,rc.left,rc.top,rc.right,rc.bottom,SWP_NOSIZE|SWP_SHOWWINDOW);
    break;
   }
   SetWindowPos(&wndTopMost,rc.left,rc.top,rc.right,rc.bottom,SWP_NOSIZE|SWP_SHOWWINDOW);
  }*/
  

  for (int i=0;i<m_dwStep;++i)
  {
   SetWindowPos(&wndTopMost,rc.left,rc.top,rc.right,rc.bottom,SWP_NOSIZE|SWP_HIDEWINDOW);
   rc.top -= m_dwStep;
   SetWindowPos(&wndTopMost,rc.left,rc.top,rc.right,rc.bottom,SWP_NOSIZE|SWP_SHOWWINDOW);
   if (m_fFill)
    SetDlgLayoutColor((m_iRate+=5,m_iRate));
   ::Sleep(20);
  }
  
 }
}

void CInformationTip::OnKillFocus(CWnd* pNewWnd)
{
 CDialog::OnKillFocus(pNewWnd);
 
 // TODO: Add your message handler code here
}

void CInformationTip::OnMouseMove(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 if (!m_IsAlreadyShow)
 {
  ShowInformations(TRUE);
  SetTimer(WM_TIMER,m_dwTime,NULL);
 }
 CDialog::OnMouseMove(nFlags, point);
}

void CInformationTip::OnMove(int x, int y)
{
 CDialog::OnMove(x, y);
 
 // TODO: Add your message handler code here
}

void CInformationTip::OnOK()
{
/*
  if (!m_IsAlreadyShow)
  {
   ShowInformations(TRUE);
   SetTimer(WM_TIMER,m_dwTime,NULL);
  }*/
 
 return ;
}

void CInformationTip::Cancel()
{
/*
  if (!m_IsAlreadyShow)
  {
   ShowInformations(TRUE);
   SetTimer(WM_TIMER,m_dwTime,NULL);
  }*/
 
 return ;
}

void CInformationTip::OnClose()
{
/*
  if (!m_IsAlreadyShow)
  {
   ShowInformations(TRUE);
   SetTimer(WM_TIMER,m_dwTime,NULL);
  }*/
 
 return ;
}

HBRUSH CInformationTip::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 /*HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);*/

 if (pWnd->GetDlgCtrlID() == IDC_BUTTON_TIPINFO)
 {
  pDC->SetTextColor(RGB(255,0,0));
  pDC->SetBkColor(RGB(212,208,200));
  pDC->SetBkMode(TRANSPARENT);
 }
 // TODO: Change any attributes of the DC here
 // TODO: Return a different brush if the default is not desired
 return m_DlkBkBrush;
}

BOOL CInformationTip::PreTranslateMessage(MSG* pMsg)
{
 // TODO: Add your specialized code here and/or call the base class
 return CDialog::PreTranslateMessage(pMsg);
}

void CInformationTip::OnDestroy()
{
 CDialog::OnDestroy();
 
 // TODO: Add your message handler code here
 if (m_hUser32DLL)
  ::FreeLibrary(m_hUser32DLL);
}

本文地址:http://com.8s8s.com/it/it300.htm