转载自http://blog.csdn.net/xiaolei05/article/details/7472262
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行)
修改void CTaskBar::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);
*/
这里完成一个任务栏的创建工作
最后换个壁纸,如下图:
这里有个问题就是在修改动作栏的时候,修改的是CTaskBar::SlideWindow()函数,从函数功能上来看,该函数是完成一个窗口逐渐隐藏的一个功能(类似于QQ放在屏幕顶端会自动最小化在顶端),这和函数的名称滑动窗口是相匹配的,然而在全文档仅有的5个MoveWindow()函数中只有这个函数下的MoveWindow()函数修改后才起作用,费解~~~~~ 希望达人们赐教~