您的位置:首页 > 其它

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

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

刚学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)));

隐藏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: