WindowsMobile/Win Form-界面自适应

起因

使用SmartPhone上的WinForm做了一个WM的小程序,结果放到手机上实际一运行。发现动态生成的控件在里面显示得都非常小,难以看清。

原因

我的问题是需要在InitializeComponent方法结束后,动态生成一些控件,如下:

/// <summary>
/// 这个方法会根据传入的实体模型,生成一些选择框,设置它们的大小、位置;并会改变其它控件的大小、位置。
/// </summary>
/// <param name="categories"></param>
private void GenerateCheckBoxes(IList<Category> categories)
{

   ……
}

原因就是因为手机分辨率较大,而这些动态生成的控件并没有进行随着分辨率不同而进行自动缩放。而由界面设计器设计出来的控件,都能很好的显示。

求索

由于界面生成的控件能够很好的自适应分辨率的不同,所以先看一下Designer生成的代码:

private void InitializeComponent()
{
   this.BAdd = new System.Windows.Forms.Button();
   this.PCategories = new System.Windows.Forms.Panel();
   this.SuspendLayout();

   // BAdd 
   this.BAdd.Location = new System.Drawing.Point(165, 164);
   this.BAdd.Name = "BAdd";
   this.BAdd.Size = new System.Drawing.Size(72, 20);
   this.BAdd.TabIndex = 11;
   this.BAdd.Text = "Add";
   this.BAdd.Click += new System.EventHandler(this.BAdd_Click);
   // PCategories 
   this.PCategories.Location = new System.Drawing.Point(73, 83);
   this.PCategories.Name = "PCategories";
   this.PCategories.Size = new System.Drawing.Size(164, 75);
   // MainForm 
   this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
   this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
   this.AutoScroll = true;
   this.ClientSize = new System.Drawing.Size(243, 258);
   this.Controls.Add(this.PCategories);
   this.Controls.Add(this.BAdd);
   this.Name = "MainForm";
   this.Text = "MoneyManagerForm";
   this.ResumeLayout(false);
}

这里的重点是使用了AutoScaleDimensions和AutoScaleMode属性来设置界面为自动缩放。(Dpi表示Dot per inch,WPF就是直接使用这种方式来控制界面的。)然后最后一步调用ResumeLayout方法,这个方法中,会调用到 ContainerControl.PerformAutoScale方法进行自动缩放。

最可恶的一点:从控件的构造,到界面的自动缩放,全部在一个方法中实现!而且这个方法中,没有什么好的办法来调用我生成控件的方法……

时间: 2024-10-18 17:40:46

WindowsMobile/Win Form-界面自适应的相关文章

我用VS打开VB.net程序,当我打开一个FORM界面窗口时,然后再关掉FORM界面窗口,则整个VS都关掉了?高手帮忙解决下.谢谢

问题描述 我用VS打开VB.net程序,当我打开一个FORM界面窗口时,然后再关掉FORM界面窗口,则整个VS都关掉了?高手帮忙解决下.谢谢我们用visualsourcesafe备份代码的.如果我的代码是从visualsourcesafe上面拿下来的就会出现这种问题...请高手帮忙解决下,谢谢谢谢,很急!!! 解决方案 解决方案二:难道同样的版本放在本地打开就不存在这个情况?从SourceSafe里面拿出来的打开才会出现?一步一步跟一下咯?解决方案三:重装VS?解决方案四:把项目重新生成一次后再

界面自适应屏幕

问题描述 用netbeans开发界面,19存的显示器显示刚好,怎么放到14存的屏幕上界面就显示不完全啊怎么让界面自适应显示屏大小变化?在网上看了很多界面都是通过写代码实现,但是界面上控件很多,写代码很麻烦,请问这种情况怎么解决,在netbeans开发界面的时候能设置吗?开始语言:java 问题补充:283433775 写道 解决方案 如果用代码那就太麻烦了.这个你可以多看看,像delphi winform怎么实现的.主要通用的两种方式,Dock和Anchor.Dock是填充,主要通过布局来实现,

win form MD5加密两种方法

using System;using System.Text;using System.Windows.Forms;using System.Security.Cryptography;using System.Web.Security; namespace WindowsFormsApplication1{    public partial class Form1 : Form    {        public Form1()        {            Initialize

IP地址输入控件 V1.0.1.1版(FOR Win Form)

ip地址|控件 核心代码: '只允许输入数字."." Private Sub txtField_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtField0.KeyPress, txtField1.KeyPress, txtField2.KeyPress, txtField3.KeyPress If e.KeyChar = &quo

Win Form 的 Splitter 使用心得与技巧_C#教程

今天作个分析html代码,然后再批量下载的程序,其中用到 Splitter (分割条),编译程序后,发现分割条不起作用,拖动分割条的时候,相邻的两个 Panel 没有变换大小.为这个几乎花了一天时间,也没找到原因.包括到其他机子上测试. 后来,再次作一个完全独立的测试项目,发现 Splitter 的使用有个算是 bug 的问题,如果你首先放两个 Panel ,然后再放一个 Splitter .(注意这时候的次序)就会产生我上面出现的问题.这时候代码中的 InitializeComponent 函

在win form 程序中,如何知道自己被别的程序强制结束了?谢谢!!!

问题描述 在winform程序中,如何知道自己被别的程序强制结束了?谢谢!!!或是别的进程或用户用任务管理器把自己结束了,因为我想在程序终止前做一些操作(作记录身末的) 解决方案 解决方案二:终止进程还可以触发事件吗?那木马就麻烦了..你结束我之前我先把你给结束了..哈哈..

WIN FORM treeview节点变成粗体后,竟然最后一个字显示不全

问题描述 有谁知道这个问题怎么解决,看到CSND上也有哥们碰到这个问题,却没解决我的是pointRuleTree.Nodes[0].NodeFont=newFont("宋体",9,FontStyle.Bold),下面的节点没问题,就第一个父节点显示不全 解决方案 解决方案二:node的字体必须小于等于Treeview的字体解决方案三:用了newFont(this.pointRuleTree.Font,FontStyle.Bold)也不行

怎样得到ComboBox中的各个Item的值?(不使用foreach循环,而使用for循环),Win Form的。

问题描述 比如WinForm中有一ComboBox,里面已经Add()了三个值:"111","222","333",我呢,需要取出这三个值保存在一些变量里,目前,我已经可以知道此时ComboBox中有几个Item,然后想使用循环得到各个值,但是目前我不知道怎样得到这三个值,希望各位大虾能指教一二,谢谢.我的想法是这样的:intiCount=this->comboBox1->Items->Count;for(inti=0;i<

寻求 win Form 向Mysql数据库中插入图片方法

问题描述 尽量详细些网上的一些代码引用图片的绝对路径,可不可以引用文件夹单击button弹出文件夹选择图片上传的privatevoidbutton1_Click(objectsender,EventArgse){try{stringzxc="server=127.0.0.1;userid=root;password=root;database=zxc;charset=gbk";MySqlConnectioncon=newMySqlConnection(zxc);stringsql=&q