最小化托盘单击左键响应不同窗口

来源:互联网 发布:泛函是什么 知乎 编辑:程序博客网 时间:2024/06/07 16:43

在一个很多个窗口的程序里面,程序运行到不同阶段显示的不同的窗口,而我们的托盘只有左右键响应两个消息,让托盘响应不同时刻的消息而显示不同窗口:

刚学MFC,我只是按照能想到的方法写出来的,如果有更好的方法,希望指出来。

1--首先要创建托盘。这里迟点写:



2--创建托盘后,单击左键的消息处理函数:


//处理菜单  只需要看左键响应里面的三个if语句判断即可:

//---------------------------------------------------------------------------------------------------------

title_window   fix_window  card_window 分别是三个int型全局变量

MFC编程中添加全局变量

1- 在stdafx.cpp中加入:       int            title_window   ;

2-然后在stdafx.h中加入:     extern int            title_window   ;

这样定义以后无论在什么文件中都是可见的

//---------------------------------------------------------------------------------------------------------

在程序运行到不同阶段,按照类似位运算的方法随时赋值:title_window   = 0,fix_window  = 1,card_window = 0 ;

即可改变单击左键时打开的窗口。


LRESULT CTray::OnShowTask(WPARAM wParam, LONG lParam)
{
    static int i = 0;
int x= GetSystemMetrics(SM_CXSCREEN);
int y= GetSystemMetrics(SM_CYSCREEN);

    if(wParam != m_NotifyIconData.uID)
        return 1;
    else
    {
        if(LOWORD(lParam) == WM_LBUTTONDOWN)//这里是响应左键
        {
CWnd* pWnd_1 = CWnd::FindWindow(NULL,L"无线网络共享");//显示信息页面
HWND hwnd_1 = pWnd_1->GetSafeHwnd();

CWnd* pWnd_2 = CWnd::FindWindow(NULL,L"Other_title_Dlg");//透明窗体1
HWND hwnd_2 = pWnd_2->GetSafeHwnd();
//---------------------------------------------------------------------------
CWnd* pWnd_3 = CWnd::FindWindow(NULL,L"设置");//设置页面
HWND hwnd_3 = pWnd_3->GetSafeHwnd();


CWnd* pWnd_4 = CWnd::FindWindow(NULL,L"Other_fix_Dlg");//透明窗体2
HWND hwnd_4 = pWnd_4->GetSafeHwnd();
//---------------------------------------------------------------------------
CWnd* pWnd_5 = CWnd::FindWindow(NULL,L"Dialog_Card");//网卡页面
HWND hwnd_5 = pWnd_5->GetSafeHwnd();
//---------------------------------------------------------------------------
if(title_window == 1)//打开窗口1
{
SetWindowLong(hwnd_1, GWL_STYLE,GetWindowLong(hwnd_1, GWL_STYLE) & (~(WS_CAPTION | WS_BORDER)));  
::SetWindowPos(hwnd_1,NULL,x-447,y-425,446,386,SWP_SHOWWINDOW );
::AnimateWindow(hwnd_1,1000,AW_HOR_POSITIVE|AW_SLIDE);  

::SetWindowPos(hwnd_2,HWND_TOPMOST,x-447,y-425,446,386,SWP_SHOWWINDOW|SWP_NOOWNERZORDER );
::AnimateWindow(hwnd_2,1000,AW_VER_NEGATIVE|AW_SLIDE); 
}
if(fix_window == 1)//打开2
{
SetWindowLong(hwnd_3, GWL_STYLE,GetWindowLong(hwnd_3, GWL_STYLE) & (~(WS_CAPTION | WS_BORDER)));  
::SetWindowPos(hwnd_3,NULL,x-447,y-425,446,386,SWP_SHOWWINDOW );
::AnimateWindow(hwnd_3,1000,AW_HOR_POSITIVE|AW_SLIDE); 

::SetWindowPos(hwnd_4,NULL,x-447,y-425,446,386,SWP_SHOWWINDOW );
::AnimateWindow(hwnd_4,1000,AW_VER_NEGATIVE|AW_SLIDE); 
}
if(card_window == 1)//打开3
{
SetWindowLong(hwnd_5, GWL_STYLE,GetWindowLong(hwnd_5, GWL_STYLE) & (~(WS_CAPTION | WS_BORDER)));  
::SetWindowPos(hwnd_5,NULL,x-447,y-425,446,386,SWP_SHOWWINDOW );
::AnimateWindow(hwnd_5,1000,AW_HOR_POSITIVE|AW_SLIDE);
}
        }
        if (LOWORD(lParam) == WM_RBUTTONUP)
        {   //右键弹出菜单
              CMenu menu, *pSubMenu;
              //加载菜单
              if(!menu.LoadMenu(m_NotifyIconData.uID))
              {
                  return 1;
              }
              //加载菜单中的第一项
              if(!(pSubMenu = menu.GetSubMenu(0)))
              {
                  return 1;
              }
              CPoint pos;
              ::GetCursorPos(&pos);
              ::SetForegroundWindow(m_NotifyIconData.hWnd);
              //设置菜单的显示位置
              ::TrackPopupMenu(pSubMenu->m_hMenu,0,pos.x,pos.y,0,m_NotifyIconData.hWnd,NULL);
              menu.DestroyMenu();
        }
    }
    return 0;
}

虽然简单,但挺实用的。迟点把创建托盘的也加进来。

使用FindWindow查找窗口的使用可以很灵活,在哪儿都能使用,在显示的时候不需要窗口标题可以使用

SetWindowLong(hwnd_1, GWL_STYLE,GetWindowLong(hwnd_1, GWL_STYLE) & (~(WS_CAPTION | WS_BORDER)));  

隐藏。

0 0
原创粉丝点击