crazy_b-boy 发表于 2011-4-24 17:53:43

wince6.0下调整任务栏和工作区

1、将任务栏提到窗口顶端
WINCE的整个窗口分为工作区WorkArea和动作栏TaskBar,一般默认为动作栏在底端总是显示在最前面,而工作区WorkArea就是除去动作栏所剩余的空间,他们的窗口定义都在目录PUBLIC\ SHELL\OAK\MYSHELL\CESHELL\EXPLORER\TASKBAR里面,可以找到TASKBAR.CPP和TASKBAR.HXX文件
在TASKBAR.HXX文件中有
#define TASKBAR_HEIGHT      26
#define TASKBAR_HEIGHT_AUTOHIDE 5
其中TASKBAR_HEIGHT为动作栏高度,TASKBAR_HEIGHT_AUTOHIDE为自动隐藏高度
在TASKBAR.CPP文件中(第550行)
修改voidCTaskBar::SlideWindow(HWND hwnd, const RECT &rcNew, BOOL fShow)
中的代码:
MoveWindow(hwnd, rcNew.left ,rcNew.top, rcNew.right - rcNew.left,
               rcNew.bottom - rcNew.top, FALSE);
注释掉,后面添加
MoveWindow(hwnd, rcNew.left, 0, rcNew.right - rcNew.left,
               rcNew.bottom - rcNew.top, FALSE);
第二个参数和第三个参数分别定义窗口的左端和顶端开始位置,rcNew.left默认是0,也没有修改的必要,rcNew.top= rcNew.bottom- TASKBAR_HEIGHT,而rcNew.bottom就是整个窗口的高度,所以我们只要修改rcNew.top为0就可以将整个任务栏提到窗口的顶端。
修改完编译过后可以看到这样的模拟器


2、工作区整体下调TASKBAR_HEIGHT个高度
在修改完TakBar的时候,工作区在顶端是与之重合的,而底端又是有一条高度为TASKBAR_HEIGHT的空隙,所以接下来要修改的是将工作区的位置整体下调TASKBAR_HEIGHT个高度

可以在TASKBAR.CPP中找到函数
void CTaskBar::SetWorkArea(void)
下面是该函数的部分代码:
SetRect(&rcWorkAreaNew, 0, 0,
GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
(这里是设置工作区域为全屏大小,类似于MoveWindow,第二个和第三个参数分别定义工作区的左端和顶端开始位置,我们将第三个参数修改为TASKBAR_HEIGHT,将工作区从原来的位置下拉一个任务栏的高度,这样在打开应用程序的时候就不会将被任务栏覆盖)
继续看下面的代码:
if (m_bTaskBarOnTop) //任务栏总在最前
    {
      if (m_bTaskBarAutoHide)//任务栏自动隐藏
      {
//新的工作区大小为底端减去任务栏的自动隐藏高度
         rcWorkAreaNew.bottom -= TASKBAR_HEIGHT_AUTOHIDE;
      }
      else
      {
         //新的工作区大小为底端减去任务栏的高度
            rcWorkAreaNew.bottom -= TASKBAR_HEIGHT;
      }
    }
   // currently, only the bottom will change,如果底端位置变了则执行重新设置工作区的大小
    if (rcWorkArea.bottom != rcWorkAreaNew.bottom)
    {
      SystemParametersInfo(SPI_SETWORKAREA, 0, (void*)&rcWorkAreaNew, SPIF_SENDCHANGE);
    }

从上面的代码我们可以看出工作区的设置是默认为任务栏在下面,然后当任务栏隐藏和自动隐藏不同的情况下只要调整底端高度就可以适应环境,我们现在的情况是任务栏到了顶端,相应的要调节工作区的顶端来适应环境,修改如下:
if (m_bTaskBarOnTop)
    {
      if (m_bTaskBarAutoHide)
      {
            rcWorkAreaNew.top += TASKBAR_HEIGHT_AUTOHIDE;//这里要调节顶端
      }
      else
      {
            rcWorkAreaNew.top += TASKBAR_HEIGHT;    //调节顶端高度
      }
    }

    // currently, only the top will change
    if (rcWorkArea.top != rcWorkAreaNew.top)
    {
      SystemParametersInfo(SPI_SETWORKAREA, 0, (void*)&rcWorkAreaNew, SPIF_SENDCHANGE);
   }
修改后如图:


3、隐藏任务栏
在\WINCE600\PUBLIC\SHELL\OAK\HPC\EXPLORER\MAIN 目录,打开explorer.cpp 文件,在WinMain 函数里面屏蔽下面代码即可:
/*
// fork off a thread for the taskbar

    hTaskbarSyncEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!hTaskbarSyncEvent)
    {
      goto Cleanup;
    }
    hThread = CreateThread(NULL, NULL, CreateTaskBar, &hTaskbarSyncEvent, 0, NULL);
    WaitForSingleObject(hTaskbarSyncEvent, INFINITE);
    // GetExitCodeThread(); // Test for failure?
    CloseHandle(hThread);
CloseHandle(hTaskbarSyncEvent);
*/
这里完成一个任务栏的创建工作

在网上看到一个好贴 决定实验放了两天假 编译了多次 也出现不少问题    终于成功隐藏了工具栏 为小成功高兴一下 哈哈 把帖子拿来分享一下 希望有用http://dev.10086.cn/cmdn/bbs/thread-12750-1-1.html 文件夹不是很正确 大家仔细找找 都差不多啊 下一步想实现开机竖屏 就更像手机了 还有疑问 我想通过串口连GSM打电话 不知道手机是这原理不 望高手赐教

songzi2018 发表于 2011-5-21 19:01:03

顶一下,通过修改shell源码最彻底了,达到DIY开机界面/或者做产品目的,详细的在CSDN博客上的专家也有说明

crazy_b-boy 发表于 2011-5-24 12:15:52

回复【1楼】songzi2018
-----------------------------------------------------------------------

知己啊
页: [1]
查看完整版本: wince6.0下调整任务栏和工作区