• VC单文档对话框添加托盘图标


    一 单文档添加托盘

    1. 在CMainFrame中定义NOTIFYICONDATA结构m_notify

    2.在OnCreate中添加托盘初始化代码

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
        m_notify.cbSize = sizeof(NOTIFYICONDATA);//结构体大小
        m_notify.hWnd = m_hWnd;//对应窗口
        m_notify.uID = IDR_MAINFRAME;//托盘id
        m_notify.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));//图标
        strcpy(m_notify.szTip, "欢乐斗地主");//鼠标移动到托盘时的提示字符
        m_notify.uCallbackMessage = WM_USER_NOTIFYICON;//处理消息
        m_notify.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; //有效标志
        Shell_NotifyIcon(NIM_ADD, &m_notify);//添加托盘
        return 0;
    }

    3.在头文件中添加宏定义#define WM_USER_NOTIFYICON (WM_USER + 1),这是个自定义的消息,用来处理托盘的响应

    #define WM_USER_NOTIFYICON WM_USER+1
    

    4.在CMainFrame.h定义消息的处理函数

    class CMainFrame : public CFrameWnd
    {
    protected:
        afx_msg LRESULT OnNotifyMsg(WPARAM wparam, LPARAM lparam);
    }
    

    5.在CMainFrame.cpp中实现消息函数

    添加消息映射:

    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    	ON_WM_CREATE()
    	ON_WM_NCHITTEST()
    	ON_WM_DESTROY()
    	ON_MESSAGE(WM_USER_NOTIFYICON, OnNotifyMsg)
    END_MESSAGE_MAP()
    

    函数实现:

    LRESULT  CMainFrame::OnNotifyMsg(WPARAM wparam, LPARAM lparam)
    {
    	//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
    	if (wparam != IDR_MAINFRAME) return  1;
    	switch (lparam)
    	{
    	case  WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个关闭
    	{
    		CPoint pos;
    		CMenu    menu;	
    
             //代码添加一个响应菜单
    		::GetCursorPos(&pos);
    		menu.CreatePopupMenu();//声明一个弹出式菜单     
    		menu.AppendMenu(MF_STRING, WM_USER_EXIT, "关闭");
    		menu.TrackPopupMenu(TPM_LEFTALIGN, pos.x, pos.y, this);
    		menu.Detach();
    		menu.DestroyMenu();
    /*
             //从资源文件中添加一个响应菜单 GetCursorPos(&pos); menu.LoadMenu(IDR_MENU1); SetForegroundWindow();//放置在前面 CMenu* pmenu; //定义右键菜单指针 pmenu = menu.GetSubMenu(0); //该函数取得被指定菜单激活的下拉式菜单或子菜单的句柄 ASSERT(pmenu != NULL); pmenu->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN, pos.x, pos.y, this); //在指定位置显示右键快捷菜单 pmenu->Detach(); pmenu->DestroyMenu(); */ } break; case WM_LBUTTONDBLCLK://双击左键的处理 { if (IsWindowVisible()) { ShowWindow(SW_HIDE); } else { ShowWindow(SW_SHOW); } } break; } return 0; }

    6.如果是代码添加一个响应菜单,需要自己定义一个菜单响应的消息

    #define WM_USER_EXIT	WM_USER + 101
    

    可以和上面定义的WM_USER_NOTIFYICON消息放在一起,

    然后声明和实现 WM_USER_EXIT 消息的响应函数

    class CMainFrame : public CFrameWnd
    {
    public:
    	afx_msg void OnMenuExit();
    }
    

    消息映射

    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    	ON_WM_CREATE()
    	ON_WM_NCHITTEST()
    	ON_WM_DESTROY()
    	ON_MESSAGE(WM_USER_NOTIFYICON, OnNotifyMsg)
    	ON_COMMAND(WM_USER_EXIT, OnMenuExit) //主意这里ON_COMMAND
    END_MESSAGE_MAP()
    

    响应函数实现

    void CMainFrame::OnMenuExit()
    {
    	OnClose();//程序退出
    }
    

    7.如果是从资源文件中添加一个弹出菜单,建立菜单如下

    并且右键关闭添加响应函数

    最后在onClose中添加关闭的代码

    void CMainFrame::OnCloseWindow()
    {
    	//程序退出
    	OnClose();	
    }
    

    8.至此,单文档的托盘程序已经完成,其实从资源中加载菜单和代码生成菜单的原理是一样的,随便取一种就可以了,但是代码添加菜单一定要添加菜单的响应消息,不然菜单不可点击.

    一 对话框添加托盘

    1.代码是一样的,在CDlg.cpp 中的OnInitDialog函数中初始化托盘结构,并添加响应函数

    2.值得注意的是右键菜单可以直接发送WM_DESTROY消息,代码如下

    			LPPOINT lpoint=new tagPOINT;     
    			::GetCursorPos(lpoint);     
    			CMenu    menu;     
    			menu.CreatePopupMenu();//声明一个弹出式菜单     
    			menu.AppendMenu(MF_STRING,WM_DESTROY,L"关闭");        
    			menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
    			HMENU hmenu=menu.Detach();     
    			menu.DestroyMenu();     
    			delete    lpoint;   
    

      

      

  • 相关阅读:
    JAVA向上转型和向下转型
    LeetCode记录之9——Palindrome Number
    LeetCode记录之7——Reverse Integer
    JAVA数据结构--插入排序
    JAVA数据结构--选择排序
    JAVA数据结构--冒泡排序
    HTTP协议04-返回状态码
    HTTP协议03-http特点及请求方式
    HTTP协议02-请求和响应的报文构成
    HTTP笔记01-http相关的基础知识
  • 原文地址:https://www.cnblogs.com/July7th/p/5594226.html
Copyright © 2020-2023  润新知