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

2008-04-09 04:09:27来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  用过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,下面是这个函数的一些说明:

BOOL AnimateWindow(
 HWND hwnd, // handle to the window to animate
 DWORD dwTime, // duration of animation
 DWORD dwFlags // animation type
);
  上面的函数前两个参数一看就明白,不用说了,最后一个参数dwFlags设置动画窗口的样式:

  各种标志说明:

标志 说明 AW_SLIDE Uses slide animation. By default, roll animation is used.
This flag is ignored when used with the AW_CENTER flag. AW_ACTIVATE Activates the window. Do not use this flag with AW_HIDE. AW_BLEND Uses a fade effect. This flag can be used only if hwnd is a top-level window. AW_HIDE Hides the window. By default, the window is shown. AW_CENTER Makes the window appear to collapse inward if the AW_HIDE flag is used or expand outward
if the AW_HIDE flag is not used. AW_HOR_POSITIVE Animate the window from left to right. This flag can be used with roll or slide animation. It is ignored when used with the AW_CENTER flag. AW_HOR_NEGATIVE Animate the window from right to left. This flag can be used with roll or slide animation.
It is ignored when used with the AW_CENTER flag. AW_VER_POSITIVE Animate the window from top to bottom. This flag can be used with roll or slide animation.
It is ignored when used with the AW_CENTER flag. AW_VER_NEGATIVE Animate the window from bottom to top. This flag can be used with roll or slide animation.
It is ignored when used with the AW_CENTER flag.
  以上内容是从MSDN中摘录的,要淡入淡出的效果的话,用到AW_BELND。

  三、控制窗口显示的代码

CMainFrame::OnCreate(…)
{
 //...
 AnimateWindow(GetSafeHwnd(),1000,AW_CENTER|AW_BLEND);
 //…
}
  四、关闭的代码

CMainFrame::OnClose(..)
{
 AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_CENTER|AW_BLEND);
}
  其实AnimateWindow只是利用了windows本身的方法,如果您要更加有个性的窗口效果,那就得多做写些代码了,一分辛苦,一分收获吧

  五、结束语

  其实就MSN的提示窗口来说,如果要从使用复杂一点的背景和效果,那么还有刷新屏幕的问题,应做到无闪刷新.由于时间苍促,不足之处必然有之,同时以上代码也参考了一部分以前 VCKBASE 技术文档,在此表示感谢!

  如果有问题,欢迎交流!共同进步!



标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:VisualC 下对匿名管道的编程实现

下一篇:ViusalC 6.0实现文档的分页打印

IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设

网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源

网站联盟: 联盟新闻 联盟介绍 联盟点评 网赚技巧

行业资讯: 搜索引擎 网络游戏 电子商务 广告传媒

网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它

服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护

软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷

网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash

程序设计: Java技术 C/C++ VB delphi

网络知识: 网络协议 网络安全 网络管理 组网方案 Cisco技术

操作系统: Win2000 WinXP Win2003 Mac OS Linux FreeBSD

热门词条
最新资讯
热门关注
热门标签