现在的位置: 首页 > 综合 > 正文

实现WinCE的转屏(屏幕旋转):转自互联网

2013年10月14日 ⁄ 综合 ⁄ 共 2777字 ⁄ 字号 评论关闭

实现WinCE的转屏(屏幕旋转)

    在WinCE中实现屏幕的旋转(当然角度只能是90度的整数陪),首先确认显示设备的驱动是否支持旋转功能。在显示设备支持的前提下,可以通过以下两种方法实现屏幕的旋转:

一、通过修改注册表实现

    默认情况下,屏幕都是正常显示的,也就是说翻转角度为0度。可以通过修改注册表来做屏幕翻转,通过修改”Angle”的值来完成,具体设置如下:
   
[HKEY_LOCAL_MACHINESystemGDIRotation]
   
"Angle"=dword:5A ;翻转90度,这里的5A就是90的十六进制 
   
可以设置为0度,90度,180度和270度。也就是05AB410E,通过设置这些值可以达到屏幕翻转的目的。你可以在Build image的时候就做这件事情,只要在project.reg文件里面加入上面的设置,然后重新make image,这样新的image启动以后就会按照你的设定来显示。也可以在WinCE启动以后,编个读写注册表的小程序,来修改这个值,然后重新启动就可以了(系统要支持HIVE-Based Registry)

二、通过ChangeDisplaySettingEx系统API实现

    ChangeDisplaySettingEx函数的详细说明请参见MSDN相关文档,这里我们只做简单的说明,其函数原形如下:
   
LONG ChangeDisplaySettingsEx(
       
LPCTSTR lpszDeviceName, //设置名称(没被使用,设置为NULL
       
LPDEVMODE lpDevMode, // 图形模式(指向一个DEVMODE结构指针)
       
HWND hwnd,            // 没被使用;但必需设置为NULL
       
DWORD dwflags,         // 图形模式选项
       
LPVOID lParam          //  参数(可为空)
       
);

如下例子函数实现了在WinCE下把屏幕转到下一个角度的功能,代码如下:

    int RotationScreenNextAngles( void )
    {
        int RotationAngles;
        int CurrentAngle;
        int NewAngle;
        DEVMODE DevMode;

注:本函数在VS2008下测试通过

        memset( &DevMode, 0,sizeof(DevMode) );
        DevMode.dmSize   = sizeof   (DevMode);
        DevMode.dmFields = DM_DISPLAYQUERYORIENTATION;

        // Check for rotation support by getting the rotation angles supported.
        if( DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(NULL, &DevMode,NULL, CDS_TEST,NULL) )
        {
                RotationAngles = DevMode.dmDisplayOrientation;
        }else
        {
                RotationAngles = -1;
                return -1;
        }

        // Get the current rotation angle.  
        memset( &DevMode, 0, sizeof(DevMode) );
        DevMode.dmSize   = sizeof(DevMode);
        DevMode.dmFields = DM_DISPLAYORIENTATION; 
        if( DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx( NULL, &DevMode, NULL, CDS_TEST, NULL) )
        {
                CurrentAngle = DevMode.dmDisplayOrientation;
        }else
        {
                CurrentAngle = -1; 
                return -2;
        }

        // Rotate to the "next " angle.
        NewAngle = CurrentAngle; 
        do 
       
                NewAngle <<= 1; 
                if( NewAngle == DMDO_0) 
               
                        NewAngle = DMDO_90; 
               
                if( NewAngle > DMDO_270)  
               
                        NewAngle = DMDO_0; 
                }
        }while(!(NewAngle & RotationAngles) && (NewAngle != DMDO_0));

        memset(&DevMode, 0, sizeof(DevMode)); 
        DevMode.dmSize               = sizeof(DevMode); 
        DevMode.dmFields             = DM_DISPLAYORIENTATION; 
        DevMode.dmDisplayOrientation = NewAngle;

        if ( DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_RESET, NULL) ) 
       
                //rotation success
                return 0;
       
        else 
       
                //rotation fail
                return -3;
       
    }

说明:
    以上两种方法中第一种方法需重启WinCE才能看到效果,而第二种方法在WinCE重启后将还原成系统默认.

抱歉!评论已关闭.