GUI 剖析之 系统托盘图标的实现

系统托盘图标的实现          

#include <commctrl.h>

#pragma comment(lib,"comctl32.lib")//导入库comctl32.lib

#include <ShellAPI.h >

#define ID_TASKBARICON 100

#define WM_ICONNOTIFY          (WM_USER + 101)

 

 

case WM_ICONNOTIFY:

             {

                    switch(lParam)

                    {

                    case WM_LBUTTONDBLCLK:

                           // Load main window here

                           break;

                    case WM_RBUTTONUP:

                           {

                                  POINT point;

                                  HMENU hMenu, hSubMenu;

                                  // Get mouse position

                                  GetCursorPos(&point);

                                  // Popup context menu

                                  hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDC_MY));

                                  hSubMenu = GetSubMenu(hMenu, 0);

                                  SetMenuDefaultItem(hSubMenu, IDC_MY, FALSE);

                                  SetForegroundWindow(hWnd);         // Per KB Article Q135788

                                  TrackPopupMenu(hSubMenu,

                                         TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN,

                                         point.x, point.y, 0, hWnd, NULL);

                                  PostMessage(hWnd, WM_NULL, 0, 0);   // Per KB Article Q135788

                                  DestroyMenu(hMenu);

                           }

                           break;

                    default:

                           return FALSE;

                    }

             }

             

      case WM_CREATE:

             {

              

 

 

 

                    NOTIFYICONDATA nid;

 

                    // 初始化系统托盘图标

                    nid.cbSize = sizeof(NOTIFYICONDATA);

                    nid.hWnd = hWnd;

                    nid.uID = ID_TASKBARICON;

                    nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;

                    nid.uCallbackMessage = WM_ICONNOTIFY;

                    nid.hIcon =(HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_SMALL), IMAGE_ICON, 16, 16, 0);

                    strcpy(nid.szTip, "My Tooltip Text");

                    Shell_NotifyIcon(NIM_ADD, &nid);

 

                    break;

             }

 

 

 

///

最近我在网上收集了一些完整的代码,感觉比我实现的要好,贴出来与大家分享:

 

#include "Windows.h"
#include "tchar.h"

#define WM_SHELLNOTIFY WM_USER+5
#define IDI_TRAY 0
#define IDM_RESTORE 1000
#define IDM_EXIT    1010

TCHAR ClassName[] = _T("TrayIconWinClass");
TCHAR AppName[] = _T("TrayIcon Demo");
TCHAR RestoreString[] = _T("&Restore");
TCHAR ExitString[] = _T("E&xit Program");

HINSTANCE g_hInstance;
NOTIFYICONDATA note;

HMENU   hPopupMenu;

INT_PTR CALLBACK ProcWinMain(   HWND hWnd,
                       UINT Msg,
                       WPARAM wParam,
                       LPARAM lParam
)
{
    POINT pt;
    switch(Msg)
    {
    case WM_CREATE:
    {
        hPopupMenu = CreatePopupMenu();
        AppendMenu(hPopupMenu,MF_STRING,IDM_RESTORE,RestoreString);
        AppendMenu(hPopupMenu,MF_STRING,IDM_EXIT,ExitString);
    }
    break;
  
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_SIZE:
        if(wParam == SIZE_MINIMIZED)
        {
            note.cbSize = sizeof(NOTIFYICONDATA);
            note.hWnd = hWnd;
            note.uID = IDI_TRAY;
            note.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
            note.uCallbackMessage = WM_SHELLNOTIFY;
            note.hIcon = LoadIcon(NULL,IDI_WINLOGO);
            lstrcpy(note.szTip,AppName);
            ShowWindow(hWnd,SW_HIDE);
            Shell_NotifyIcon(NIM_ADD,&note);
        }
        break;
    case WM_COMMAND:
        if(lParam == 0)
        {
            Shell_NotifyIcon(NIM_DELETE,&note);
            if(LOWORD(wParam) == IDM_RESTORE)
                ShowWindow(hWnd,SW_RESTORE);
            else
                DestroyWindow(hWnd);
        }
        break;

    case WM_SHELLNOTIFY:
        if(wParam == IDI_TRAY)
        {
            if(lParam == WM_RBUTTONDOWN)
            {
                GetCursorPos(&pt);
                TrackPopupMenu(hPopupMenu,TPM_RIGHTALIGN,pt.x,
                    pt.y,NULL,hWnd,NULL);
           
            }
            else if(lParam == WM_LBUTTONDBLCLK)
            {
                SendMessage(hWnd,WM_COMMAND,IDM_RESTORE,0);
            }
        }
        break;
    default:
        return DefWindowProc(hWnd,Msg,wParam,lParam);
    }
    return 0;
}
int WINAPI WinMain(     HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine,
                        int nCmdShow
)
{
    WNDCLASSEX wc;
    MSG msg;
    HWND hWnd;
    g_hInstance = hInstance;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW |CS_DBLCLKS;
    wc.lpfnWndProc = ProcWinMain;
    wc.cbClsExtra = NULL;
    wc.cbWndExtra = NULL;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    wc.hIcon = wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,ClassName,AppName,WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,350,200,NULL,NULL,hInstance,NULL);
    ShowWindow(hWnd,SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }


    return msg.wParam;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值