分享

设备环境(DC)(2) VC

 昵称3972135 2010-12-05
1.BOOL GetDCOrgEx(HDC hdc, LPPOINT lpPoint); 
函数功能:该函数得到设备上下文环境的最终转换原点,最终转换原点指定了一个位移。系统使用该位移把设备转换成客户坐标。
        参数:
  hdc:指定设备上下文环境,该设备上下文环境的最终转换原点将要被检索。
  lpPoint:指向POINT结构的指针,该函数将把它置为最终转换原点,以设备坐标的形式。
  返回值:如果成功,返回非零值,如果失败,返回零。
  Windows NT:若想获得更多错误信息,请调用GetLastError函数。
  注释:最终转换原点与屏幕的物理原点有关。
 
2. LONG ChangeDisplaySettings (LPDEVMODE lpDevMode, DWORD dwflags);     
函数功能:该函数把缺省显示设备的设置改变为由lpDevMode设定的图形模式,要改变一个特定显示设备的设置,请使用ChangeDisplaySettingsEx函数。
  参数:
  lpDevMode:指向一个描述转变图表的DEVMODE的指针。DEVMODE的dmSize参数必须依DEVMODE结构的大小、字节进行初始化,dmDriveExtra参数必须初始化来显示DEVMODE随后的驱动数据的字节数,另外还可以选用以下参数:
  dmBitsPerPel每个像素的位数,dmPelsWidth像素宽度,dmPelsHeight像度高度,dmDisplayFlage模式标志。
  dmDisplayFrequency模式频率。
  dmposition在多显示配置中设备的位置(适用于Windows 98、Windows NT 5.0及以后版本)。
  除了设置好DEVMOD结构中诸多元素的值之外,还必须要正确地设置dmFields元素中的标志。这些标志表明了DEVMODE结构中哪个元素在改变显示设置时使用了。如果在dmFields中没有设置正确的位,那么显示设置将不会发生变化。请设置好以下的标志:
  DM_BITSPERPEL使用dmBitsPerPel的值,DM_PELSWIDTH使用dmPelsWidth的值,
  DM_PELSHEIGHT使用dmPelsHeight的值,DM_DISPLAYFLAGS使用dmDisplayFlags的值,
  DM_DISPLAYFREQUENCY使用dmDisplayFrequency的值。
  DM_POSITION使用fdmPosition的值(适用于Windows98、WindowsNT5.0)。
  如果lpDevMode为空。那么显示设置就使用注册表中的所有当前值。在显示模式动态地调整之后要想再回到缺省的模式,最简单的办法就是把lpDevMode参数置为空,使dwFlags参数置为0。
  dwflags:表明了图形模式如何改变,它可能是如下的几种形式中的一种:
  0:表明当前屏幕的图形模式要动态地改变。
  CDS_UPDATEREGISTRY:表明当前屏幕的图形模式会动态地变化,并且该图形模式会更新注册表。该模式信息存贮在用户档案中。
  CDS_TEST:系统检测是否要设置被请求的图形模式。
  CDS_FULLSCREEN:从本质上讲该模式是暂时的。
  CDS_GLOBAL:该设置保存在全局设置区域内, 因此它们会影响所有的用户。该标志仅在与标志一起使用时才有效。CDS_SET_PRIMARY:该设备成为首要设备。
  CDS_RESET:设置要改变,即使请求的设置与当前设置一样。CDS_NORESET:设置保存在注册表中,但是它不起作用,该标志只有与CDS_UPDATEREGISTRY标志一起使用时才有效。
  指定CDS_TEST允许一个应用确定哪个图形模式真正的有效。但并不会使系统变为那个有效的图形模式。
  如果CDS_UPDATEREGISTRY被指定并且它可能会动态地改变图形模式。则注册表中保存该信息并且返回DISP_CHANGE_SUCCESSFUL如果不可能使用图形模式动态地改变,则注册表中保存该信息并且返回DISP_CHANGE_RESTART。
  Windows NT:如果指定了CDS_UPDATEREGISTRY并且在注册表中不能保存该信息,则图形模式不会改变,并且返回DISP_CHANGE_NOTUPDATERD。
  返回值:ChangeDisplaySettings函数的返回值如下:
  DISP_CHANGE_SUCCESSFUL:设备改变成功。
  DISP_CHANGE_RESTART:为使图形模式生效计算机必须重新启动。
  DISP_CHANGE_BADFLAGS:标志的无效设置被传送。
  DISP_CHANGE_NOTUPDATED:在WindowsNT中不能把设置写入注册表。
  DISP_CHANGE_BADPARA:一个无效的参数被传递。它可以包括一个无效的标志或标志的组合。
  DISP_CHANGE_FAILED:指定图形模式的显示驱动失效。
  DISP_CHANGE_ADMODE:不支持图形模式。
  注释:为了保证传递给ChangeDisplaySetting的DEVMODE结构是有效的,并且仅包含显示驱动支持的值,可以使用由EnumDisplaySettings函数返回的DEVMODE。
  当显示模式被动态地改变时,WM_DISPLAYCHANGE消息带着如下的消息参数传递给所有正在运行的应用:
  wParam每像素点的新位数,LOWORD(lParam)新像素宽度,HIWORD(lParam)新像素高度。
 
         下面举一具体的例子来说明在VC中如何修改显示器的分辨率和色彩。假设我们想将当前显示器的分辨率设为800X600,并使用24位色(色彩为224种)。
  步骤1、新建一MFC AppWizard项目,本文为节约篇幅起见,在向导的第一步中选择基于对话框(Dialog Baseed)的程序。在向导的其余步骤中全部使用默认值。
  步骤2、在对话框中新添加一按钮,标题设为“测试”。
  步骤3、双击“测试”按钮,系统提示新建一函数OnButton1对应于该按钮的CLICK事件。OnButton1函数的具体代码如下:
  void CChange_fenbianDlg::OnButton1()
  {
  DEVMODE lpDevMode;
  lpDevMode.dmBitsPerPel=24;
  lpDevMode.dmPelsWidth=800;
  lpDevMode.dmPelsHeight=600;
  lpDevMode.dmSize=sizeof(lpDevMode);
  lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL;
  LONG result;
  result=ChangeDisplaySettings(&lpDevMode,0);
  if (result==DISP_CHANGE_SUCCESSFUL)
  {
  AfxMessageBox("修改成功!");
  ChangeDisplaySettings(&lpDevMode,CDS_UPDATEREGISTRY);
  //使用CDS_UPDATEREGISTRY表示次修改是持久的,
  //并在注册表中写入了相关的数据
  }
  else
  {
  AfxMessageBox("修改失败,恢复原有设置!");
  ChangeDisplaySettings(NULL,0);
  }
  }
  说明:上述函数中对ChangeDisplaySettings的返回值result没有作过多的分析,在实际操作中出于程序稳健的角度出发,可以对ChangeDisplaySettings的返回值作出更加详细的判断,以找出修改不成功的原因
 
3.LONG ChangeDisplaySettingsEx(LPCSTR lpszDeviceName, LPDEVMODE lpDevMode, HWND hwnd, DWORD dwflags LPVOID lParam);
函数功能:该函数把显示设备在lpszDeviceName参数中定义的设置,改变为在lpDevMode参数中定义的图形模式。
  参数:
  lpszDeviceName:指向一个以null结尾的字符串的指针,该字符串指定了一个显示设备,该函数从该显示设备中得到它的图形模式的信息。
  查看EnumDisplayDevice函数,可得与这些显示设备有关的名字的更详细的信息,lpszDeviceName参数可以为NULL(空),NULL值定义了缺省的显示设备。
 
         
旋转屏幕90度ChangeDisplaySettingsEx实例——WinCE
        DEVMODE DevMode;
        memset(&DevMode, 0, sizeof (DevMode));
        DevMode.dmSize               = sizeof (DevMode);
        DevMode.dmFields             = DM_DISPLAYORIENTATION;
       
        if (DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_TEST, NULL))
        {
            RETAILMSG(1, (L"ChangeDisplaySettingsEx failed to get the supported rotation angles (error=%d).\n", GetLastError()));
        }
        else
        {
            if(DevMode.dmDisplayOrientation == 0)
            {   
                DevMode.dmDisplayOrientation = DMDO_90;
                if (ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_RESET, NULL) != DISP_CHANGE_SUCCESSFUL)
                {
                    RETAILMSG(1, (L"ChangeDisplaySettingsEx failed to change the rotation angle (error=%d).\r\n", GetLastError()));
                }

            }
        }

4.BOOL EnumDisplayDevices(PVOID Unused, DWORD iDevNum, PDISPLAY_DEVICE lpDisplayDevice, DWORD dwFlags);
函数功能:该函数可得到系统中显示设备的信息。
  参数:
  Unused:该参数当前不用,应设为Null。
  iDevNum:指定感兴趣的显示设备的索引值,操作系统通过索引值确定每一个显示设备。索引值是连续的整数。从0开始,例如:如果一个系统有三个显示设备,那么它们的索引值为0、1、2。
  lpdisplayDevice:DISPLAY_DEVICE结构的指针,该结构检索由iDevNum指定的显示设备的信息,在调用EnumDisplayDevices之前,必须以字节为单位把DISPLAY_DEVICE结构中cb元素初始化为DISPLAY_DEVICE结构的大小。
  dwFlags:约束函数行为的一组标志,当前没有定义标志。
  返回值:如果成功,则返回值非零;如果失败,则返回值为零;如果iDevNum大于最大的设备索引,则函数失败。
  注释:为了查询系统的所有显示设备,在一个循环中调用该函数开始时iDevNum设为0,并增加iDevNum,直到函数失败。
 
5.BOOL EnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, LPDEVMODE lpDevMode);
函数功能:该函数得到显示设备的一个图形模式设备,通过对该函数一系列的调用可以得到显示设备所有的图形模式信息。
  参数:
  lpszDeviceName:指向一个以null的结尾的字符串,该字符串指定了显示设备。此函数将获得该显示设备的图形模式信息。该参数可以为NULL。NULL值表明调用线程正运行在计算机的当前显示设备上。如果lpszDeviceName为NULL,该字符串的形式为\\.\displayx,其中x的值可以为1、2或3。对于Windows 95和Windows 98,lpszDeviceName必须为NULL。
  iModeNum:表明要检索的信息类型,该值可以是一个图形模式索引,也可以是下列一值:
  ENUM_CURRENT_SETTINGS:检索显示设备的当前设置。
  ENUM_REGISTRY_SETTINGS:检索当前存储在注册表中的显示设备的设置。
  图形模式索引值从零开始,要得到一个显示设备的所有图形模式信息,可以一系列地调用EnumDisplaySettings函数,并且iModeNum显为一个非零值时,则函数返回的信息是最近一次使用iModeNum置为零调用该函数时存储的信息。
  lpDevMode:DEVMODE结构的指针,该结构存储指定图形模式的信息,在调用EnumDisplaySettings之前,设置dmSize为sizeof(DEVMODE),并且以字节为单位,设置dmDriveExtra元素为接收专用驱动数据可用的附加空间。
  EnumDisplaySettings函数设置如下五个DEVMODE元素的值:dmBitsPerpel、dmPelsWidth、dmPelsHeight、dmDisplayFlags、dmDisplayFrequency。
  返回值:如果成功,返回非零值;如果失败,返回零。
  Windows NT:若想获得更多错误信息,请调用GetLastError函数。
  注释:如果iModeNum大于显示设备最后的图形模式索引,那么函数就会失败,如同在iModeNum参数中描述的那样,使用这种方法可以枚举显示设备所有的图形模式。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多