MFC对话框最小化到托盘编程实现步骤

以工程为例说明过程:此程序编程环境是VS2008,在调试过程中,将字符集修改为“使用多字节字符集”(项目->属性->配置属性->字符集)。

例如新建一个MFC对话框工程Dialogtest,程序实现的功能是,修改对话框标题栏上默认的图标,在程序中改为添加的资源Icon IDI_ICON1,最小化对话框到托盘。

首先,在对话框资源属性页,选择Minimize Box为TRUE。这样可以实现对话框的最小化,但是这时最小化到了任务栏,为了使其最小化到托盘,还必须添加一些代码,步骤如下:

首先添加变量NOTIFYICONDATA m_nid;//NOTIFYICONDATA作用是用来向任务栏托盘区域发送消息和自定义消息响应函数OnShowTask ,自定义消息响应函数主要是添加三处代码:

1)头文件中声明部分添加#define WM_SHOWTASK WM_USER+1,代码部分添加afx_msg LRESULT OnShowTask(WPARAMwParam,LPARAM lParam);

2)在源程序中添加:BEGIN_MESSAGE_MAP(CDialogtestDlg, CDialog)

 ON_WM_SYSCOMMAND()

 ON_WM_PAINT()

 ON_WM_QUERYDRAGICON()



 //}}AFX_MSG_MAP

 ON_MESSAGE(WM_SHOWTASK,OnShowTask)//此处为添加部分

END_MESSAGE_MAP()

3)源程序中的响应函数代码

在本实现中源程序中总共添加了五处代码:(红色为添加的代码)

1、修改图标资源:

CDialogtestDlg::CDialogtestDlg(CWndpParent /=NULL*/)

 :CDialog(CDialogtestDlg::IDD, pParent)

{

 //m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);// IDR_MAINFRAME为系统默认

 m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);

}

2、同上自定义消息2

BEGIN_MESSAGE_MAP(CDialogtestDlg,CDialog)

 ON_WM_SYSCOMMAND()

 ON_WM_PAINT()

 ON_WM_QUERYDRAGICON()



 //}}AFX_MSG_MAP

 ON_MESSAGE(WM_SHOWTASK,OnShowTask)

 ON_WM_SIZE()//为了隐藏最小化到任务栏的图标而添加的消息响应函数,这个函数系统自带直接添加

END_MESSAGE_MAP()

3、修改对话框标题栏图标并在托盘区添加图标:

BOOL CDialogtestDlg::OnInitDialog()

{

 CDialog::OnInitDialog();



 // 将“关于...”菜单项添加到系统菜单中。



 // IDM_ABOUTBOX 必须在系统命令范围内。

 ASSERT((IDM_ABOUTBOX& 0xFFF0) == IDM_ABOUTBOX);

 ASSERT(IDM_ABOUTBOX< 0xF000);



 CMenu* pSysMenu= GetSystemMenu(FALSE);

 if (pSysMenu != NULL)

 {

     CString strAboutMenu;

     strAboutMenu.LoadString(IDS_ABOUTBOX);

     if (!strAboutMenu.IsEmpty())

     {

          pSysMenu->AppendMenu(MF_SEPARATOR);

          pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,strAboutMenu);

     }

 }



 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

 //  执行此操作

 SetIcon(m_hIcon,TRUE);          // 设置大图标

 SetIcon(m_hIcon,FALSE);         // 设置小图标

 // TODO: 在此添加额外的初始化代码

 m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);

 m_nid.hWnd = this->m_hWnd;

 m_nid.uID = IDI_ICON1;

 m_nid.uFlags = NIF_ICON|NIF_MESSAGE |NIF_TIP;

 m_nid.uCallbackMessage = WM_SHOWTASK;

 m_nid.hIcon   = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

 strcpy_s(m_nid.szTip,strlen("对话框")+1,"对话框");

 Shell_NotifyIcon(NIM_ADD,&m_nid); // 在托盘区添加图标

 return TRUE;  // 除非将焦点设置到控件,否则返回TRUE

}

4、自定义的消息响应函数代码:

LRESULT CDialogtestDlg::OnShowTask(WPARAMwParam, LPARAM lParam)

{

 if(wParam != IDI_ICON1) return 1;



 switch(lParam)

 {

 case WM_RBUTTONUP:               //右键起来时弹出菜单

     {

          LPPOINT lpoint = new tagPOINT;

          ::GetCursorPos(lpoint);                    // 得到鼠标位置

          CMenu menu;

          menu.CreatePopupMenu();                    // 声明一个弹出式菜单

          menu.AppendMenu(MF_STRING, WM_DESTROY, "退出");//Appends a new item to the end ofthis menu

          //Displays a floating pop-up menu at the specifiedlocation and tracks the selection of items on the pop-up menu

          menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y,this);

          HMENU hmenu = menu.Detach();

          menu.DestroyMenu();

          delete lpoint;

          break;

     }

 case WM_LBUTTONDBLCLK:                            // 双击左键的处理

     this->ShowWindow(SW_SHOWNORMAL);         // 显示主窗口 

     break;

 }



 return 0;

}

5、处理最小化时任务栏出现图标的程序:

void CDialogtestDlg::OnSize(UINTnType, int cx, int cy)

{

 CDialog::OnSize(nType, cx, cy);

 // TODO: 在此处添加消息处理程序代码

 if (nType == SIZE_MINIMIZED)

 {

     ShowWindow(SW_HIDE);//隐藏最小化到任务栏的图标

 }

}

原文:https://blog.csdn.net/lejun2011/article/details/7570357

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值