兄弟姐妹,我想在状态上显示一个图标,该怎么做呢

解决方案 »

  1.   

    先在在头文件中定义 
    NOTIFYICONDATA m_trayData;
    const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(_T("TaskbarCreated"));
    #define WM_TRAY_NOTIFICATION  WM_USER + 2000 /* 添加图标到任务栏
    */
    memset(&m_trayData, 0, sizeof(m_trayData));
    m_trayData.cbSize = sizeof(m_trayData);
    m_trayData.hWnd = GetSafeHwnd();
    m_trayData.uID = IDR_TRAY;
    m_trayData.uFlags = NIF_ICON | NIF_MESSAGE;
    m_trayData.uCallbackMessage = WM_TRAY_NOTIFICATION;
    m_trayData.hIcon = AfxGetApp()->LoadIcon(IDI_CLUB);
    CString strTrayTip;
    strTrayTip.LoadString(IDI_CLUB);
    if (!strTrayTip.IsEmpty())
    {
    #if (_WIN32_IE < 0x0500)
        #define MAX_TIP 64
    #else
    #define MAX_TIP 128
    #endif
    if (strTrayTip.GetLength() > MAX_TIP)
    {
    strTrayTip = strTrayTip.Left(MAX_TIP);
    }
    m_trayData.uFlags |= NIF_TIP;
    memcpy(&m_trayData.szTip, strTrayTip, strTrayTip.GetLength());
    }
    Shell_NotifyIcon(NIM_ADD, &m_trayData);// 消息定义
    ON_MESSAGE(WM_TRAY_NOTIFICATION, OnTrayNotification)
    // 状态栏消息响应
    LRESULT CMainFrame::OnTrayNotification(WPARAM uID, LPARAM lEvent)
    {
    if (uID == IDR_TRAY)
    {
    switch (lEvent)
    {
    case WM_RBUTTONUP:
    {
    CMenu menu;

    if (menu.LoadMenu(IDR_TRAY))
    {
    CMenu* pSubMenu = menu.GetSubMenu(0);
    CPoint ptMouse;
    GetCursorPos(&ptMouse);
    SetForegroundWindow();
    TrackPopupMenu(pSubMenu->m_hMenu, 0, ptMouse.x, ptMouse.y, 0, m_hWnd, NULL);
    }
    }
    break;
    case WM_LBUTTONDOWN:
    case WM_LBUTTONDBLCLK:
    {
    if (IsWindowVisible())
    {
    OnAppMin();
    }
    else
    {
    OnShowMainwnd();
    }
    }
    break;
    default:
    break;
    }
    }
    return 0;
    }
      

  2.   

    在消息定义中加入
    ON_REGISTERED_MESSAGE(WM_TASKBARCREATED, OnTaskBarCreated)
    // TASKBARCREATED 消息的作用是:当EXPOLORER程序出错时,系统会自动再创建一个EXPOLORER,如果你不响应这个消息,你的图标,就从状态栏消失了。。响应函数如下
    LRESULT CMainFrame::OnTaskBarCreated(WPARAM uID, LPARAM lParam)
    {
    Shell_NotifyIcon(NIM_ADD, &m_trayData);
    return 0;
    }
      

  3.   

    你这是在任务栏上显示托盘图标吧,我想在窗口的任务条上(w_wndStatusBar)上显示一个图标,该怎么做呢??
      

  4.   

    最简单的方法:
    在 OnSize()里
    {
    CDC* pDC = GetWindowDC(..);
    计算相对位置然后:
    pDC->DrawIcon(..);
    }
      

  5.   

    既然状态栏是个window,那就这样:
    HDC hDc = ::GetDC(w_wndStatusBar);
    CDC dc;
    dc.Attach(hDc);
    dc.DrawIcon(..);