4885|3

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE 屏幕横竖转换 问题 API [复制链接]

目的旋转界面为竖屏。
API原定义:
LONG ChangeDisplaySettingsEx(
  LPCTSTR lpszDeviceName,
  LPDEVMODE lpDevMode,
  HWND hwnd,
  DWORD dwflags,
  LPVOID lParam
);
导入定义为:
[DllImport("COREDLL.DLL", CharSet = CharSet.Auto)]
        public static extern int ChangeDisplaySettingsEx(string lpszDeviceName,[In]   ref   DEVMODE lpDevMode,int hwnd, int dwFlags,int lParam);
调用为:
ChangeDisplaySettingsEx(null, ref d, 0, testAPIClass.CDS_RESET, 0);
问题是不知道对第一个参数lpszDeviceName有没有正确定义和调用?因为按目前的调用得到的结果是-2(DISP_CHANGE_BADMODE),这样代表不支持旋转。
在(Windows Embedded ce6.0)的板和模拟器中试过,都是这个结果。
现在主要请大家帮我看看第一个参数的用法是否正确?因为我调用的时候想将lpszDeviceName设置为NULL(MSDN上说的),可是C++中的NULL不知道和C#的null相同不?



感觉 为wce和wm的开发真不同,有些东西在wm中可以,在wce中就是不可以。而在网上大家以WM开发居多。所以没有办法解决问题。
另外在eeworld中已经很久没有得到答复的了,谁知道有其他的论坛好点的吗?不胜感激。

详细代码如下:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace SmartDeviceProject4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            long RetVal = 0;
           testAPIClass.DEVMODE d = new testAPIClass.DEVMODE();
            d.dmSize = (short)Marshal.SizeOf(typeof(SmartDeviceProject4.testAPIClass.DEVMODE));
            d.dmFields = testAPIClass.DEVMODE.DM_DISPLAYQUERYORIENTATION;
            RetVal = testAPIClass.ChangeDisplaySettingsEx(null, ref d, 0, testAPIClass.CDS_TEST, 0);
            MessageBox.Show(RetVal.ToString()); //这里输出的结果是-2,也就是DISP_CHANGE_BADMODE

            d.dmDisplayOrientation = testAPIClass.DMDO.D90;
            d.dmFields = SmartDeviceProject4.testAPIClass.DEVMODE.DM_DISPLAYFREQUENCY;
            RetVal = testAPIClass.ChangeDisplaySettingsEx(null, ref d, 0, testAPIClass.CDS_RESET, 0);
            this.Invalidate();
            MessageBox.Show(RetVal.ToString());//这里也输出的结果是-2
        }
    }

    public class testAPIClass
    {
        public static int CDS_RESET = 0x40000000;
        public static int CDS_TEST = 0x00000002;
        public enum DMDO
        {
            DEFAULT = 0,
            D90 = 1,
            D180 = 2,
            D270 = 3
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct DEVMODE
        {//copy from [CalvinDotNet]eeworld
            public const int DM_ORIENTATION = 0x00000001;
            public const int DM_DISPLAYFREQUENCY = 0x400000;
            public const int DM_PELSWIDTH = 0x80000;
            public const int DM_PELSHEIGHT = 0x100000;
            public const int DM_DISPLAYQUERYORIENTATION = 0x01000000;
            private const int CCHDEVICENAME = 32;
            private const int CCHFORMNAME = 32;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
            public string dmDeviceName;
            public short dmSpecVersion;
            public short dmDriverVersion;
            public short dmSize;
            public short dmDriverExtra;
            public int dmFields;

            public int dmPositionX;
            public int dmPositionY;
            public DMDO dmDisplayOrientation;
            public int dmDisplayFixedOutput;

            public short dmColor;
            public short dmDuplex;
            public short dmYResolution;
            public short dmTTOption;
            public short dmCollate;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
            public string dmFormName;
            public short dmLogPixels;
            public int dmBitsPerPel;
            public int dmPelsWidth;
            public int dmPelsHeight;
            public int dmDisplayFlags;
            public int dmDisplayFrequency;
            public int dmICMMethod;
            public int dmICMIntent;
            public int dmMediaType;
            public int dmDitherType;
            public int dmReserved1;
            public int dmReserved2;
            public int dmPanningWidth;
            public int dmPanningHeight;
        }

        [DllImport("COREDLL.DLL", CharSet = CharSet.Auto)]
        public static extern int ChangeDisplaySettingsEx(string lpszDeviceName,[In]   ref   DEVMODE lpDevMode,int hwnd, int dwFlags,int lParam);

    }
}
此帖出自WindowsCE论坛

最新回复

1.C#的代码我没有试过,但是native code调用ChangeDisplaySettingsEx,第一个参数是Null的话是可以的。你可以用C代码调用一下试试,看是你导出定义的问题还是参数设置的问题。 2. CE6支持分辨率的动态切换以及旋转,但是不支持色深的动态切换,所以不能用这个函数改变颜色深度。 3. 二楼的说法有问题,CE6里面可以同时支持旋转和DirectDraw,CE5的话是不能同时支持的。  详情 回复 发表于 2010-6-9 11:41
点赞 关注
 

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
高手们在忙,我帮你顶起来。。。
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
要显示驱动支持,也就Display驱动要从gperotate类继承,不过就不支持DDraw了。
此帖出自WindowsCE论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
1.C#的代码我没有试过,但是native code调用ChangeDisplaySettingsEx,第一个参数是Null的话是可以的。你可以用C代码调用一下试试,看是你导出定义的问题还是参数设置的问题。
2. CE6支持分辨率的动态切换以及旋转,但是不支持色深的动态切换,所以不能用这个函数改变颜色深度。
3. 二楼的说法有问题,CE6里面可以同时支持旋转和DirectDraw,CE5的话是不能同时支持的。
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表