WinCE工作区和任务栏

//========================================================================
//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_AUTOHIDE    5
        
#define  TASKBAR_HEIGHT             26

        
void  CTaskBar::SetWorkArea( void )
        
{
            RECT rcWorkArea 
= {0}, rcWorkAreaNew = {0};
        
                
//获取当前的工作区域
            SystemParametersInfo(SPI_GETWORKAREA, 0, (void*)&rcWorkArea, 0);
        
            
//如果任务栏不是"总在最前面",则工作区设置为整个屏幕
            SetRect(&rcWorkAreaNew, 00, 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();
        }

        

        换句话来说,工作区的作用之一是让我们程序确定自定义全屏窗口的大小.当然,如果程序不是适应工作区,而是有自己固定的方位,则工作区的大小则显得不那么有意义了.

你可能感兴趣的:(WinCE工作区和任务栏)