Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6063531
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-04-23 21:51:58

制作 MSN、QQ 的消息提示窗口

作者:



  用过QQ和MSN聊天工具的人都知道,只要好友上线,就会在托盘的位置处显示一个提示窗口,
可以是拉帘式的,或者是淡入淡出的形式出现;想想何不为自己的程式也加一个漂亮的提示窗口呢:)
说做就做。

一、MSN拉帘式窗口制作

分三部分:1、窗口的显示;2、窗口的停留;3、窗口的消失;
如果达到这样郊果,系统中要有三个定时器,进行分别控制。定义的定时器如下:

#define ID_TIMER_POP_WINDOW 1

#define ID_TIMER_DISPALY_DELAY 2 

#define ID_TIMER_CLOSE_WINDOW 3 

  从CWnd 继承一个窗口,当然也可以从CFrameWnd进行派生,这不是主要问题,关键是看你是怎么处理WM_PAINT,WM_MOUSEMOVE,WM_TIMER的消息。一般情况,我从OnPaint()中进行显示图片,在WM_TIMER中处理定时器消息,下面是处里定时器时用到的代码:

CMsgWnd::CMsgWnd()

{ 

	...

	SetTimer(ID_TIEMR_POP_WINDOW,20,NULL);

	...

} 



void CMsgWnd::OnTimer(UINT nIDEvent) 

{ 

	static int nHeight=0;

	int cy=GetSystemMetrics(SM_CYSCREEN);

	int cx=GetSystemMetrics(SM_CXSCREEN);

	RECT rect;

	SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);

	int y=rect.bottom-rect.top;

	int x=rect.right-rect.left;

	x=x-WIN_WIDTH;

	

	switch(nIDEvent)

	{

	case ID_TIMER_POP_WINDOW:

		if(nHeight<=WIN_HEIGHT)

		{

			  nHeight; 

			MoveWindow(x,

				y-nHeight,

				WIN_WIDTH,

				WIN_HEIGHT);

			

			Invalidate(FALSE);

		}

		else

		{

			KillTimer(ID_TIMER_POP_WINDOW);

			SetTimer(ID_TIMER_DISPLAY_DELAY,5000,NULL);

		}

		break;

	case ID_TIMER_CLOSE_WINDOW:

		if(nHeight>=0)

		{

			nHeight--;

			MoveWindow(x,

				y-nHeight,

				WIN_WIDTH,

				nHeight);

		}

		else

		{

			KillTimer(ID_TIMER_CLOSE_WINDOW);

			SendMessage(WM_CLOSE);

		}

		break;

	case ID_TIMER_DISPLAY_DELAY:

		KillTimer(ID_TIMER_DISPLAY_DELAY);

		SetTimer(ID_TIMER_CLOSE_WINDOW,20,NULL);

		break;

	}

	

	CWnd::OnTimer(nIDEvent);

}            
根据你设的定时器的长短来控制窗口的显示过程;

二、QQ淡出淡出显示实现

  其实用到一个API函数:AnimateWindow,下面是这个函数的一些说明:
The AnimateWindow function enables you to produce special effects when showing or hiding windows.

There are two types of animation: roll animation and slide animation. 
BOOL AnimateWindow(

		 HWND hwnd, // handle to the window to animate

		 DWORD dwTime, // duration of animation

		 DWORD dwFlags // animation type

		 );
上面的函数前两个参数一看就明白,不用说了,最后一个参数dwFlags设置动画窗口的样式:
Specifies the type of animation. This parameter can be one or more of the following flags.

各种标志说明:

标志
阅读(268) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~