MFC小さなノート:達成するために、システムトレイ

まず、需要

紙は、システムトレイにプログラムを実装します。

第二に、インタフェース

主なインタフェースは、最小化、最大化、その他の機能を閉じると、ダイアログです。

第三に、原則

クラスは、トレイマウスイベントを処理し、NOTIFYICONDATAシステムトレイ、カスタム応答メッセージを使用して。

第四に、コーディング

4.1メッセージ定義

WM_USERの定義されたメッセージIDは、便宜上、STDAFX.Hで定義することができ、よりも大きくなければなりません。

#define WM_SHOWTASK (WM_USER+1)  // 系统托盘事件

ダイアログヘッダーファイルにメッセージ応答関数を宣言する。

    afx_msg LRESULT OnSystemtray(WPARAM wParam, LPARAM lParam);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnDestroy();
    

ダイアログ実装ファイルでは、応答関数に関連したメッ​​セージを追加します。

BEGIN_MESSAGE_MAP(CMyTestDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    // ...
    ON_MESSAGE(WM_SHOWTASK, OnSystemtray) // 托盘
    ON_WM_SIZE()
    ON_WM_DESTROY() // 销毁
END_MESSAGE_MAP()

4.2変数宣言

クラスで宣言

private: 
    NOTIFYICONDATA m_nid;
    BOOL m_fMainWinShow; // 托盘 双击左键显示/隐藏窗口

4.3初期化

初期化するためのOnInitDialog関数で:

// 系统托盘
        m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
        m_nid.hWnd = this->m_hWnd;
        m_nid.uID = IDR_MAINFRAME;
        m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
        m_nid.uCallbackMessage = WM_SHOWTASK; // 自定义的消息名称
        m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
        wcscpy_s(m_nid.szTip, L"主程序"); // 提示程序名称
        Shell_NotifyIcon(NIM_ADD, &m_nid); // 在托盘区添加图标

// 如此实现,任务栏没有图标,但窗口没有最小化按钮
#if 0
//ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); // 不在任务栏中显示
// ShowWindow(SW_MINIMIZE);
#endif
        //ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); // 不在任务栏中显示

        // 可以实现,但界面会闪烁
        ShowWindow(SW_MINIMIZE); // 不能使用SW_HIDE
        PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);

        m_fMainWinShow = FALSE;

同じ文書は、右マウスの左ボタンを取り扱う含む応答WM_SHOWTASKメッセージを、実装します。

LRESULT CMyTestDlg::OnSystemtray(WPARAM wParam, LPARAM lParam)
{
    if (wParam != IDR_MAINFRAME)
        return 1;
    switch (lParam)
    {
    case WM_RBUTTONUP: // 右键起来时弹出菜单
    {
        LPPOINT lpoint = new tagPOINT;
        GetCursorPos(lpoint); // 得到鼠标位置
        CMenu menu;
        menu.CreatePopupMenu(); // 声明一个弹出式菜单
        menu.AppendMenu(MF_STRING, WM_DESTROY, L"退出");
        SetForegroundWindow();
        menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);
        HMENU hmenu = menu.Detach();
        menu.DestroyMenu();
        delete lpoint;
    }
    break;
    case WM_LBUTTONDBLCLK: // 双击左键的处理
    {
        if (!m_fMainWinShow)
        {
            ShowWindow(SW_SHOWNORMAL); // 显示主窗口
            SetForegroundWindow();
            m_fMainWinShow = TRUE;
        }
        else
        {
            ShowWindow(SW_HIDE); // 隐藏主窗口
            SetForegroundWindow();
            m_fMainWinShow = FALSE;
        }
    }
    break;
    }
    return 0;
}

4.4応答最小化されたウィンドウのイベントを破棄


void CMyTestDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialogEx::OnSize(nType, cx, cy);

    if (nType == SIZE_MINIMIZED)
    {
        ShowWindow(SW_HIDE); // 当最小化时,隐藏主窗口
    }
}

void CMyTestDlg::OnDestroy()
{
    CDialogEx::OnDestroy();

    // 在托盘区删除图标
    Shell_NotifyIcon(NIM_DELETE, &m_nid);
}

本稿では、システムトレイ、右のみ「終了」オプションを適宜添加することができる実装しました。
インスタントのために最小化さ点滅ウィンドウを起動するときに、さらに、許容される範囲で、それが解決されていません。

公開された481元の記事 ウォンの賞賛244 ビュー110万+

おすすめ

転載: blog.csdn.net/subfate/article/details/103651171