分享

给托盘图标增加气球提示

 lscan*98* 2010-09-17
  给托盘图标增加气球提示 收藏
先看一下下面这篇文章,可能对你会有帮助
http:blog.csdn.net/XXKKFF/archive/2007/05/06/1598526.aspx
在vc 6.0里要给托盘增加气球提示的确要费一番工夫
首先要到下面
http:www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
下载新的sdk进行安装
安装之后,还要把这个新的sdk和visual studio关联起来
在开始菜单里有这样一个菜单项.手工关联的话,比较麻烦,这里就不说了
剩下的使用方法请看下面的注释
#define _WIN32_IE 0x0501    //必须定义这个,NOTIFYICONDATA的某些属性才可用
#define WM_TRAYMESSAGE WM_USER + 1 //我托盘图标相关的消息
#include <windows.h>
#include <shellapi.h>    //Shell_NotifyIcon
#include "resource.h"
//过程函数的返回值都是LRESULT,类型都是CALLBACK
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine,int nCmdShow)
{
    HWND hwnd;        //主窗口句柄,在CreateWindow中赋值
    MSG msg;        //消息变量,在GetMessage中使用
    WNDCLASS wndclass;        //窗口类
    TCHAR* szAppName = TEXT("Tray");    //类名和窗口名
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //窗口背景
    wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);        //鼠标
    wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);    //图标
    wndclass.lpszClassName = szAppName;        //类名
    wndclass.cbClsExtra = 0;        //类的额外参数
    wndclass.cbWndExtra = 0;        //窗口的额外参数.用于基于同一窗口类的窗口各自区分.
                                    //在自定义对话框类时必须指定为DLGWINDOWEXTRA的大小
    wndclass.lpszMenuName = NULL;    //菜单名.可以用作子窗口的id
    wndclass.style = CS_HREDRAW | CS_VREDRAW;    //窗口风格
    wndclass.lpfnWndProc = WndProc;        //窗口过程
    wndclass.hInstance = hInstance;        //包含窗口过程的实例句柄
    if( !RegisterClass(&wndclass) )        //注册窗口类
        return 0;
    hwnd = CreateWindow(                //创建窗口
                szAppName,                //窗口类名
                szAppName,                //窗口标题
                WS_OVERLAPPEDWINDOW,    //窗口风格
                CW_USEDEFAULT,            //初始的x坐标
                CW_USEDEFAULT,            //初始的y坐标
                CW_USEDEFAULT,            //初始的宽度
                CW_USEDEFAULT,            //初始的高度
                NULL,                    //父窗口
                NULL,                    //菜单
                hInstance,                //和窗口相关的实例句柄
                NULL                    //额外参数
                );
    ShowWindow( hwnd,nCmdShow );        //显示窗口
    UpdateWindow( hwnd );                //更新窗口
    while( GetMessage(&msg,NULL,0,0) )    //消息循环
    {
        TranslateMessage(&msg);            //将WM_XXXKEYXXX消息翻译为WM_CHAR消息
        DispatchMessage(&msg);            //传递消息到窗口过程
    }   
    return msg.wParam;                    //返回
}
LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
{
    static NOTIFYICONDATA nid;    //代表一个托盘图标的结构
    static HMENU hMainMenu;        //主菜单,主要是为了得到下面这个菜单
    static HMENU hPopupMenu;    //在托盘图标上右击时显示的菜单
    static HINSTANCE hInstance;
    switch( message )
    {
    case WM_TIMER:
        //NIF_INFO,NIIF_ERROR,szInfo等都只有在新的sdk中才有定义,且
        //只有 _WIN32_IE >= 0x0501时才有定义
        nid.uFlags = NIF_INFO; //这个标志使得可以显示气球提示
        lstrcpy(nid.szInfo, TEXT("This is a Tray Icon!"));
        nid.dwInfoFlags = NIIF_ERROR;
        lstrcpy(nid.szInfoTitle, TEXT("TrayIcon"));
        Shell_NotifyIcon(NIM_MODIFY, &nid);        //显示气球提示
        return 0;
    case WM_CREATE:
        {
            hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
            //加载菜单
            hMainMenu = (HMENU)LoadMenu(hInstance, TEXT("TRAYMENU"));
            hPopupMenu = GetSubMenu(hMainMenu, 0);
            nid.cbSize = sizeof(nid);
            //指定托盘的图标
            nid.hIcon = (HICON)LoadIcon( hInstance, TEXT("TRAYICON") );
            nid.hWnd = hwnd;
            //和我们的托盘图标相关的消息
            //例如鼠标的单击,右击.
            //以及由气球提示触发的消息
            nid.uCallbackMessage = WM_TRAYMESSAGE;
            nid.uID = 1;
            nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
            lstrcpy( nid.szTip, TEXT("This is a Tray Icon!"));
            //添加一个托盘图标
            Shell_NotifyIcon(NIM_ADD, &nid);
            //每5秒显示一次气球
            SetTimer(hwnd, 0, 10000, NULL);
            return 0;
        }
    case WM_DESTROY:
        //删除托盘图标
        Shell_NotifyIcon(NIM_DELETE, &nid);
        PostQuitMessage(0);
        return 0;
    case WM_TRAYMESSAGE:
        {
            switch( lParam )
            {
            case WM_LBUTTONDOWN:
                MessageBox(hwnd, TEXT("LBUTTONDOWN in TrayIcon!"),
                           TEXT("TrayIcon"), MB_OK);
                return 0;
            case WM_RBUTTONDOWN:
                {
                    POINT point;
                    GetCursorPos( &point );
                    SetForegroundWindow(hwnd);
                    TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN,
                        point.x, point.y, 0, hwnd, NULL);
                return 0;
                }
                //处理由气球提示产生的通知
            case NIN_BALLOONUSERCLICK:
                MessageBox(hwnd, "click in ballon!", "ballon", MB_OK);
                return 0;
            case NIN_BALLOONSHOW:
                MessageBox(hwnd, "ballon shown!", "ballon", MB_OK);
                return 0;
            case NIN_BALLOONTIMEOUT:
                MessageBox(hwnd, "ballon timeout!", "ballon", MB_OK);
                return 0;
            }
        }
    case WM_COMMAND:
        switch( LOWORD(wParam) )
        {
        case IDM_TRAY_MESSAGEBOX:
                MessageBox(hwnd, TEXT("Menu Selected in TrayIcon!"),
                           TEXT("TrayIcon"), MB_OK);
                return 0;
        case IDM_TRAY_QUIT:
            //删除托盘图标
            Shell_NotifyIcon(NIM_DELETE, &nid);
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc( hwnd,message,wParam,lParam );
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/XXKKFF/archive/2007/05/11/1605182.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多