wince添加屏幕旋转的支持

来源:互联网 发布:js uriencoding 编辑:程序博客网 时间:2024/05/18 01:15

=============================================================

标题:wince添加屏幕旋转的支持

摘要:

备注:Windows CE 5.0

日期:2010.5.15

姓名:朱铭雷

=============================================================

       对于标准smdk2440修改过来的BSP,其实LCD驱动部分的代码已经初步的支持了屏幕旋转,只需做一些补充和修改即可。

       1/smdk2440/DRIVERS/DISPLAY/S3C2440LCD目录下找到s3c2440disp.h文件,在该文件开头加入#define ROTATE,如:

#ifndef __S3C2440DISP_H__

#define __S3C2440DISP_H__

#define ROTATE  //notears

2s3c2440disp.h文件中S3C2440DISP类的定义最后添加如下函数定义:

#ifdef ROTATE

       void SetRotateParms();

       LONG DynRotate(int angle);

       int GetRotateModeFromReg(); 

#endif //ROTATION

3s3c2440disp.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;

}

4s3c2440disp.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"));

 

       }

    }

—————————————————————————————————————————

       我测试的效果如下:

 

      因为操作了注册表,所以这种对屏幕方向的修改在重新上电之后仍是可以保存的。