MFC友好信息提示类

217 阅读5分钟

如需转载请标明出处

QQ技术交流群:129518033

\

本文实现了类似QQ弹出窗口的功能,并封装成类。

主要功能:

1、动画弹出,可以设置类型

2、弹出信息后自动消失。 

3、可以设置字体大小和颜色。 

4、设置窗口停留时间和显示类型。 

5、不占用主窗口的焦点。\

\

整个工程下载地址:

download.csdn.net/detail/itas…

\

实现效果如下:

\

\

弹出窗类的代码如下:

ShowInfoDlg.h\

<span style="font-size:18px;">/*
**	FILENAME			ShowInfoDlg.h
**
**	PURPOSE				这个类可以友好的弹出提示窗口,并且不占用主窗口的焦点。
**						提示信息字体的大小和颜色等可以设置
**						默认弹出框在桌面可用区域的右下角
**						
**
**	CREATION DATE		2015-09-01
**	LAST MODIFICATION	2015-09-01
**
**	AUTHOR				itas109
**	Blog                blog.csdn.net/itas109
**
*/

#if !defined(AFX_SHOWINFODLG_H__273027B9_8244_4624_BC2B_44491EA67BE8__INCLUDED_)
#define AFX_SHOWINFODLG_H__273027B9_8244_4624_BC2B_44491EA67BE8__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ShowInfoDlg.h : header file
//
#include "resource.h" //IDD_DIALOG_SHOWINFO的头文件


//定义动画类型
#define AW_CENTER            0x00000010    // 若使用了AW_HIDE标志,则使窗口向内重叠,即收缩窗口;若未使用AW_HIDE标志,则使窗口向外扩展,即展开窗口
#define AW_HOR_POSITIVE      0x00000001	   // 自左向右显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略
#define AW_HOR_NEGATIVE      0x00000002
#define AW_VER_POSITIVE      0x00000004	   // 自顶向下显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略
#define AW_VER_NEGATIVE      0x00000008    // 自下向上显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略

#define AW_HIDE              0x00010000    // 隐藏窗口,缺省则显示窗口
#define AW_ACTIVATE          0x00020000    // 激活窗口。在使用了AW_HIDE标志后不能使用这个标志
#define AW_SLIDE             0x00040000	   // 使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略
#define AW_BLEND             0x00080000    // 实现淡出效果。只有当hWnd为顶层窗口的时候才可以使用此标志

/
// ShowInfoDlg dialog

class ShowInfoDlg : public CDialog
{
// Construction
public:
	void ShowDlg(CString str, int showType=1, int showTimeMS = 500);
	ShowInfoDlg(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
	//{{AFX_DATA(ShowInfoDlg)
	//如果DLG改变,此处修改为需要显示的DLG的IDD GX 20150826
	enum { IDD = IDD_DIALOG_SHOWINFO };
		// NOTE: the ClassWizard will add data members here
	//}}AFX_DATA


// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(ShowInfoDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:

	// Generated message map functions
	//{{AFX_MSG(ShowInfoDlg)
	afx_msg void OnTimer(UINT nIDEvent);
	virtual BOOL OnInitDialog();
	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private:
	CBrush* m_Brush;
	CFont m_font;

	void ShowType(int nType = 1);
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SHOWINFODLG_H__273027B9_8244_4624_BC2B_44491EA67BE8__INCLUDED_)
</span>


ShowInfoDlg.cpp\

<span style="font-size:18px;">/*
**	FILENAME			ShowInfoDlg.h
**
**	PURPOSE				这个类可以友好的弹出提示窗口,并且不占用主窗口的焦点。
**						提示信息字体的大小和颜色等可以设置
**						默认弹出框在桌面可用区域的右下角
**						
**
**	CREATION DATE		2015-09-01
**	LAST MODIFICATION	2015-09-01
**
**	AUTHOR				itas109
**	Blog                blog.csdn.net/itas109
**
*/

// ShowInfoDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ShowInfoDlg.h"

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

/
// ShowInfoDlg dialog


ShowInfoDlg::ShowInfoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(ShowInfoDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(ShowInfoDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void ShowInfoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(ShowInfoDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BOOL ShowInfoDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here

	// 获得桌面大小
	CRect rectWorkArea;
	SystemParametersInfo(SPI_GETWORKAREA, 0, &rectWorkArea, SPIF_SENDCHANGE);  
	// 获得对话框大小
	CRect rectDlg;
	GetWindowRect(&rectDlg);
	int nW = rectDlg.Width();
	int nH = rectDlg.Height();
	// CWnd::SetWindowPos See from MSDN
	//工作区域右下角显示
	//SWP_NOACTIVATE 窗口置顶不激活
	SetWindowPos(&CWnd::wndTopMost, rectWorkArea.right-nW-5, rectWorkArea.bottom-nH-5, nW, nH, SWP_NOACTIVATE); // 窗口置顶不激活
	
	//字体及大小
	m_font.CreatePointFont(100,"宋体");

	return TRUE;  // return TRUE unless you set the focus to a control
	// EXCEPTION: OCX Property Pages should return FALSE
}


BEGIN_MESSAGE_MAP(ShowInfoDlg, CDialog)
	//{{AFX_MSG_MAP(ShowInfoDlg)
	ON_WM_TIMER()
	ON_WM_CTLCOLOR()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// ShowInfoDlg message handlers

void ShowInfoDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if (nIDEvent == 1)
	{
		/*
		HINSTANCE hInst = LoadLibrary("User32.DLL");
		typedef BOOL(WINAPI MYFUNC(HWND, DWORD, DWORD));
		// 声明函数
		MYFUNC* AnimateWindow;	
		AnimateWindow = (MYFUNC*)::GetProcAddress(hInst, "AnimateWindow");
		AnimateWindow(this->GetSafeHwnd(), 200, AW_HIDE | AW_BLEND);
		FreeLibrary(hInst);	
		*/
		CDialog::OnOK();

		//这种方式会受到时间的影响 因为定时器有延时
		//CMainFrame *pMainFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;//当前程序的主窗口的指针
		//::SetActiveWindow(pMainFrame->m_hWnd);//激活主窗口程序,把焦点还给主窗口

		KillTimer(1);
	}
		
	CDialog::OnTimer(nIDEvent);
}

void ShowInfoDlg::ShowDlg(CString str, int showType/* =1 */, int showTimeMS /* = 500 */)
{
	//只改变字体大小和字体类型
	//this->GetDlgItem(IDC_STATIC_TIP)->SetFont(&m_font);
	//窗体文字
	this->GetDlgItem(IDC_STATIC_TIP)->SetWindowText(_T(str));
	
	ShowType(showType);
	SetTimer(1, showTimeMS, NULL);
}

void ShowInfoDlg::ShowType(int nType /* = 1 */)
{
	if (1 == nType)
	{
		// 淡入、淡出
		// CenterWindow();		// 对话框处于中心位置
		HINSTANCE hInst = LoadLibrary("User32.DLL");	// 导入动态链接库User32.DLL
		typedef BOOL(WINAPI MYFUNC(HWND hwnd, DWORD dwTime, DWORD dwFlags));//dwTime动画持续的时间(标准200ms)	
		// 声明函数
		MYFUNC* AnimateWindow;
		AnimateWindow = (MYFUNC*)::GetProcAddress(hInst, "AnimateWindow");
		AnimateWindow(this->m_hWnd, 300, AW_BLEND);
		FreeLibrary(hInst);		
	}
	else if (2 == nType)
	{
		// 从下向上
		HINSTANCE hInst = LoadLibrary("user32.dll");
		typedef UINT(WINAPI* PMYFUNC)(HWND hwnd, DWORD dwTime,DWORD dwFlags);
		// 声明函数
		PMYFUNC pAnimateWindow;	
		if(NULL != hInst)
		{
			pAnimateWindow = (PMYFUNC)::GetProcAddress(hInst, "AnimateWindow");
			pAnimateWindow(GetSafeHwnd(), 300, AW_SLIDE | AW_VER_NEGATIVE);
			FreeLibrary(hInst);
		}		
	}
	
	//Sleep会使CPU暂停 尽量不使用该函数
	//DLG显示时间
	//Sleep(showTimeMS);
}


HBRUSH ShowInfoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	
	if (pWnd->GetDlgCtrlID() == IDC_STATIC_TIP)
	{
		//pDC->SetBkMode(TRANSPARENT);//字体背景透明

		pDC->SetTextColor(RGB(255,0,0));//字体颜色

		pDC->SelectObject(&m_font);//字体大小

	}
	
	// TODO: Return a different brush if the default is not desired
	return hbr;
}
</span>


\

如需转载请标明出处

QQ技术交流群:129518033

\