WINCE6.0+XP风格4寸480_800显示过小等问题修改
一、wince界面的修改:
1.先介绍些比较重要的文件:
(1) Xp风格的界面主要涉及到的文件在\public\common\oak\drivers\skinnableui\gwexp
Btnctlviewxp (主要是用来绘制按钮(Button,CheckBox,Radio)以及按钮上的文本)
Gcachwviewxp (主要是用来设置窗口标题栏的高度,滚动条的高度,标题字体)
Nclientviwxp (主要用来绘制标题栏的区域以及标题栏上面的按钮(OK,关闭。。。))
Sbcmnviewxp (主要用来绘制些滚动条)
Stcctlviewxp
备注:在定制wince界面时 Btnctlviewxp,Nclientviwxp,Sbcmnviewxp Stcctlviewxp项
目文件都可以不用修改,只需要在Gcachwviewxp 加载新图片,然后在widgetoffsets.hpp
修改图片的偏移量即可。
(2)标题栏的图片已经标题栏上面按钮的图片放在:
PUBLIC\COMMON\OAK\DRIVERS\SKINNABLEUI\GWEXP\GCACHEVIEWXP\RES
这里我们主要使用到了:
Framecaption.bmp (标题栏位图)
Frameleftright.bmp(标题栏左右两边的位图)
Captionbutton.bmp(标题栏按钮位图(关闭按钮除外))
Closebutton.bmp (标题栏关闭按钮位图)
Nclient.bmp (标题栏按钮上面显示的图片)
(3)两个很重要的文件:
设置按钮图片偏移量的文件:
PUBLIC\COMMON\OAK\DRIVERS\SKINNABLEUI\GWEXP\INC\widgetoffsets.hpp
设置控件的大小的结构体(标题栏的高度,标题栏字体大小,标题栏按钮图片设置....)
PUBLIC\COMMON\OAK\DRIVERS\SKINNABLEUI\GWEXP\INC\gcachedata.hpp
2.控件绘制的工作流程:
第一步:系统启动后加载GCacheviewxp.cpp 的 CacheView_t::Init()函数
第二步:加载控件图片(在CacheView_t::Init()函数里面,通过LoadBitmapW_I()函数加载控件图片,
图片路径:..\GCACHEVIEWXP\RES)。
第三步:设置控件图片的大小,这里主要值设置标题栏图片,以及标题栏上面的按钮图片的大小。(通
过widgetoffsets.hpp得到控件图片的大小。这些控件图片的句柄以及控件大小的值都会赋值给
GweCacheView结构体,然后系统通过调用这个结构体显示按钮图片。 )
第四步:图片加载完成后通过Btnctlviewxp,Nclientviwxp,Sbcmnviewxp绘制各个控件。在绘制控件的
时候都是通过widgetoffsets.hpp得到各控件的坐标再调用 Gdi::StretchBlt_I函数来实现的。
3.实现自己winceUI的步骤:
第一步:修改\PUBLIC\COMMON\OAK\DRIVERS\SKINNABLEUI\GWEXP\GCACHEVIEWXP\RES图片
第二步:修改\PUBLIC\COMMON\OAK\DRIVERS\SKINNABLEUI\GWEXP\INC\widgetoffsets.hpp文件
第三步:修改PUBLIC\COMMON\OAK\DRIVERS\SKINNABLEUI\GWEXP\GCACHEVIEWXP\GCacheviewxp.cpp 文件
第四步:编译
D:\wince600\PUBLIC\COMMON\OAK\DRIVERS\SKINNABLEUI\GWEXP-----Rebuild andClean sysgen
在Wince600\CW2451_ARMV4I\cesysgen\oak\target\ARMV4I\retail 会生成 gwes.dll。
将gwes.dll拷贝到window根目录重启手持机即可。
4.在定义UI的部分细节
(1)GCacheviewxp.cpp文件主要是实现了图片的加载以及标题栏的上面的一些设置(标题栏高度,标题
栏字体,标题栏上面的按钮)然后赋值给GweCacheView结构体。
1.1在CacheView_t::Init(HINSTANCE hInstance,bool bLargeUi)函数里面通过LoadBitmapW_I函数来
加载控件图片。
1.2修改标题字体:
hdc = GweBypassCoredllThunk_t::GetDC_I(NULL);
Gdi::GetObjectW_I(Gdi::GetCurrentObject_I(hdc,OBJ_FONT), sizeof(LOGFONT), &lf);
lf.lfWeight= FW_BOLD;(设置标题栏的字体)
1.3可以在注册表增加下面这些键值可以调整标题栏的高度以及滚动条的宽度,滚动条的最小高度等
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\GWE"),
0, KEY_READ, &hkey) == ERROR_SUCCESS)
{
cbSize= sizeof(DWORD);
RegQueryValueEx(hkey, TEXT("cyCap" ), 0, NULL, //指定非客户端标题栏的高度
(LPBYTE)&g_cacheview.cyCaption, &cbSize);
RegQueryValueEx(hkey, TEXT("cyThMin"), 0, NULL,
(LPBYTE)&g_cacheview.cyThumbMin, &cbSize);
RegQueryValueEx(hkey, TEXT("cyThDef"), 0, NULL,
(LPBYTE)&g_cacheview.cyThumbDefault, &cbSize);
RegQueryValueEx(hkey, TEXT("cxWidg" ), 0, NULL,
(LPBYTE)&g_cacheview.cxWidget, &cbSize);
RegQueryValueEx(hkey, TEXT("cxHScr" ), 0, NULL,
(LPBYTE)&g_cacheview.cxHScroll, &cbSize);
RegQueryValueEx(hkey, TEXT("cyHScr" ), 0, NULL,
(LPBYTE)&g_cacheview.cyHScroll, &cbSize);
RegQueryValueEx(hkey, TEXT("cxVScr" ), 0, NULL,
(LPBYTE)&g_cacheview.cxVScroll, &cbSize);
RegQueryValueEx(hkey, TEXT("cyVScr" ), 0, NULL,
(LPBYTE)&g_cacheview.cyVScroll,&cbSize);
cbSize= sizeof(bool);
RegQueryValueEx(hkey, TEXT("NoWS_EX_CONTEXTHELP"), 0, NULL,
(LPBYTE)&g_cacheview.NoWS_EX_CONTEXTHELP, &cbSize);
RegCloseKey(hkey);
}
(2)widgetoffsets.hpp设置按钮图片偏移量的文件:
2.1
#define CAPTIONXP_TEXT_SPACE_HORIZ 4// 非客户去窗体标题的x位置
#define CAPTIONXP_TEXT_SPACE_VERT 16 // 非客户去窗体标题的y位置
#define CAPTIONXP_TEXTSHADOW_X 2 // 非客户去窗体标题阴影部分的x位置
#define CAPTIONXP_TEXTSHADOW_Y 2//非客户去窗体标题阴影部分的Y 位置
2.2 button绘制的细节
正常显示图2,但按下按钮是就会将图1的黄色部分拷贝到图2.黄色部分刚好是#0--#7
2.3 控件宽和高的宏定义刚好对于控件图片的像素点
#define CAPTIONXP_BMP_CX // 66(没改之前的标题栏宽度)
#define CAPTIONXP_BMP_CY // 58(没改之前的标题栏高度)
#define CAPTIONXP_BMP_CX // 66(没改之前的标题栏宽度)
#define CAPTIONXP_BMP_CY // 58(没改之前的标题栏高度)
#define CAPTIONBUTTONXP_ACTIVE_NORMAL_CX 21(没改之前的标题栏上面的按钮宽度)
#defineCAPTIONBUTTONXP_ACTIVE_NORMAL_CX 21(没改之前的标题栏上面的按钮高度)
2.4 在绘制按钮的时候可能会有激活的和未激活的图片
FRAMEXP_LR_ACTIVE_LEFT_X 激活的按钮的宏定义
FRAMEXP_LR_INACTIVE_LEFT_X 未激活的按钮的宏定义
带用ACTIVE字样的都表示激活的控件的宏定义
带用INACTIVE字样的都表示未激活的控件的宏定义
2.5
这个图片的底色必须采用纯紫色RGB(255,0,255),系统在复制位图的时候判断如果是纯紫色就不拷贝,这样,radio按钮周边的紫色才能不去掉。要不然radio将会是个正方形,radio周围的底色将会存在。
二、桌面和控制面板的覆盖问题:
只需要修改
H:\WINCE600\public\common\oak\drivers\skinnableui\gwexp\gcacheviewxp\GCacheviewxp.cpp
int
CacheView_t::
SystemMetrics(
int nIndex
)
SM_CYICONSPACING 图标的列间距
SM_CXICONSPACING 图标的行间距
三、 修改控制面板工具栏高度以及按钮高度和宽度
H:\WINCE600\public\common\oak\drivers\skinnableui\commctrlxp\toolbarviewxp.cpp
ToolBarView_t::
InitializeButtonSlopValue(
int* pxSlop,
int* pySlop
)
*pxSlop =18;// 7;zhoupinchange 按钮的宽度
*pySlop = 20;//6; zhoupinchange 按钮的高度
备注:按钮的高度改了控制面板的菜单高度也会自动相应的修改
怎么改变控制面板图标大小显示:
Public\Wceshellfe\oak\ctlpnl\control\control.cpp
LRESULT GetCPLFiles(HWND hwndParent,HWND hwndLV)
himlSmall=ImageList_Create(32,32,ILC_MASK,12,0);//32,32 是控制图标高度和宽度的显示
四、 修改我的设备工具栏和IE浏览器工具栏的高度
public\shell\oak\hpc\explorer\main\mainwnd.cpp
STDMETHODIMP CMainWnd::SetToolbarItems(LPTBBUTTONSBlpButtons, UINTnButtons, UINT
uFlags)
{
rbbi.cyMinChild = 40; //我的设备工具栏和IE浏览器工具栏的高度在这里控制
五、系统应用程序的UI修改。
调整系统APP的界面英文系统用两种方式
方式一:修改APP对应的.rc文件
方式二:修改APP对应的.res文件(其他语言的系统只有这一种方式)
使用不同的方式修改UI在编译系统(不是编译整个系统,只编译你需要修改的app
的那个目录)的时候需要注意:
方式一:必须使用Rebuildand Clean sysgen编译,这样才能重新编译你修改后的.rc文件,生
成一个新的.res文件。
方式二:必须使用buildand sysgen编译。.rc文件就不会生成新的.res文件。你修改的.res
也就不会被覆盖。
修改控制面版的程序
\PUBLIC\WCESHELLFE\OAK\CTLPNL\CPLMAIN \\ cplmain.rc
编译:public->wceshellfe->oak->ctlpnl………Rebuild and Clean Sysgen
\PUBLIC\IE\OAK\INETCPL\inetcpl_qvga.rc (IE界面)
编译:public->ie->oak->inetcpl………Rebuild and Clean Sysgen
\PUBLIC\COMMON\OAK\DRIVERS\NETUI\ netui.rc (GPRS拨号,wifi界面)
编译:public->common\->oak->drivers\netui………Rebuild and Clean Sysgen
\PUBLIC\COMMON\OAK\DRIVERS\NETSAMP\CONNMC \\ connmc.rc(GPRS拨号)
编译:public->common->oak->drivers\netsamp\connmc………Rebuild and
Clean Sysgen