关于在MFC中将窗口最小化到托盘实现原理及操作步骤_C 语言

步骤/方法
(一) 原理
1、最小化的原理:首先要将窗口隐藏,然后在右下角绘制图标。
2、恢复的原理:将窗口显示,再将托盘中的图片删除。

(二)程序实现
1、自定义消息WM_SHOWTASK:
#define WM_SHOWTASK (WM_USER +1)
2、在MFC的
::OnSysCommand(UINT nID, LPARAM lParam) 函数体中增加一个命令响应
if(nID==SC_MINIMIZE)
ToTray(); //最小化到托盘的函数
3、在消息映射中添加
ON_MESSAGE(WM_SHOWTASK,OnShowTask); //其中WM_SHOWTASK是消息名,
OnShowTask是自己定义的消息响应函数,后面有说明。

(三)具体函数内容
1、最小化到托盘函数

复制代码 代码如下:

void CMyDlg::ToTray()
{
NOTIFYICONDATA nid;
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"程序名称"); //信息提示条
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口
}

2、恢复界面函数
在头文件中定义消息响应函数

复制代码 代码如下:

afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
LRESULT CMyDlg::OnShowTask(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,"关闭"); //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //确定弹出式菜单的位置
HMENU hmenu=menu.Detach();
menu.DestroyMenu(); //资源回收
delete lpoint;
} break;
case WM_LBUTTONDBLCLK: //双击左键的处理
{
this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿
DeleteTray();
} break;
default: break;
}
return 0;
}

删除托盘图标函数

复制代码 代码如下:

void CMyDlg::DeleteTray()
{
NOTIFYICONDATA nid;
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
nid.uCallbackMessage=WM_SHOWTASK; //自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"程序名称"); //信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_DELETE,&nid); //在托盘区删除图标
}

时间: 2024-10-31 18:44:54

关于在MFC中将窗口最小化到托盘实现原理及操作步骤_C 语言的相关文章

窗口最小化到托盘

使用notifyIcon控件和contextMenuStrip控件实现 1.将notifyIcon控件和contextMenuStrip控件拖到form上 2.在FORM的FormClosing事件 // 取消关闭窗体 e.Cancel = true; // 将窗体变为最小化 this.WindowState = FormWindowState.Minimized; this.ShowInTaskbar = false; //不显示在系统任务栏 notifyIcon1.Visible = tru

dockablepane-mfc mdi窗口最小化状态恢复后没有自动刷新

问题描述 mfc mdi窗口最小化状态恢复后没有自动刷新 程序刚运行时的界面 最小化恢复以后界面 可能是垂直工具条加上以后导致的,之前好像没有这种情况 垂直工具条时用CDockablePane里面嵌一个CMFCToolbar做的,代码为 #include "stdafx.h" #include "ToolboxPane.h" #include "resource.h" CToolboxPane::CToolboxPane(void) { } CT

各种窗口最小化快捷键详解

  一.ALT+Esc 可以使当前窗口最小化. 二.Win+D 最小化所有窗口,再按一下就可以还原窗口. 三.Windows+M 最小化所有窗口 . 四.Windows+Shift+M 还原最小化的窗口. 五.Alt+空格+N 最小化当前窗口(和浏览器的最小化一样) 六.ALT+TAB 这个是切换窗口的按钮,切换到另外一个窗口,这个窗口自然也可以最小化.

.net 主窗口最小化后屏幕区域出现影像错乱

问题描述 .net 主窗口最小化后屏幕区域出现影像错乱 用vb.net写了一个监控程序,在tablelayoutpanel 中加入了多个模块化的自定义控件,自定义控件带有timer定时刷新,平时最大化应用没出现过什么问题,但是当有其他窗口覆盖或者当该程序最小化之后,原来的自定义控件区域(此时该区域应该不存在焦点之类的问题)就会出现匪夷所思的影像错乱,若果点击该区域的图标位置也会出现失焦. 如图,此时监控程序最小化,同时打开我的文档(为当前活动窗口),黑块部分是原监控程序最大化时tablelayo

C#窗口最小化后还原窗口时TableLayoutPanel画屏

问题描述 如题所示,C#窗口最小化后还原窗口时TableLayoutPanel里面所有的东西都花了盼望大神指点. 解决方案 解决方案二:自己顶一下,求大神指点解决方案三:控件放多了吧.导至刷不过来了.解决方案四:如图所示,就那么几个,不至于太多吧最下面那个表格还是另一个自定义空间呢解决方案五:什么花?是闪烁吗?http://www.cnblogs.com/wuhenke/archive/2012/09/26/2704081.html解决方案六:引用4楼ajianchina的回复: 什么花?是闪烁

关于窗口最小化后、还原的问题

问题描述 需求:我自己写的一个程序(暂且叫From1),来调用第三方程序(aaa.exe)第三方程序的主画面的某个button按下后会呼出一个popUp画面,此时主画面关闭,只剩下popUp画面.然后popUp画面上按下最小化按钮.此时,在任务栏上有个矩形的"图标按钮"(别理解错了,不是指托盘图标).问题:在我的程序上怎么实现,让这个第三方程序的popUp画面显示成最小化按钮按下前popUp画面显示的状态.这里有个神奇的现象,如果你按任务栏上的"图标按钮"进行最小化

c# richtextbox 在窗口最小化后,最大化后数据不显示

问题描述 看上图,c#写的Activex控件,继承子userContrl类.在1图上赋值后都能显示,但是我把窗口最小化,在最大化后richtextbox数据就不显示了,需要用鼠标在里面选中才能显示数据.还有我把窗口左移出桌面也是相同状况,我重写了一下onPaint()函数就可以了protectedoverridevoidOnPaint(PaintEventArgse){this.richTextBox1.Invalidate();base.OnPaint(e);}但是现在最小化,在最大化还是不行

VC 制作系统托盘程序实现将窗口最小化到系统托盘

VC 制作系统托盘程序实现将窗口最小化到系统托盘 2008年01月11日 星期五 10:24 前段时间因为要用到系统拖盘,所以研究了一下,在这里记录一下,免得以后忘了 ^_^先在类中定义一个结构变量NOTIFYICONDATA pnid;然后在OnInitDialog进行初始化    pnid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//该结构体大小    pnid.hWnd=m_hWnd;    //窗口句柄    pnid.uID=(UINT)m_hIcon

C#实现窗口最小化到系统托盘

关键字:C# 最小化 托盘原文:http://www.cnblogs.com/txw1958/archive/2012/12/17/csharp-minimize-tray.html 先添加notifyicon控件notifyIcon1   using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Syste