一点击最小化图标,就变成右下角的一个小图标

如 何 在 任 务 栏 上 显 示 图 标 

---- Windows95/WindowNT 任 务 栏 的 右 边 是 一 状 态 区,Windows95/WindowsNT 在 其 上 显 示 时 间 和 一 些 小 图 标, 这 些 图 标 代 表 着 特 定 的 功 能 或 程 序, 用 鼠 标 单 击、 右 击 或 双 击 这 些 图 标, 就 会 弹 出 功 能 菜 单 或 程 序 窗 口 等。 如 你 用 过 金 山 词 霸 或 超 级 解 霸, 你 会 觉 得 这 些 图 标 使 软 件 用 起 来 很 方 便。 你 也 许 想 把 自 己 的 程 序 图 标 也 放 在 任 务 栏 的 状 态 区 上, 很 简 单,Visual C++ 5.0 提 供 了 一 个 函 数, 让 你 很 容 易 地 实 现 该 功 能。 

---- Visual C++ 提 供 的 函 数 是Shell_NotifyIcon(), 该 函 数 发 送 消 息 给 系 统 在 任 务 栏 的 状 态 区 增 加、 删 除 或 修 改 图 标。Shell_NotifyIcon() 有 两 个 参 数: 

---- 1 . DWORD dwMessage 

---- 消 息 标 志 值, 为 以 下 三 个 中 之 一: 

NIM_ADD  在任务栏状态区增加图标
NIM_DELETE从任务栏状态区删除图标
NIM_MODITY修改任务栏状态区的图标

---- 2 . PNOTIFYICONDATA pnid 

---- 指 向NOTIFYICONDATA 结 构 的 指 针。NOTIFYICONDATA 结 构 如 下: 

typedef struct _NOTIFYICONDATA { // nid
DWORD cbSize; // NOTIFYICONDATA结构的大小
HWND hWnd; //接收回调消息的窗口句柄
UINT uID;  //自定义的图标标志值
UINT uFlags; //标志后面的三个数据成员哪个有效,
//可由NIF_ICON,NIF_MESSAGE和NIF_TIP组合。
UINT uCallbackMessage;  //回调消息
HICON hIcon;  //图标句柄
char szTip[64];  //提示字符。当把鼠标移到任务栏
              //状态区该图标上时,系统显示该字符
      } NOTIFYICONDATA, *PNOTIFYICONDATA;

---- 以 下 举 例 如 何 在 任 务 栏 状 态 区 实 现 程 序 图 标 及 其 功 能。 

---- 1. 首 先 生 成 一 个 单 文 档 的 工 程 文 件。 

---- 2. 在StdAfx.h 添 加 自 定 义 的 消 息: 

//回调消息
#define MYWM_NOTIFYICON  WM_USER+1
//在任务栏状态区显示图标的消息
#define MYWM_SHOWAPPICONIC  WM_USER+2

---- 3. 在MainFrm.h 里 添 加 定 义 消 息 处 理 函 数 说 明, 该 部 分 看 起 来 如 下: 

protected:
//{{AFX_MSG(CMainFrame)
afx_msg void OnSysCommand( UINT nID, LPARAM lParam ); 
// 手 工 加
afx_msg void OnMyIconNotify( WPARAM wParam, LPARAM lParam ); 
// 手 工 加
afx_msg void OnShowAppIconic( WPARAM wParam, LPARAM lParam ); 
// 手 工 加
afx_msg void OnClose(); 
// 系 统 生 成
//}}AFX_MSG

DECLARE_MESSAGE_MAP()

---- 另 外, 需 在MainFrm.h 定 义 一 开 关 值, 记 录 程 序 窗 口 是 打 开 或 关 闭 状 态: 

BOOL boolWndHadShow;

---- 4. 在MainFrm.cpp 里 实 现 消 息 映 射 和 消 息 处 理 函 数。 消 息 映 射 部 分 看 起 来 如 下: 

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_MESSAGE(MYWM_NOTIFYICON, OnMyIconNotify)
    ON_MESSAGE(MYWM_SHOWAPPICONIC, OnShowAppIconic)
    ON_WM_SYSCOMMAND()
    ON_WM_CLOSE()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

---- 消 息 处 理 及 相 关 函 数 如 下 所 示: 

//在任务栏状态区添加图标
BOOL MyTaskBarAddIcon(HWND hwnd, 
UINT uID, HICON hicon, LPSTR lpszTip) 

    BOOL res; 
    NOTIFYICONDATA tnid; 
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = hwnd; 
    tnid.uID = uID;    
    tnid.uFlags = NIF_ICON ¦ NIF_TIP ¦ NIF_MESSAGE; 
    tnid.uCallbackMessage = MYWM_NOTIFYICON; 
    tnid.hIcon = hicon; 
    if (lpszTip) 
lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip)); 
    else        
        tnid.szTip[0] = '\0';  
    res = Shell_NotifyIcon(NIM_ADD, &tnid); 
    if (hicon) 
        DestroyIcon(hicon); 
    return res; 


//从任务栏状态区删除图标
BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) 
{    
    BOOL res; 
    NOTIFYICONDATA tnid; 
    tnid.cbSize = sizeof(NOTIFYICONDATA); 
    tnid.hWnd = hwnd;
    tnid.uID = uID; 
    res = Shell_NotifyIcon(NIM_DELETE, &tnid); 
    return res; 
}  

//处理图标回调消息MYWM_NOTIFYICON
void CMainFrame::OnMyIconNotify
( WPARAM wParam, LPARAM lParam )
{
    UINT nID;
    UINT uMouseMsg; 
    nID = (UINT)wParam;
    uMouseMsg = (UINT) lParam; 
    if (uMouseMsg == WM_LBUTTONDOWN) //点击图标
    { 
        if ( boolWndHadShow )  //如果窗口已打开,隐藏窗口
            ShowWindow( SW_HIDE );
        else              //否则,显示窗口
            ShowWindow( SW_SHOWNORMAL );
        boolWndHadShow = ~boolWndHadShow;
    }
}

//消息MYWM_SHOWAPPICONIC
处理函数,在任务栏显示图标并隐藏窗口
void CMainFrame::OnShowAppIconic
( WPARAM wParam, LPARAM lParam )
{
HICON theIcon = LoadIcon(AfxGetInstanceHandle(), 
MAKEINTRESOURCE(IDR_MAINFRAME) );
MyTaskBarAddIcon(GetSafeHwnd(), 100, theIcon, _T("示范程序"));
ShowWindow( SW_HIDE );
boolWndHadShow = FALSE;
}

---- 当 程 序 关 闭 时, 需 把 图 标 从 任 务 样 状 态 区 删 除, 你 可 以 添 加 一 个 处 理WM_CLOSE 消 息 的 函 数 来 删 除 图 标。 通 过ClassWizard 来 添 加 处 理WM_CLOSE 的 函 数OnClose(), 该 函 数 如 下: 

void CMainFrame::OnClose() 
{
    // TODO: Add your message handler 
    code here and/or call default
    MyTaskBarDeleteIcon( GetSafeHwnd(), 100 );
    CFrameWnd::OnClose();
}

---- 当 用 户 把 窗 口 最 小 化 时, 你 应 隐 藏 整 个 窗 口, 所 以 要 处 理ON_SYSCOMMAND 消 息。 首 先 在MainFrm.h 添 加 函 数 说 明, 如 第3 步 所 示; 然 后 在MainFrm.cpp 里 说 明 消 息 映 射 和 实 现 函 数。 消 息 映 射 如 前 面 所 示, 函 数 实 现 如 下: 

void CMainFrame::OnSysCommand
( UINT nID, LPARAM lParam )
{
    if ( nID==SC_MINIMIZE  )
    {
        ShowWindow( SW_HIDE );
        boolWndHadShow = FALSE;
    }
    else
        CWnd::OnSysCommand( nID, lParam );
}

---- 5. 在InitInstance() 函 数 返 回 前, 添 加 一 语 句 

        m_pMainWnd- >PostMessage( MYWM_SHOWAPPICONIC );

---- 它 是 发 送 一 个 自 定 义 的 消 息MYWM_SHOWAPPICONIC 使 程 序 启 动 后 隐 藏 程 序 窗 口 并 在 任 务 栏 状 态 区 显 示 小 图 标。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Electron应用程序最小化右下角,可以使用Electron的Tray模块和自定义的系统托盘菜单。以下是一个实现的方法: 1. 首先,在main.js文件中添加以下代码引入Tray模块并创建一个Tray对象: ```javascript const { app, BrowserWindow, Tray, Menu } = require('electron'); const path = require('path'); let tray = null; ``` 2. 然后,在createWindow函数中添加以下代码,创建系统托盘菜单: ```javascript function createWindow() { // 创建窗口... // 创建系统托盘图标 tray = new Tray(path.join(__dirname, 'path/to/icon.png')); // 创建系统托盘菜单 const contextMenu = Menu.buildFromTemplate([ { label: '打开应用', click: () => { win.show(); } }, { label: '最小化右下角', click: () => { win.hide(); } }, { label: '退出', click: () => { app.quit(); } } ]); // 设置系统托盘菜单 tray.setContextMenu(contextMenu); // 点击系统托盘图标时显示窗口 tray.on('click', () => { win.show(); }); } ``` 3. 最后,在应用程序的ready事件监听器中添加以下代码,隐藏默认的Dock图标,并使应用程序在所有窗口关闭时保持运行: ```javascript app.dock.hide(); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); ``` 这样,当你运行Electron应用程序时,你将看到一个系统托盘图标。通过右键单击图标,你可以打开应用、最小化右下角或退出应用。通过点击图标,你可以恢复应用程序窗口的显示。 参考了中的Electron无边框窗口原型和核心代码。希望对你有所帮助!<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [Electron无边框窗口最小化、最大化、关闭、拖动)以及动态改变窗口大小](https://download.csdn.net/download/fukaiit/11232180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【Electron】Electron 系统托盘图标/任务通知栏图标/右下角图标](https://blog.csdn.net/yu17310133443/article/details/79538334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值