• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > WINCE显示驱动旋转问题

WINCE显示驱动旋转问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了wince6.0驱动,wince wifi驱动,wince驱动,wince usb驱动,wince网卡驱动等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: WINCE 显示驱动 旋转问题
描述:

WINCE显示驱动旋转屏幕DrvEscapeLCD

void CrotateScreenDlg::OnBnClickedBtnRotate()
{
HDC hdc;
INT EscCode = 6301;
hdc = ::GetDC(m_hWnd);
if( ExtEscape(hdc, 8, sizeof(EscCode), (LPSTR)&EscCode, 0, NULL))
{
EscCode = DMDO_180;
ExtEscape(hdc, 6301, sizeof(EscCode), (LPSTR)&EscCode,0,NULL);
}
::ReleaseDC(m_hWnd,hdc);
}

这段代码是可以执行到 if 条件中的,说明驱动是支持屏幕旋转的,并且驱动也做了实现,驱动部分代码如下:
ULONG
TCCDISP::DrvEscape(SURFOBJ * pso, ULONG iEsc, ULONG cjIn, void *pvIn, ULONG cjOut, void *pvOut)
{
ULONG Result = 0;
RETAILMSG(TC_LOG_LEVEL(TC_DEBUG), (TEXT("[DISPLAY     ] ++TCCDISP::DrvEscape(0x%08x)\n\r"), iEsc));
if (iEsc == QUERYESCSUPPORT)
{
if ( (*(DWORD*)pvIn == DRVESC_GETSCREENROTATION)
|| (*(DWORD*)pvIn == DRVESC_SETSCREENROTATION)
|| (*(DWORD*)pvIn == DRV_LDCD_GET_BASEADDRESS)
|| (*(DWORD*)pvIn == IOCTL_POWER_SET)
|| (*(DWORD*)pvIn == IOCTL_POWER_GET)
)
{
// The escape is supported.
return 1;
}
else
{
// The escape isn't supported.
return 0;
}
}
else if (iEsc == DRV_LDCD_GET_BASEADDRESS)
{
cjOut = sizeof(DWORD);
*(DWORD*)pvOut = m_dwCurrentBaseaddress;
return ESC_SUCCESS;
}
else if (iEsc == DRVESC_GETSCREENROTATION)
{
RETAILMSG(TC_LOG_LEVEL(TC_DEBUG), (TEXT("[DISPLAY     ] DrvEscape() : DRVESC_GETSCREENROTATION\n\r")));
*(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8) | ((BYTE)m_iRotate);
return DISP_CHANGE_SUCCESSFUL;
}
else if (iEsc == DRVESC_SETSCREENROTATION)
{
RETAILMSG(TC_LOG_LEVEL(TC_DEBUG), (TEXT("[DISPLAY     ] DrvEscape() : DRVESC_SETSCREENROTATION\n\r")));
if(pvIn != NULL && cjIn == sizeof(DRVESC_SETSCREENROTATION)) {
if ((*(DWORD*)pvIn == DMDO_0)   ||
(*(DWORD*)pvIn == DMDO_90)  ||
(*(DWORD*)pvIn == DMDO_180) ||
(*(DWORD*)pvIn == DMDO_270) )
{
return DynRotate(*(DWORD*)pvIn);
}
}
return DISP_CHANGE_BADMODE;
}
else if(iEsc == IOCTL_POWER_SET) 
.....

LONG
TCCDISP::DynRotate(int angle)
{
GPESurfRotate * pSurf = (GPESurfRotate *)m_pPrimarySurface;
RETAILMSG(TC_LOG_LEVEL(TC_LOG), (TEXT("[DISPLAY     ] ++TCCDISP::DynRotate(%d)\n\r"), angle));
// DirectDraw and rotation can't co-exist.
if (m_InDDraw)
{
RETAILMSG(TC_LOG_LEVEL(TC_ERROR), (TEXT("[DISPDRV:ERR] DynRotate() : Can NOT Rotate in DirectDraw Mode\n\r")));
return DISP_CHANGE_BADMODE;
}
CursorOff();
m_iRotate = angle;
switch(m_iRotate)
{
case DMDO_0:
case DMDO_180:
m_nScreenHeight = m_nScreenHeightSave;
m_nScreenWidth  = m_nScreenWidthSave;
break;
case DMDO_90:
case DMDO_270:
m_nScreenHeight = m_nScreenWidthSave;
m_nScreenWidth  = m_nScreenHeightSave;
break;
}
m_pMode->width  = m_nScreenWidth;
m_pMode->height = m_nScreenHeight;
pSurf->SetRotation(m_nScreenWidth, m_nScreenHeight, angle);
CursorOn();
RETAILMSG(TC_LOG_LEVEL(TC_DEBUG), (TEXT("[DISPLAY     ] --TCCDISP::DynRotate()\n\r")));
return DISP_CHANGE_SUCCESSFUL;
}

但 执行函数 ExtEscape(hdc, 6301, sizeof(EscCode), (LPSTR)&EscCode,0,NULL);时却返回-1 ,GetLastError() 值 为12
另外,Dynrotate()是没有问题的,已经测试过了,
。。。
请问各路高手,大侠,我接下来该怎么做才能让 ExtEscape(hdc, 6301, sizeof(EscCode), (LPSTR)&EscCode,0,NULL);正确执行


解决方案1:

ChangeDisplaySettingsEx 
https://msdn.microsoft.com/en-us/library/ms908108.aspx
DEVMODE的dmOrientation参数。

解决方案2:


BOOL ScreenRotate( int NewAngleDegrees )
{
                DEVMODE DevMode;
                int CurrentAngle;
                int RotationAngles;
                int NewAngle;
 
                if( NewAngleDegrees % 90 )
                {
                                RETAILMSG( 1, (TEXT("ScreenRotate Invalid Angle %d\n"), NewAngleDegrees ));
                                RETAILMSG( 1, (TEXT("Angle must be a multiple of 90 degrees\n")));
                                return FALSE;
                }
 
                NewAngleDegrees %= 360;
                NewAngle = NewAngleDegrees / 90;
                if( NewAngle == 3 )
                                NewAngle = 0x4;
 
                //
         &nbs
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • WINCE显示驱动旋转问题

相关文章

  • 2017-06-05 就这么多分了,求ADS
  • 2017-06-05 vxworks启动中的BOOT_LINE是什么东西?
  • 2017-06-05 关于宽电压输入的问题输入(45V~30V)输出5V
  • 2017-06-05 STM32F103和CC2530之间的串口通信问题
  • 2017-06-05 驱动中怎么响应其他设备的中断??
  • 2017-06-05 android底层开发之打开蓝牙
  • 2017-06-05 新手求教网络编程,类似防火墙功能
  • 2017-06-05 关于分组交换中的报文长度的问题
  • 2017-06-05 RegMon改造问题,请教大家
  • 2017-06-05 求WalterOney的《MicrosoftWindows驱动程序模型设计》的源代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 用stm32模仿Joystick自制usb接口的HID六轴24按键游戏摇杆,貌似快成功了……
    • 哪里有Windows2000DDK下载的????
    • 驱动程序自动安装的问题
    • 大神帮我看看!proteus51单片机adc0808转换不准确问题
    • 急问关于嵌入式linux的问题
    • win2000ddK写的MODEM安装程序如何在XP中用
    • FPGA板子必须用手按着才能正常工作,求分析原因
    • STM32F103ZE战舰版IIC通信配置问题
    • wince代码如何写noen汇编
    • 本人最近在做驱动(ds),希望能同大家交流心得。

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有