佚名通过本文主要向大家介绍了wince6.0驱动,wince wifi驱动,wince驱动,wince usb驱动,wince网卡驱动等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: WINCE 显示驱动 旋转问题
描述:
这段代码是可以执行到 if 条件中的,说明驱动是支持屏幕旋转的,并且驱动也做了实现,驱动部分代码如下:
但 执行函数 ExtEscape(hdc, 6301, sizeof(EscCode), (LPSTR)&EscCode,0,NULL);时却返回-1 ,GetLastError() 值 为12
另外,Dynrotate()是没有问题的,已经测试过了,
。。。
请问各路高手,大侠,我接下来该怎么做才能让 ExtEscape(hdc, 6301, sizeof(EscCode), (LPSTR)&EscCode,0,NULL);正确执行
解决方案1:
描述:
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参数。
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