有没有方法可以用VB.NET实现更改屏幕的分辨率

dangdangdangdang 2003-10-15 09:28:15
如题
请赐教
不胜感谢!
...全文
61 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnhgj 2003-10-17
  • 打赏
  • 举报
回复
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;

namespace ScreenResolution
{

public class Form1 : System.Windows.Forms.Form
{
public enum DMDO
{
DEFAULT = 0,
D90 = 1,
D180 = 2,
D270 = 3
}

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
struct DEVMODE
{
public const int DM_DISPLAYFREQUENCY = 0x400000;
public const int DM_PELSWIDTH = 0x80000;
public const int DM_PELSHEIGHT = 0x100000;
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("user32.dll", CharSet=CharSet.Auto)]
//static extern int ChangeDisplaySettings( DEVMODE lpDevMode, int dwFlags);

static extern int ChangeDisplaySettings( [In] ref DEVMODE lpDevMode, int dwFlags);
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
private void InitializeComponent()
{
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Text = "改变屏幕分辨率的例子";

}
#endregion

static void Main()
{
Form1 r = new Form1();
r.ChangeRes();
Application.Run(new Form1());
}

void ChangeRes()
{
Form1 t = new Form1();
long RetVal=0;
DEVMODE dm = new DEVMODE();
dm.dmSize= (short)Marshal.SizeOf(typeof(DEVMODE));
dm.dmPelsWidth = 1024;
dm.dmPelsHeight= 768;
dm.dmDisplayFrequency=85;
dm.dmFields = DEVMODE.DM_PELSWIDTH | DEVMODE.DM_PELSHEIGHT | DEVMODE.DM_DISPLAYFREQUENCY;
RetVal = ChangeDisplaySettings(ref dm, 0);
}
}
}


Louis,

You have many of the member and parameter datatypes one size too big.
longs should be ints, and ints should be shorts.

Also, I'd recommend that you switch to CharSet.Auto throughout, to get
best performance.

This code works for me.

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DEVMODE
{
// specify the size of the string arrays to 32
public const int SA_SIZE = 32;

// struct (class) members
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst=SA_SIZE)]
public string lpzDeviceName;

public short iSpecVersion;
public short iDriverVersion;
public short iSize;
public short iDriverExtra;
public int iFields;
public short iOrientation;
public short iPaperSize;
public short iPaperLength;
public short iPaperWidth;
public short iScale;
public short iCopies;
public short iDefaultSource;
public short iPrintQuality;
public short iColor;
public short iDuplex;
public short iYRes;
public short iTTOption;
public short iCollate;

// specify marshalling attrib appropriately for this
type
[MarshalAs(UnmanagedType.ByValTStr,
SizeConst=SA_SIZE)]
public string lpszFormName;

public short iLogPixels;
public int iBitsPerPixel;
public int lPelsWidth;
public int lPelsHeight;
public int lDisplayFlags;
public int lDisplayFreq;
public int lICMMethod;
public int lICMIntent;
public int lMediaType;
public int lDitherType;
public int lReserved1;
public int lReserved2;
public int lPanWidth;
public int lPanHeight;
}

class LibWrapper
{
// do a little P/Invoke stuff here...
// specify the dll containing the desired function and
// the fact that we want to use the default character
set for the call
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern bool
EnumDisplaySettings(string lpszDeviceName,
int lModeNum,
ref DEVMODE lpdm);

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int
ChangeDisplaySettings([In] ref DEVMODE lpdm,
int iFlags);

}

[STAThread]
static void Main(string[] args)
{
DEVMODE dm = new DEVMODE();

dm.iSize = (short)Marshal.SizeOf(typeof(DEVMODE));
int lMode = -1;

bool b = LibWrapper.EnumDisplaySettings(null, lMode,
ref dm);

}
dangdangdangdang 2003-10-17
  • 打赏
  • 举报
回复
非常感谢!
saucer 2003-10-15
  • 打赏
  • 举报
回复
use ChangeDisplaySettings API

http://abstractvb.com/code.asp?A=947

http://go.6to23.com/jinqu/vb/8.htm
说 明: 〖accResize1.0〗

这是针对access97所做的自动调整窗体和控件大小的控件,使你的窗口在缩放的时候各控件位置和大小会自动调整。这样你的程序即可在640*480分辨率下运行,也可在800*600下运行,而且在任何大小情况下,窗体里的控件都会随着窗体的大小而变化,保证你可以看到整个窗体的所有内容。只要改变窗体的大小,包括标签、文本框、下拉框、列表框、选项框、检查框、图片、普通子窗体、数据子窗体等控件都会自动按相应的比例实时改变大小。
写这个控件的初衷主要是以前在开发VB程序时用到resize的控件,觉得比较好用,而当时找遍所有的资料,都找不到类似针对ACCESS的控件(VB的RESIZE控件在ACCESS中会出现一些奇怪的现象,主要是因为ACCESS窗体的特别结构),而当时我开发的一个项目需要同时适应800*600 和640*480 两种分辨率,所以触发我自己写这方面的程序。经过几次比较大的改动,现在大致可以满足我的需要。一年后,我在网络上找到Ken Getz, Paul Litwin, and Mike Gilbert写的Scale and Resize Your Access Forms演示程序,知道原来在这个世界,还有人与我有同样的想法,他们的功能做得挺棒,只可惜看不到他们的源码。不过知道他们是用API来做的。我比较了两者之间的速度,应该是差不多的。为了让大家了解,我迟点会把他们的演示程序上传。




〖accResize1.0〗说明文件


一、【主要功能】
实现窗口在缩放的时候各控件位置和大小自动调整功能
二、文件列表

resize.mde 控件缩放的核心代码
testresize.mdb 测试缩放效果的例子程序

三、〖accResize1.0〗使用方法

1. 确保你已经安装了access97
2. 将下载的文件用WINRAR解压后放在同一个目录
3. 用ACCESS打开(或双击)testresize.mdb,运行其中的窗体文件即可
4. 如果你想在你的程序中使用这个功能,只要把resize.mde抄到你的程序目录下,然后打开你的程序,在工具菜单中选择[引用],引用resize.mde即可(你需进入代码状态才能看到工具菜单中的引用子菜单),最后在你自己程序的窗体中的resize事件中加入 resize.Form_myResize Me 这句程序即可。

5. 请注意,为了加快窗体缩放的速度,所以程序有个特别注意的地方: 当你在窗体中添加新的控件或改变了位置,需在重新关闭你的程序(即关闭MDB后)再打开才能生效。
实际我试过,即使增加新的控件就自动更新,速度亦差不多


四、错误反馈

1. 如果你发现软件中的错误,欢迎你反馈给作者。


五、【使用许可/LICENSE】

请仔细阅读以下使用许可,如果您不同意以下任何一点,请
立即停止使用此软件。

1.〖accResize1.0〗的作者王宇虹授予您对此版本的最终用户使用
许可权;
2.您不能对软件作任何的软件反向工程,如反汇编,跟踪等;
3.您可以分发此软件,但不能收取任何费用或用于商业目的,
同时,必须保证所分发的软件包含全部文件,并且不作任何
修改;分发的软件应该至少包括我软件所附带的README.txt
4.本软件不包含任何使用保证,不能保证适用或不出故障,由
于此软件是免费提供,因此作者不对您或别的用户使用此
软件所带来的理论上或实际的损失负责;
5.如果您用了此软件就等于您同意以上几点许可;
6.如果你觉的该软件好用,请发一封Email给作者表示感谢,这些支持将会使作者
写出更好软件,谢谢!

六、【软件注册费用】
完全免费!!
本软件所有功能都可以免费使用,完全没有限制。

七、【源码费用】

如果你对此软件的源码感兴趣,你可以向作者免费索取。
你只要发封EMAIL给作者,说明你需要索取这个程序的源码,作者即会把源码EMAIL给你。
电子信箱:wang_yu_hong@163.net
tmtony@21cn.com


你可以到我的主页
http://www.zstmcomputer.com
或 http://tmcomputer.6to23.com

免费获得其它完整的应用软件或一些已公开的源码。



八、【主要技术】
具体请参照程序


系统编写开始时间: 12/03/2001
完成及验收时间: 18/04/2001

九、【感谢】
此软件的诞生得到了同事以及客户的支持和测试,在此表示感谢。
 

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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