进来讨论一下WINCE如何动态改变分辨率?

乐乐萍萍爸 2009-12-07 07:29:54
RT,最近小弟我在做WINCE(WINCE6)下动态改变分辨率的功能,起源于本公司的WINCE6平台支持HDMI输出,当HDMI以不同分辨率(1280*720,1920*1080,720*480。。。)输出时,希望wince能动态的改变分辨率,以使UI层能够在HDMI TV上全屏显示。
工作了一天,添加了一个驱动,在应用层使用DeviceIoControl要求底层驱动根据新的分辨率对LCD控制器重新配置,这段代码验证没有问题。但是结果是花屏,我在想修改完LCD控制器的配置后,如何通知WINCE内核(或者说GDI),要求其重载重绘?如果能让WINCE重绘重载显示驱动,那么估计我就能成功了。。。。请问该如何操作呀?不知道哪位哥们做过类似的开发?一起分享一下经验吧。。。。。
...全文
951 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
linwei1234 2010-06-15
  • 打赏
  • 举报
回复
wince5.0我实现了

NumModes
GetModeInfo
SetMode

打印也显示系统已经的到了4种分辩率模式,默认是SetMode=0

ChangeDisplaySettingsEx能调用驱动SetMode=1吗?
找了半天没看到哪里有介绍的
sunboyljp 2010-06-13
  • 打赏
  • 举报
回复
学习呀
shoushui2009 2010-05-23
  • 打赏
  • 举报
回复
学习!
海阔任龟游 2010-05-13
  • 打赏
  • 举报
回复
完全同意说LZ是好人
ab7736538 2010-05-11
  • 打赏
  • 举报
回复
楼主很厚道 好人啊
乐乐萍萍爸 2009-12-19
  • 打赏
  • 举报
回复
这周非常爽,我已经在TCC8900 WINCE平台做出了动态改变WINCE分辨率。如同ruritanian群友所说的,

1.需要DISP驱动中准备好自己需要的分辨率模式,比如说800*480和1280*720两种模式。放在一个GPEModeEx m_ModeInfoEx[2];数组中 其中m_ModeInfoEx中每个元素的modeId为0和1,以此类推

2.然后可以在TCCDISP::TCCDISP()构造函数中适当对m_ModeInfoEx进行初始化;

3.TCCDISP::NumModes()中必须返回2,也就是数组m_ModeInfoEx的元素大小;TCCDISP::GetModeInfo(GPEMode *mode, int modeNo)函数根据modeNo来判断是否支持;TCCDISP::SetMode就是根据modeId要求来新建m_pPrimarySurface,然后分配给m_pVisibleSurface;

4.应用程序部分我是用以下代码调用的:

case ID_RESOLUTION_1280:
MessageBox(hWnd, TEXT("ID_RESOLUTION_1280"),TEXT("Resolution"),MB_OK);
while (TRUE == EnumDisplaySettings(NULL, maxModeIndex, &DevMode))
{
maxModeIndex++;
if((DevMode.dmPelsWidth == 1280)&&(DevMode.dmPelsHeight == 720))
{
SaveLCDStatus( 1280,720);//修改注册表键值
Ret = ChangeDisplaySettingsEx(NULL,&DevMode,NULL,CDS_RESET,NULL) ;
if(Ret != DISP_CHANGE_SUCCESSFUL)
{
printf("Mode %d: Display mode resolution test failed.", maxModeIndex));
}else{
printf("ChangeDisplaySettingsEx dwRet = %d \r\n", Ret);
break;
}

}

}
break;

case ID_RESOLUTION_480:
while (TRUE == EnumDisplaySettings(NULL, maxModeIndex, &DevMode))
{
maxModeIndex++;
if((DevMode.dmPelsWidth == 800)&&(DevMode.dmPelsHeight == 480))
{
SaveLCDStatus( 800,480);
Ret = ChangeDisplaySettingsEx(NULL,&DevMode,NULL,CDS_RESET,NULL) ;
if(Ret != DISP_CHANGE_SUCCESSFUL)
{
printf("Mode %d: Display mode resolution test failed."), maxModeIndex);
}else{
printf("ChangeDisplaySettingsEx dwRet = %d \r\n", Ret);
break;
}
}
}
break;
gooogleman 2009-12-10
  • 打赏
  • 举报
回复
貌似飞凌的网站上看到过,不过俺不懂,建议楼主去咨询一下。

动态修改 LCD 显示我就做了,哈哈哈
乐乐萍萍爸 2009-12-10
  • 打赏
  • 举报
回复
gooogleman,

共享一下你的“动态改变WINCE LCD分辨率”开发经验给大家呀。。。
hahagoodhaha 2009-12-09
  • 打赏
  • 举报
回复
Mark
乐乐萍萍爸 2009-12-08
  • 打赏
  • 举报
回复
ruritanian,你说的对。

我现在的问题就是如何通知WINCE内核或者GDI,GWES,我系统的分辨率改变了,需要display.dll重载或者其他类似的动作???不能重启系统。
ruritanian 2009-12-08
  • 打赏
  • 举报
回复
如果你直接用IOCTL,花屏基本上是免不了的,因为你没有通知系统,而系统的gwes负责了很大一块UI和消息的处理。
乐乐萍萍爸 2009-12-08
  • 打赏
  • 举报
回复
早上上班,发现这么多朋友给我意见,先谢过了。。。。

我做的是Telechips的TCC89XX系列WINCE平台。

1. 我不用考虑视频的缩放,这个已经做好;TCC89XX芯片的LCDC有三层:IMG0,IMG1,IMG2;
IMG0放视频;IMG1放WINCE UI;IMG2放字幕。
IMG0放视频,已经有M2MSCALER缩放器了,多大多小的分辨率都可以缩放;
IMG1放WINCE UI层,没有M2MSCALER缩放器;

2. 我希望在不重新启动机器的情况下,动态用IOCTL改变WINCE的分辨率;

3. 用IOCTL在上层应用动态改变WINCE的分辨率只是暂时的打个草稿,等做成功了, 我会移植到ChangeDisplaySettingsEx API架构下;
WceUi 2009-12-08
  • 打赏
  • 举报
回复
mark,学习
ruritanian 2009-12-08
  • 打赏
  • 举报
回复
你说的是设备重起么?如果设备重起叫什么动态设置分辨率啊
不过display driver里面是要重新reset一下的。
yashi 2009-12-08
  • 打赏
  • 举报
回复
我见过有做成动态设置分辨率的,不过设置完以后,都要重新启动一下才可以,不知道不重新启动有没有办法做到。
rushonin 2009-12-08
  • 打赏
  • 举报
回复
关注一下
乐乐萍萍爸 2009-12-08
  • 打赏
  • 举报
回复
ruritanian,

能给我讲讲display驱动中实现DDGPE继承类的各个成员函数或者GDI函数的调用流程吧?
乐乐萍萍爸 2009-12-08
  • 打赏
  • 举报
回复
哪个API会调用SetMode?还有加入我准备好几套分辨率的参数,应该在哪里初始化呢?

http://www.intelligraphics.com/introduction-wince-driver-development
ruritanian 2009-12-08
  • 打赏
  • 举报
回复
你先把GetModeInfo和NumModes按照我说的实现了,然后再调一下SetMode,看上去你的代码里SetMode已经分配Primary surface了。SetMode里面的代码各家都不一样,需要调试一下。
OneOnce 2009-12-08
  • 打赏
  • 举报
回复
这个帖子要严重一下。
加载更多回复(4)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧