=============================================================
标题:wince添加屏幕旋转的支持
摘要:
备注:Windows CE 5.0
日期:2010.5.15
姓名:朱铭雷
=============================================================
今天给公司的S3C2440开发板添加对屏幕旋转的支持,对于标准smdk2440修改过来的BSP,其实LCD驱动部分的代码已经初步的支持了屏幕旋转,只需做一些补充和修改即可。
(1)/smdk2440/DRIVERS/DISPLAY/S3C2440LCD目录下找到s3c2440disp.h文件,在该文件开头加入#define ROTATE,如:
#ifndef __S3C2440DISP_H__
#define __S3C2440DISP_H__
#define ROTATE //notears
(2)在s3c2440disp.h文件中S3C2440DISP类的定义最后添加如下函数定义:
#ifdef ROTATE
void SetRotateParms();
LONG DynRotate(int angle);
int GetRotateModeFromReg();
#endif //ROTATION
(3)在s3c2440disp.cpp文件中添加GetRotateModeFromReg函数的实现,如下:
// notears 读取注册表中的屏幕方向
int S3C2440DISP::GetRotateModeFromReg()
{
HKEY hKey;
if(ERROR_SUCCESS ==
RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SYSTEM//GDI//ROTATION"),0,0,&hKey))
{
DWORD dwSize,dwAngle,dwType = REG_DWORD;
dwSize = sizeof(DWORD);
if(ERROR_SUCCESS ==
RegQueryValueEx(hKey,TEXT("ANGLE"),NULL,&dwType,(LPBYTE)&dwAngle,&dwSize))
{
switch(dwAngle)
{
case 0:
return DMDO_0;
case 90:
return DMDO_90;
case 180:
return DMDO_180;
case 270:
return DMDO_270;
default:
return DMDO_0;
}
}
RegCloseKey(hKey);
}
return DMDO_0;
}
(4)在s3c2440disp.cpp文件中找到S3C2440DISP函数,先做如下修改:
#ifdef ROTATE
//m_iRotate = 0;
m_iRotate = GetRotateModeFromReg(); //notears
SetRotateParms();
#endif //ROTATE
然后在memset ((void*)m_pPrimarySurface->Buffer(), 0x0, m_FrameBufferSize);代码行
下,添加如下代码:
// notears
#ifdef ROTATE ((GPESurfRotate*)m_pPrimarySurface)->SetRotation(m_nScreenWidth,m_nScreenHeight,m_iRotate);
#endif //ROTATE
(5)找到S3C2440LCD目录下的sources文件,添加ROTATE=1,如下:
TARGETNAME=S3C2440DISP
RELEASETYPE=PLATFORM
TARGETTYPE=DYNLINK
DEFFILE=S3C2440DISP.DEF
CLEARTYPE=0
ROTATE=1
打开PB工程,注意只编译当前修改了源代码的DISPLAY目录即可,全部Build的话,那就太浪费时间了。如图:
Build完成之后,再Make Run-Time Image,将新NK下载到板子里面。
接下来就要编写应用程序进行测试了,测试代码参考如下:
———————————————————————————————————————
DEVMODE DevMode;
memset(&DevMode, 0, sizeof(DevMode));
DevMode.dmSize = sizeof (DevMode);
DevMode.dmFields = DM_DISPLAYORIENTATION;
ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_TEST, NULL); // 获取当前屏幕方向
HKEY hKey;
static DWORD dwData;
// 计算新的屏幕方向
switch(DevMode.dmDisplayOrientation)
{
case DMDO_0:
DevMode.dmDisplayOrientation = DMDO_90;
dwData = 90;
break;
case DMDO_90:
DevMode.dmDisplayOrientation = DMDO_180;
dwData = 180;
break;
case DMDO_180:
DevMode.dmDisplayOrientation = DMDO_270;
dwData = 270;
break;
case DMDO_270:
DevMode.dmDisplayOrientation = DMDO_0;
dwData = 0;
break;
default:
DevMode.dmDisplayOrientation = DMDO_0;
dwData = 0;
break;
}
// 设置新的屏幕方向
DevMode.dmFields = DM_DISPLAYORIENTATION;
ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_RESET, NULL);
// 将新的屏幕角度写入注册表
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SYSTEM//GDI//ROTATION"),0,0,&hKey))
{
if(ERROR_SUCCESS!=RegSetValueEx(hKey,TEXT("Angle"),0,REG_DWORD,(const BYTE*)&dwData,sizeof(DWORD)))
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),0,(LPTSTR)&lpMsgBuf,0,NULL);
MessageBox(_T("Write Registry Error"));
}
}
——————————————————————————————————————————————
我测试的效果如下:
因为操作了注册表,所以这种对屏幕方向的修改在重新上电之后仍是可以保存的。