//========================================================================
//TITLE:
// WinCE工作区和任务栏
//AUTHOR:
// norains
//DATE:
// Saturday 5-May-2007
//Environment:
// WinCE 5.0
//========================================================================
简单的来说,WinCE所谓的工作区(WorkArea),便是除去任务栏剩下的空间.当然,这个说法也并不是任何时候都是准确的,如果在任务栏的设置里将"总在最前面"的勾去除,那么工作区便是整个屏幕.
那么工作区有什么作用呢?具体表现又如何呢?我们以WinCE自带的IE为例子.
1.选中任务的"总在最前面",把"自动隐藏"的勾去掉,打开IE,我们会发现IE窗口的大小最低端(bottom)比任务栏的最顶端(top)高一个像素.
2.将"总在最前面"和"自动隐藏"的勾选中,重新打开IE,此时IE窗口比"1"时高度要高,但窗口的最低端(bottom)比任务栏的最顶端(top)依然还是高一个像素.因为选择"自动隐藏"之后,任务栏的高度已经变小,所以IE的高度大.
3.将"总在最前面"前面的勾去掉,选上"自动隐藏",重新打开IE.这时候我们可以发现,IE已经不理会任务栏的高度,其最低端(bottom)已经和屏幕的最低端重合.简单的来说,此时IE全屏.
4.将"总在最前面"和"自动隐藏"前面的勾去掉,重新打开IE.IE的情况和"3"相同.
对于微软其它的应用程序,表现形式也和IE基本相同.
由此我们可以看到工作区的大小关系:
不在最前 > 自动隐藏(总在最前面) > 正常状态(总在最前面,且不自动隐藏)
为什么会出现这种情况呢?因为在explorer里,对任务栏的设置,其实很大程度上就是对工作区进行范围变更.
从微软的任务栏的某个代码片段,我们可以更清楚地知道:
换句话来说,工作区的作用之一是让我们程序确定自定义全屏窗口的大小.当然,如果程序不是适应工作区,而是有自己固定的方位,则工作区的大小则显得不那么有意义了.
//TITLE:
// WinCE工作区和任务栏
//AUTHOR:
// norains
//DATE:
// Saturday 5-May-2007
//Environment:
// WinCE 5.0
//========================================================================
简单的来说,WinCE所谓的工作区(WorkArea),便是除去任务栏剩下的空间.当然,这个说法也并不是任何时候都是准确的,如果在任务栏的设置里将"总在最前面"的勾去除,那么工作区便是整个屏幕.
那么工作区有什么作用呢?具体表现又如何呢?我们以WinCE自带的IE为例子.
1.选中任务的"总在最前面",把"自动隐藏"的勾去掉,打开IE,我们会发现IE窗口的大小最低端(bottom)比任务栏的最顶端(top)高一个像素.
2.将"总在最前面"和"自动隐藏"的勾选中,重新打开IE,此时IE窗口比"1"时高度要高,但窗口的最低端(bottom)比任务栏的最顶端(top)依然还是高一个像素.因为选择"自动隐藏"之后,任务栏的高度已经变小,所以IE的高度大.
3.将"总在最前面"前面的勾去掉,选上"自动隐藏",重新打开IE.这时候我们可以发现,IE已经不理会任务栏的高度,其最低端(bottom)已经和屏幕的最低端重合.简单的来说,此时IE全屏.
4.将"总在最前面"和"自动隐藏"前面的勾去掉,重新打开IE.IE的情况和"3"相同.
对于微软其它的应用程序,表现形式也和IE基本相同.
由此我们可以看到工作区的大小关系:
不在最前 > 自动隐藏(总在最前面) > 正常状态(总在最前面,且不自动隐藏)
为什么会出现这种情况呢?因为在explorer里,对任务栏的设置,其实很大程度上就是对工作区进行范围变更.
从微软的任务栏的某个代码片段,我们可以更清楚地知道:
//
任务栏高度,其值取自于微软原定义
#define TASKBAR_HEIGHT_AUTOHIDE5
#define TASKBAR_HEIGHT26
void CTaskBar::SetWorkArea( void )
... {
RECTrcWorkArea=...{0},rcWorkAreaNew=...{0};
//获取当前的工作区域
SystemParametersInfo(SPI_GETWORKAREA,0,(void*)&rcWorkArea,0);
//如果任务栏不是"总在最前面",则工作区设置为整个屏幕
SetRect(&rcWorkAreaNew,0,0,GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));
//当m_bTaskBarOnTop==TRUE时表示为"总在最前面"
if(m_bTaskBarOnTop)
...{
//m_bTaskBarAutoHide==TRUE时表示自动隐藏
if(m_bTaskBarAutoHide)
...{
rcWorkAreaNew.bottom-=TASKBAR_HEIGHT_AUTOHIDE;
}
else
...{
rcWorkAreaNew.bottom-=TASKBAR_HEIGHT;
}
}
//只改变最底端(bottom)
if(rcWorkArea.bottom!=rcWorkAreaNew.bottom)
...{
SystemParametersInfo(SPI_SETWORKAREA,0,(void*)&rcWorkAreaNew,SPIF_SENDCHANGE);
}
SIP_InitializeSipRect();
}
#define TASKBAR_HEIGHT_AUTOHIDE5
#define TASKBAR_HEIGHT26
void CTaskBar::SetWorkArea( void )
... {
RECTrcWorkArea=...{0},rcWorkAreaNew=...{0};
//获取当前的工作区域
SystemParametersInfo(SPI_GETWORKAREA,0,(void*)&rcWorkArea,0);
//如果任务栏不是"总在最前面",则工作区设置为整个屏幕
SetRect(&rcWorkAreaNew,0,0,GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));
//当m_bTaskBarOnTop==TRUE时表示为"总在最前面"
if(m_bTaskBarOnTop)
...{
//m_bTaskBarAutoHide==TRUE时表示自动隐藏
if(m_bTaskBarAutoHide)
...{
rcWorkAreaNew.bottom-=TASKBAR_HEIGHT_AUTOHIDE;
}
else
...{
rcWorkAreaNew.bottom-=TASKBAR_HEIGHT;
}
}
//只改变最底端(bottom)
if(rcWorkArea.bottom!=rcWorkAreaNew.bottom)
...{
SystemParametersInfo(SPI_SETWORKAREA,0,(void*)&rcWorkAreaNew,SPIF_SENDCHANGE);
}
SIP_InitializeSipRect();
}
换句话来说,工作区的作用之一是让我们程序确定自定义全屏窗口的大小.当然,如果程序不是适应工作区,而是有自己固定的方位,则工作区的大小则显得不那么有意义了.