获得桌面工作区大小,即不包括任务栏的大小,制作窗口全屏时经常用到,方法如下:
RECT rt;
SystemParametersInfo(SPI_GETWORKAREA,0,(PVOID)&rt,0);
获得任务栏高度与宽度方法有二:
1.判断位置
RECT rt;
SystemParametersInfo(SPI_GETWORKAREA, 0, &rt, 0) // 获得工作区大小
//任务栏在下面的高度
int y = ::GetSystemMetrics(SM_CYSCREEN)-rt.Height();
//上面
int y = rt.top;
// 左
int y = rt.left;
// 右
int y = ::GetSystemMetrics(SM_CXSCREEN)-rt.Width();
2.得到高度,然后可判断位置
CRect rect;
CWnd *pWndPrev= FindWindow("Shell_TrayWnd", ""); // 调用本对象即this的Findwindow函数,返回窗口指针
pWndPrev->GetWindowRect(&rect);
//rect.bottom-rect.top 就是任务栏的高度
if(rect.top>0) //下面
if(rect.left>0) //左面
或者
CWnd* p = NULL ;
HWND hwnd = ::FindWindow("Shell_TrayWnd",NULL) ; // 调用公有的FindWindow函数,返回窗口句柄
if(hwnd)
{
p = CWnd::FromHandle(hwnd) ;
}
p->GetWindowRect();//包含有宽度
3.获取任务栏的状态
HWND hWnd;
hWnd = ::FindWindow("Shell_TrayWnd", NULL);// handle to window
if (hWnd)
{
CWnd *p = CWnd::FromHandle(hWnd);
bTrayWndStateFlag = p->IsWindowVisible();//目的:启动程序时,用来保存任务栏的当前状态(运行当前程序前的任务栏的状态)。Add by 石民生 on 2017.09.06
}4.设置任务栏的状态
//Desc:在参数设置的系统设置选项卡中加入了程序运行任务栏是否自动隐藏
bool bShowTaskBar = false;
GetPrivateProfileString("SuperholterSet", "HideTaskbar", "0", chTmp, 10, m_szIniPath);
if (strcmp(chTmp, "1") == 0)
{
bShowTaskBar = false;//自动隐藏任务栏
}
else
{
bShowTaskBar = true;//显示任务栏
}
SetTaskBarState(bShowTaskBar);//对以上代码进行优化,当程序运行时根据设置来决定是否自动隐藏任务栏
..................
/**
*函数名:SetTaskBarState
*功能:自动显示隐藏任务栏
*参数说明:bAutoHideFlag,当值为true时,自动隐藏任务栏;当值为false时,取消自动隐藏,任务栏恢复正常
*返回值:void
*说明:对源代码进行优化,修改,重构
*日期:2016-8-17-10:22
*作者:sms
*/
void CMainFrame::SetTaskBarState(bool bShowTastBarFlag)
{
int nCmdShow;
HWND hWnd;
LPARAM lParam;
hWnd = ::FindWindow("Shell_TrayWnd", NULL);
if (bShowTastBarFlag)
{
nCmdShow = SW_SHOW;
lParam = ABS_ALWAYSONTOP;//取消自动隐藏
}
else
{
nCmdShow = SW_HIDE;
lParam = ABS_AUTOHIDE | ABS_ALWAYSONTOP;//自动隐藏
}
::ShowWindow(hWnd, nCmdShow);//显示任务栏,即恢复正常
#ifndef ABM_SETSTATE
#define ABM_SETSTATE 0x0000000a
#endif
APPBARDATA apBar;
memset(&apBar, 0, sizeof(apBar));
apBar.cbSize = sizeof(apBar);
apBar.hWnd = hWnd;
if (apBar.hWnd != NULL)
{
apBar.lParam = lParam;
SHAppBarMessage(ABM_SETSTATE, &apBar); //设置任务栏自动隐藏
}
}