首页 > 日常 > c#创建大于屏幕尺寸的窗体

c#创建大于屏幕尺寸的窗体

2014年11月16日 发表评论 阅读评论

最近的一个星期,衣服自己洗一直在折腾一件事情,最终才得以解决,现在拿出来和大家分享。

问题是这样的,如何生成一个winform 窗体,使得它的尺寸要比当前屏幕还要大。

我是在 c# 中碰到的,但是对于其它语言应该也是一样的。开始的时候我也为是MDI的限制,后来发现这个限制对一般窗体都适用,网上资料也显示,对于窗体的尺寸设置,无论是 Size 还是单独的宽度、高度,如果超过了屏幕的尺寸,系统会自动给截断。

例如,对于1366*768 分辨率、100%的DPI,如果你创建了一个窗体,并设置其尺寸为 1400*900,那么最终的窗体尺寸会是 1478*780,多余的就不显示了,当然也不会崩溃。系统对于宽度和高度会允许多添加 12像素。如果是 125%的DPI,那么这个值是 16像素。但是不会允许更多。

由于对于windows桌面应用程序驾驭能力的不足,只好请教他人。对于这个问题,大家集中表现为两种情况,一种是表示从来没有接触过MDI表示不会,毕竟是从MDI程序发现的;另外的尝试一把发现确实不太好解决劝我放弃。只好自己一个人坚持下去寻找原因。

我相信这个需求一定是可以实现,并且很简单,只是我暂时没有找到方法而已。

后来看到一个Delphi的程序实现了我想要的效果,我通过spy++比较程序间的差异,并辗转和人家交流才明白,原来是要去掉一个样式并重新设置大小。但是我这边一直没有效果。后来才发现是常量声明错误,我给设置成负值了。汗~

首先,获取窗体的当前样式,然后去掉WS_THICKFRAME样式,之后再重新设置窗体的位置和尺寸即可。如我开始所想,确实很简单,只是想到这里不太容易。如果是 c++ 之类的语言,可以在窗体(包括MDI窗体)构造的时候设置就可以了,c# 给封装起来了,所以只好放后面设置。

申明如下:

[DllImport(“user32.dll”, SetLastError = true, CharSet = CharSet.Auto)]
public static extern int SetWindowLong(IntPtr hwnd, int nIndex, int newLong);

[DllImport(“user32.dll”, SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetWindowLong(IntPtr hwnd, int nIndex);

[DllImport(“user32.dll”)]
public static extern int SetWindowPos(IntPtr hwnd, int hwndInsertAfter, int x, int y, int width, int height, int flags);

[DllImport(“shell32.dll”)]
public static extern IntPtr ShellExecute(IntPtr hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);

public static int GWL_STYLE = (-16);
public static int WS_THICKFRAME = 262144;
public static int HWND_TOP = 0;
public static int SWP_SHOWWINDOW = 64;
public static int SW_SHOW = 5;

封装起来,这样调用会比较方便,
public void SetNewSize(int width, int height)
{
int style = GetWindowLong(this.Handle, GWL_STYLE);

SetWindowLong(this.Handle, GWL_STYLE, style & ~WS_THICKFRAME);
SetWindowPos(this.Handle, HWND_TOP, 0, 0, width, height, SWP_SHOWWINDOW);
}

最后说几个小细节作为结尾吧,对于c#而言,这个调用不能放在构造函数里,因为会被后面系统自动设置给覆盖掉,应该在 frmChild.Show()之后才有效。衣服自己洗这里也是坑了很久。另外大家可以看代码是如何去掉WS_THICKFRAME样式的,还可以思考下为什么要先获取窗体样式而不直接设置。

这下算是解决了心里的一个疙瘩,不知道做技术的是不是都这样。

分类: 日常 标签: , , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.