怎样把基于对话框的程序做成托盘的格式??

解决方案 »

  1.   

    有不少例子可以看你看看本站的文章还有,可以看看www.vckbase的文章库
      

  2.   

    you email.
    给你一个例子
      

  3.   

    [email protected]
    谢谢 wistaria(听风听雨)
      

  4.   

    HWND m_WndHandle;
    NOTIFYICONDATA m_tray_nid;
    HICON m_hIcon;
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MINTOPTYPE);
        m_WndHandle = this->m_hWnd; //窗口的句柄
        m_tray_nid.cbSize = sizeof(NOTIFYICONDATA);
        m_tray_nid.hWnd = m_WndHandle;
        m_tray_nid.uID =  9935;
        m_tray_nid.hIcon = m_hIcon;
        m_tray_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
        m_tray_nid.uCallbackMessage = WM_LBUTTONDOWN;
        sprintf(m_tray_nid.szTip, "title");
    ShowWindow(SW_HIDE);
        Shell_NotifyIcon(NIM_ADD, &m_tray_nid);
      

  5.   

    访问系统托盘的方法是通过Shell_NotifyIcon函数和NOTIFYICONDATA结构实现的。 typedef struct _NOTIFYICONDATA {   DWORD cbSize;
       HWND hWnd;
       UINT uID;
       UINT uFlags;
       UINT uCallbackMessage;
       HICON hIcon;
       TCHAR szTip[64];
       DWORD dwState;         //Version 5.0
       DWORD dwStateMask;     //Version 5.0
       TCHAR szInfo[256];     //Version 5.0
       UINT uTimeout;         //Version 5.0
       TCHAR szInfoTitle[64]; //Version 5.0
       DWORD dwInfoFlags;     //Version 5.0
    } NOTIFYICONDATA, *PNOTIFYICONDATA; 
    为了要在系统托盘中显示图标,用NIM_ADD标志调用Shell_NotifyIcon函数。 
    #define ID_TASKBARICON 100
    #define WM_ICONNOTIFY           (WM_USER + 101)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 = LoadImage(hInst, MAKEINTRESOURCE(IDI_TRAY1), IMAGE_ICON, 16, 16, 0);
    strcpy(nid.szTip, "My Tooltip Text");
    Shell_NotifyIcon(NIM_ADD, &nid);
    cbSize成员是结构的大小(使用它主要是为了支持将来这个结构大小增加)。
        hWnd是窗口句柄。当图标发生某事件时(如单击、双击等),Windows将向窗口发送uCallbackMessage成员指定的消息。uID成员指定与图标关联的ID。它不是很重要,除非你需要显示并跟踪几个图标。
        uFlag成员告诉Windows应该读取哪个成员。当添加一个图标时,应该包含这个结构的大多数成员。当更新图标时,如只是需要改变图标时,你只要设置相应
    的标志就可以了。    hIcon成员是你想显示的图标。
        最后,szTip成员是提示文本。设置好这些结构成员后,调用Shell_NotifyIcon函数。    当与图标关联的事件发生时,Windows将发送uCallbackMessage成员指定的消息。IParam包含发送的消息。当获得WM_LBUTTONDBLCLK消息时显示主窗口
    或者启动主程序。当获得WM_RBUTTONUP消息时显示菜单。
      

  6.   

    to:Jasanye
    我也是利用托盘类,但在托盘图标上添架右键响应菜单时有问题如下:
    在任务栏托盘区,添加程序的右键弹出菜单
    HMENU hMenu=LoadMenu(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_POP));
    HMENU hSub=GetSubMenu(hMenu,0);
    SetForegroundWindow();
    POINT pt;
    GetCursorPos(&pt);
    DWORD dwID=TrackPopupMenu(hSub,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD,pt.x,pt.y,0,m_hWnd,0);
    可是弹出的并不是我在IDR_POP中设计的菜单,而是其最大化时的第一列菜单也就是IDR_MAINFRAME的菜单项。
    不知何故?
      

  7.   

    这是头文件,下一贴是cpp文件,你只需要调用Init(),并传递你的对话框句柄,你可以设置Tips,右键菜单等,程序退出时,请调用ShutDown()方法。#if !defined(AFX_SYSTEMTRAY_H__B7554C6A_BE23_46CD_9D39_C3F5A39786D7__INCLUDED_)
    #define AFX_SYSTEMTRAY_H__B7554C6A_BE23_46CD_9D39_C3F5A39786D7__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000LRESULT IconDrawItem( LPDRAWITEMSTRUCT lpdi );
    BOOL TrayMessage( DWORD dwMessage );
    BOOL CALLBACK SystemTrayProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );class CSystemTray  
    {
    public:
    void SetDblClkActive( BOOL bValue );
    void ShutDown();
    BOOL Init( HWND hMainWnd );
    BOOL SetTips( LPCTSTR strTips );
    void ShowApp( BOOL bShow );
    void SetIcon( UINT IconID );
    void SetPopmenuID( UINT PopmenuID ); CSystemTray();
    virtual ~CSystemTray();
    };#endif // !defined(AFX_SYSTEMTRAY_H__B7554C6A_BE23_46CD_9D39_C3F5A39786D7__INCLUDED_)
      

  8.   

    // SystemTray.cpp: implementation of the CSystemTray class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "SystemTray.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif#define   GET_WM_COMMAND_ID(wp, lp)               LOWORD(wp)
    #define   MYWM_NOTIFYICON                         (WM_APP+100)
    #define   ICONID                                  35 //任意值WNDPROC gOldDlgProc = NULL;
    BOOL m_bInited = FALSE;
    UINT m_PopmenuID = 0;  //关联菜单ID
    BOOL m_gbDblClkActive = TRUE;UINT m_IconID = 0;     //图标
    CString m_strTips;
    HWND m_hMainWnd = NULL;
    CSystemTray::CSystemTray()
    {
    m_strTips = AfxGetApp()->m_pszAppName;
    }CSystemTray::~CSystemTray()
    {
    }void CSystemTray::SetDblClkActive( BOOL bValue )
    {
    m_gbDblClkActive = bValue;
    }BOOL CSystemTray::SetTips( LPCTSTR strTips )
    {
    if( lstrlen( strTips ) > 63 ) return FALSE;
    m_strTips = strTips;
    m_strTips.FreeExtra();
    if( m_bInited )
    TrayMessage( NIM_MODIFY );
    return TRUE;
    }void CSystemTray::ShowApp( BOOL bShow )
    {
    ASSERT( m_hMainWnd );
    if( bShow )
    {
    ShowWindow( m_hMainWnd, SW_SHOWNORMAL );
    SetForegroundWindow( m_hMainWnd ); // make us come to the front
    }
    else
    ShowWindow( m_hMainWnd, SW_HIDE );
    }void CSystemTray::SetIcon( UINT IconID  )
    {
    m_IconID = IconID;
    if( m_bInited )
    TrayMessage( NIM_MODIFY );
    }void CSystemTray::SetPopmenuID( UINT PopmenuID )
    {
    ASSERT( PopmenuID>0 );
    m_PopmenuID = PopmenuID;
    }BOOL TrayMessage( DWORD dwMessage )
    {
        BOOL res;
    NOTIFYICONDATA tnd;
    HICON hIcon = NULL;
    if( m_IconID )
    {
    hIcon = AfxGetApp()->LoadIcon( m_IconID );
    if( !hIcon ) return FALSE;
    }
    tnd.cbSize = sizeof(NOTIFYICONDATA);
    tnd.hWnd = m_hMainWnd;
    tnd.uID = ICONID;
    tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
    tnd.uCallbackMessage = MYWM_NOTIFYICON;
    tnd.hIcon = hIcon;
    if( m_strTips.IsEmpty() )
    tnd.szTip[0] = '\0';
    else
    lstrcpy( tnd.szTip, m_strTips ); res = Shell_NotifyIcon( dwMessage, &tnd );
    if( hIcon )
        DestroyIcon( hIcon );
    return res;
    }BOOL CSystemTray::Init( HWND hMainWnd )  //本函数需要在窗口的WM_CREATE或者WM_INITDIALOG被调用
    {
    if( m_bInited ) ShutDown();
    m_hMainWnd = hMainWnd;#ifdef _DEBUG
    if( !IsWindow( m_hMainWnd ) )
    AfxMessageBox( "CSystemTray::Init()函数应该在窗口的创\n建或者初始化时调用!" );
    ASSERT( IsWindow( m_hMainWnd ) );
    #endif if( m_hMainWnd == NULL ) return FALSE;
    if( gOldDlgProc == NULL )
    {
    gOldDlgProc = (WNDPROC)SetWindowLong( m_hMainWnd, DWL_DLGPROC, (LONG)SystemTrayProc );
    if( gOldDlgProc == NULL )
    gOldDlgProc = (WNDPROC)SetWindowLong( m_hMainWnd, GWL_WNDPROC, (LONG)SystemTrayProc );
    }
    m_bInited =  TrayMessage( NIM_ADD );
    return m_bInited;
    }void CSystemTray::ShutDown()
    {
    ASSERT( m_hMainWnd );
    if( m_bInited )
    {
    TrayMessage( NIM_DELETE );
    m_bInited = FALSE;
    }
    if( gOldDlgProc )
    {
    LONG dlgProc = SetWindowLong( m_hMainWnd, DWL_DLGPROC, (LONG)gOldDlgProc );
    if( dlgProc == 0 )
    SetWindowLong( m_hMainWnd, GWL_WNDPROC, (LONG)gOldDlgProc );
    }
    }LRESULT IconDrawItem( LPDRAWITEMSTRUCT lpdi )
    {
    HICON hIcon = AfxGetApp()->LoadIcon( lpdi->CtlID );
    if( !hIcon ) return FALSE;
    DrawIconEx( lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top, hIcon,
    16, 16, 0, NULL, DI_NORMAL ); //此处是否需要删除hIcon
    return TRUE;
    }
    BOOL CALLBACK SystemTrayProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    switch( uMsg )
    {
    case WM_DRAWITEM:
    IconDrawItem( (LPDRAWITEMSTRUCT)lParam );
    break;
    case WM_DESTROY:
    if( m_bInited )
    TrayMessage( NIM_DELETE );
    break;
    case WM_SIZE:
    if( wParam == SIZE_MINIMIZED )
    ShowWindow( hWnd, SW_HIDE );
    break;
    case MYWM_NOTIFYICON:
    switch( lParam )
    {
    case WM_LBUTTONDBLCLK:
    if( m_gbDblClkActive )
    {
    ShowWindow( hWnd, SW_SHOWNORMAL );
    SetForegroundWindow( hWnd );
    #ifdef _DEBUG
    PostMessage( hWnd, WM_USER+26, 0, 0 );
    #endif
    }
    break;
    case WM_RBUTTONDOWN:
    if( m_PopmenuID )
    {
    CMenu menu;
    CMenu* pPopup;
    VERIFY(menu.LoadMenu(m_PopmenuID));
    pPopup = menu.GetSubMenu(0);
    ASSERT( pPopup != NULL ); //::SetMenuDefaultItem( pPopup->m_hMenu, 0, TRUE );
    CPoint pos;
    GetCursorPos(&pos);
    ::SetForegroundWindow( hWnd );
    TrackPopupMenu( pPopup->m_hMenu, 0,
    pos.x, pos.y, 0, hWnd, NULL );
    }
    default:
    break;
    }
    default:
    break;
    }
    return CallWindowProc( gOldDlgProc, hWnd, uMsg, wParam, lParam );
    }