感觉

--------------海阔凭跃,天高任
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

WinCE驱动开发 - 如何旋转wince的桌面

Posted on 2005-12-12 21:10  感觉  阅读(9650)  评论(7编辑  收藏  举报
 
WinCE驱动开发 - 如何旋转wince的桌面

gqlv - 2004 年 09 月 02 日 - 10:15 AM
标题: 如何旋转wince的桌面
请问如何旋转wince的桌面?
no.killer - 2004 年 09 月 03 日 - 08:20 AM
标题:
从Windows CE 4.0开始,DEVMODE 结构多了一个属性dmDisplayOrientation,你可以通过这个属性来取得或设置屏幕旋转模式,它对应的值如下。
DMDO_0 不旋转
DMDO_90 旋转90度
DMDO_180 旋转180度
DMDO_270 旋转270度

切换屏幕旋转模式通过调用 ChangeDisplaySettingsEx 来实现,如:
DEVMODE devmode = {0};
devmode.dmSize = sizeof(DEVMODE);
devmode.dmDisplayOrientation = DMDO_90; //水平模式
devmode.dmFields = DM_DISPLAYORIENTATION;
ChangeDisplaySettingsEx(NULL, &devmode, NULL, 0, NULL);

取得当前模式的代码如下:
DEVMODE devmode = {0};
devmode.dmSize = sizeof(DEVMODE);
devmode.dmFields = DM_DISPLAYORIENTATION;
ChangeDisplaySettingsEx(NULL, &devmode, 0, CDS_TEST, NULL);
通过 devmode.dmDisplayOrientation 的值可以判断当前模式。

值得注意的是,这样切换模式并不是永久的,当设备重新起动后,就会还原为初始状态。
如果你需要在保留切换的屏幕模式,可以通过设置注册表中HKEY_LOCAL_MACHINE\System\GDI\Rotation 下的两个键值实现
Angle - DWORD (0, 90, 180, 270)
LandscapeMode - DWORD (0,1)


但是支持这些的前提是的你的显示器驱动程序必须支持可旋转的模式举个例子说吧有些显示器的驱动支持DirectX而有些支持旋转,看一下下面的图片吧你会更加理解这些!
gqlv - 2004 年 09 月 03 日 - 10:47 AM
标题:
是不是要修改驱动呀?我的是ep9315!
怎样知道显示器驱动程序支持可旋转?
taling - 2004 年 09 月 03 日 - 11:15 AM
标题:
有两个办法。
一个是改驱动,一个是用GAPI。
no.killer - 2004 年 09 月 03 日 - 11:34 AM
标题:
后面那么大的一个字还没有看清楚呀(rotation station),不过解决方法有很多taling的方法就是一个呀!
simba - 2004 年 12 月 31 日 - 04:17 PM
标题:
GAPI如何旋转Wince的屏幕?GXBeginDraw拿到的frame buffer的地址好像是固定死了的,GAPi提供了rotate的接口么?
joyfly - 2004 年 12 月 31 日 - 05:08 PM
标题:
参考SMDK2410:
WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD
宏ROTATE里的代码

用GAPI,只是你的APPLICATION自己负责去旋转

在DISPLAY DRIVER里改动,则整个系统运行时的屏幕都会旋转过来

no.killer说的方式,是你的APPLICATION要求屏幕旋转,则驱动会自动帮你旋转,当然这需要DISPLAY DRIVER支持.
simba - 2005 年 01 月 02 日 - 01:15 AM
标题:
楼上的大侠你好,我现在是在PDA IPAQ5550上做游戏开发,程序刚运行起来是240*320,但进去后想变成landscape模式。这种情况的话,应该算是application要求旋转屏幕吧,那我的application怎么去做这个要求呢?GAPI根本就没有提供这样的数据结构和API。
我试着改过pda的注册表,重新启动后屏幕倒是旋转了,但最奇怪的是触摸驱动好像没有旋转过来,就是说只是屏幕转过来而已,触摸的时候,还是按240*320布局时候的反应。
姑且不管注册表,只用GAPI的话,通过什么接口来通知驱动去旋转屏幕呢?这款产品应该是支持的因为我就在上面玩过landscape的一款赛车游戏,游戏设定里还可以设置rignt hand or left hand,就是不知道他是怎么做的。
tdfff_2001 - 2005 年 01 月 03 日 - 01:05 PM
标题:
能不能给解释一下"landscape模式"? 我理解了很长时间也没有明白.
joyfly - 2005 年 01 月 04 日 - 09:31 AM
标题:
你的APPLICATION可以用no.killer说的那种方式去旋转比较方便.

如果你的APPLICATION是一个游戏,对显示要求很高的话,就用GAPI.GAPI只是提供给你一个FRAMEBUFFER的指针, 它的格式应该是 240*320 . 也就是说, 如果你要在横屏模式下的左上角(0,0)画个点的话, 那它在FRAMEBUFFER里的位置应该是 (240,0),你要自己去把这个点画在(240,0)的位置上.也就是说你要自己去算这种旋转后的位置关系.


至于landscape和portrait的理解,landscape就是风景画, portrait就是人物肖像; 你可以想象一下你照照片的时候, 照风景一般是用横的, 照人物的证件照片一般是用竖的. 所以landscape就是横屏, portrait就是竖屏
simba - 2005 年 01 月 04 日 - 09:52 PM
标题:
已经搞定^_^,原来framebuffer是一片连续的地址,gxbegindraw拿到的就是portrait下左上角(0,0),这个是固定死的。往哪里写直接按地址算加上即可
p = gxbegindraw;
pDst = p + y*240 + x;
OK.
yamazaki_dboy - 2005 年 01 月 13 日 - 03:59 PM
标题:
WinCE D_D,麻烦问你一下,为了实现屏幕旋转我修改了ce的显示驱动,就按照WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD 修改的,可旋转90度时,显示结果就简单的把0度时的屏幕转90度,而没有做竖屏到横屏的相应转换。 是不是可以和你交流一下,谢谢,谢谢
yamazaki_dboy - 2005 年 01 月 13 日 - 04:20 PM
标题:
请教:麻烦问一下,如果驱动支持旋转了,怎样由应用让驱动旋转呢,谢谢!
joyfly - 2005 年 01 月 14 日 - 09:46 AM
标题:
把workspace -> Shell and User Interface -> User Interface -> Quater VGA Resources (Portrait Mode) 去掉.

应用程序的实现,按no.killer 说的那样做就可以了
yamazaki_dboy - 2005 年 01 月 14 日 - 10:46 AM
标题:
组件workspace -> Shell and User Interface -> Quater VGA Resources (Portrait Mode),应该是应用层的吧(我在定制pda镜像的时候没有加它),
我现在的情况是:屏幕是旋转了,可就是单纯的转了90度,而没有竖到横的转换!怎么说呢,麻烦你吧qq或msn发给我吧,!谢谢,占你一些时间,谢谢!
yamazaki_dboy - 2005 年 01 月 14 日 - 10:58 AM
标题:
呵呵,在问一下,changedisplaysettings实现屏幕的旋转是不是要和显示驱动通信,在实现旋转时,这个函数肯定要调用显示驱动里的某一部分代码吗?谢谢!
joyfly - 2005 年 01 月 14 日 - 11:22 AM
标题:
那你指的"竖到横的转换"是指什么?

是需要显示驱动的支持,所以要参考S3C2410LCD 去加入这些支持.

SORRY,我现在不方便和你即时通讯.
yamazaki_dboy - 2005 年 01 月 14 日 - 11:39 AM
标题:
哦,没关系,就相当于,屏幕不转,把pda旋转90度,你想想,时不是就成了这样
________________________
| ______________ |
|| | |<---pda的实际屏幕
|| | |
|| | |
|| | |
||______________|________|
| |
| |<-----旋转后的显示区域!
|______________|

你看,确实旋转了,但是没有竖的到横的转换吧,也就是它的宽没有拉长,而高没有缩短的旋转了。
yamazaki_dboy - 2005 年 01 月 14 日 - 11:43 AM
标题:
啊,晕,我画的图被改变了。不知道你看明白没有?
也可以这样理解,你拿两本同样大小的书,把上面一本旋转90度,你看到的效果就时我说的!
joyfly - 2005 年 01 月 14 日 - 01:58 PM
标题:
附件里是我旋转前和旋转后的图象
joyfly - 2005 年 01 月 14 日 - 02:02 PM
标题:
白色的“WINDOWS CE”就是一张图片
屏幕旋转后,它的显示还是正常的。
yamazaki_dboy - 2005 年 01 月 14 日 - 02:19 PM
标题:
看到了,很羡慕啊!20号我就要交差了,可现在真的没办法了!
问一下:
1.你是不是按WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD 改了显示驱动?
2.在操作系统起来后,你是怎样让你的屏幕从竖屏旋转为横屏的?
3.我现在是这样改的:第一。按照WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD修改了显示驱动。也就是在DrvEscape成员函数里添加相应的动态旋转代码,并让我的显示类由gperotate继承而来(原来的是基于ddgpe的)
第二,在系统起来后,通过调用ExtEscape函数传递相应的参数给驱动的DrvEscape。我现在就是按照这种思路做的。
joyfly - 2005 年 01 月 14 日 - 02:27 PM
标题:
1.是的,差不多
2.在初始化函数里调用DynRotate(DMDO_90);
3,支持旋转,就要从gperotate继承, 就不支持DirectDraw了
yamazaki_dboy - 2005 年 01 月 14 日 - 02:37 PM
标题:
呵呵,可是不行啊!我把我旋转后的结果发到你的邮箱里吧,麻烦你有时间的时候帮我看看,也许我就要成功了,但进入死胡同了,麻烦指点一下。谢谢啊!
yamazaki_dboy - 2005 年 01 月 14 日 - 02:55 PM
标题:
你是系统起来时屏幕就转过来了?
你有没有在系统起来后让屏幕动态旋转?