感悟生活

Life is like a box of chocolates. You never know what you're gonna get.
随笔 - 97, 评论 - 983, 引用 - 46

导航

关于

标签

每月存档

最新留言

  • iwobz
    <p>看了你那篇用程序登陆asp.net的文章,我觉得你是在骗人,昨天我也写这样的程序,我也把那些viewstate,username,password和eventvalidation那些...
    by iwobz(注册) on 2009/11/29 15:10:41
  • re:SharePoint的小秘密
    <p>@开心就好:测试2</p>
    by 开心就好(注册) on 2009/1/8 22:36:27
  • re:SharePoint的小秘密
    <p>@开心就好:测试</p>
    by 开心就好(注册) on 2009/1/8 22:30:45
  • 回复: 微软拼音输入法2003
    你好,我需要下载,谢谢
    by 李鑫龙(匿名) on 2008/2/20 12:56:00
  • 回复: 微软拼音输入法2003
    你好,我需要下载,谢谢
    by ヤ偽妳變儍い(匿名) on 2008/2/18 16:07:00
  • 回复: 微软拼音输入法2003
    我要用反体字聊QQ
    by 郝语情(匿名) on 2008/2/14 3:33:00
  • 回复: 微软拼音输入法2003
    我要下载
    by ﹏賎侽魜▓(匿名) on 2008/1/23 1:04:00
  • 回复: 有限状态机 理论联系实际
    写程序没理论指导,不重视基础,到现在才发现问题,本末倒置的学习过程。要是有正确的学习方法,水平远应比现在高。
    by wr(匿名) on 2008/1/15 18:08:00
  • SOA基本介绍
    Webservice已经不再是新婚的娘子。众多企业都已经创建各种实验性WebServices项目,事实证明,这项新兴的分布式计算技术确实能够降低集成和开发的成本。另外,一些关键的WebServ...
    by IamV(匿名) on 2007/12/31 16:31:00
  • 回复: SharePoint的小秘密
    在管理中心可以查看Site Collection使用哪个Content DB!
    by it(匿名) on 2007/12/25 11:10:00

广告

ScrollLabel for Smartphone 2003

为偶的NotesManager小程序写了一个带滚动条的Label控件,效果看起来象下面这样:

 

这个控件的实现思路说起来很简单,就是使用的一般Windows桌面程序中的窗口(Window)和视口(View)的概念。

考虑到Label本身不需要支持编辑的功能,出于效率的考虑,我在ScrollLabel控件中用一个Bitmap对象来保存Window的所有内容。在OnPaint中,如果发现Bitmap对象是空值(通常是第一次Paint),则根据当前Text的内容判断是否需要显示ScrollBar,并创建Bitmap对象,然后根据View的位置来显示应当显示在界面上的内容。以后每次Paint的时候,都只是根据滚动条的位置来计算View的位置,然后显示相应的Bitmap上的内容即可。当Text或者Font改变时,将原有的Bitmap销毁重新计算即可。整个OnPaint方法看起来象下面这样:

         protected override void OnPaint(PaintEventArgs e)

         {

              base.OnPaint (e);

 

              if(bmpWindow == null)

              {

                   Rectangle drawRect;

 

                   // Calculate the height of the window

                   SizeF size = e.Graphics.MeasureString(this.Text, this.Font);

                   rowHeight = size.Height;

                   float height = (size.Width / ClientSize.Width + 1) * rowHeight;

 

                   // Indicate if the scrollbar need to be shown.

                   if(height > ClientRectangle.Height)

                   {

                       // Recalculate the height of window.

                       height = (size.Width / (ClientSize.Width - scrollWidth)) * rowHeight + ClientSize.Height / 2;

 

                       // Show scrollbar

                       vs.Bounds = new Rectangle(this.ClientSize.Width - scrollWidth, 0,

                            scrollWidth, ClientSize.Height);

                       vs.LargeChange = (int)(ClientSize.Height / rowHeight);

                       vs.Maximum = (int)(height / rowHeight);

                       vs.Visible = true;

 

                       // Create window bitmap.

                       bmpWindow = new Bitmap(ClientSize.Width - scrollWidth, (int)height + 1);

                       drawRect = new Rectangle(0, 0, ClientSize.Width - scrollWidth, (int)height + 1);

                   }

                   else

                   {

                       bmpWindow = new Bitmap(ClientSize.Width, ClientSize.Height);

                       drawRect = this.ClientRectangle;

                   }

 

                   // Paint on the window bitmap.

                   Graphics g = Graphics.FromImage(bmpWindow);

                   g.FillRectangle(new SolidBrush(this.BackColor), drawRect);

                   g.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), drawRect);

                   g.Dispose();

              }

 

              // Draw view.

              e.Graphics.DrawImage(bmpWindow, 0, 0 - (int)rowHeight * vs.Value);

         }

这个ScrollLabel的代码可以从这里下载。

不过这里使用的方法也有一些小缺陷,主要是源于目前版本的.NET CF不支持的一些功能。比如,为了得到作为Window的Bitmap的宽度和高度,我使用了MeasureString这个方法。但是目前版本的.NET CF中,MeasureString并不支持按给定宽度度量所需要的高度的功能,只能量出将所有的字画在一行上的宽度和高度。我的解决办法是,用MeasureString得到的高度作为行高,用MeasureString得到的宽度和整个ClientSize的宽度比值作为所有的行数,从而得到Window所需的高度。但是这样一来,就无法顾及由于英文的分词所带来的误差。比如MeasureString这个词,如果恰好在行尾,在Paint的时候它不会被截断,而时候整个的被放到下一行来显示。这样不断的叠加,最终在行数上是会产生一定的误差的。我暂时使用的解决方法是,对我用MeasureString得到的Window高度进行了1/2个ClientSize高度的误差补偿,这样你会发现,ScrollBar在滚动时并不是精确地滚动到最后一行,而是还会向下滚动一段空白区域。在大多数情况下,这段误差补偿是可以解决问题的,但是对于包含很多非常长的单词的情况,可能仍然会有问题。

更新后的NotesManager可以在这里下载。

 

posted on 2004-11-08 13:49:00 by sam1111  评论(14) 阅读(4992)

小问题不断

刚才收到mvm的邮件,说我的上一个post不能加comment,comment的submit按钮不work了,试了一下果然不能submit评论了。

刚才我用上一个post做了个测试,用来试验开心说的避免帖子显示在博客堂首页的方法,开始我以为这是引起问题的原因。Advanced里面的那一堆Checkbox前几个我都试了试,结果发现,似乎取消选中“显示在首页”并不能避免帖子显示在博客堂首页上,倒是帖子不会显示在自己的首页上了;取消选中“发布”的话,帖子不会显示在博客堂首页上,但是同时也不会显示在自己的首页上了,这样的话帖子也就没人能看到了;取消选中“允许评论”的话,帖子上不会有Feedback的链接。现在我选中了所有的选项,但是评论的submit按钮仍然不work。

再仔细想想今天我还改了什么,想起来下午我给自己的blog加了一个google站内搜索,但是测试下来发现,这段站内搜索代码似乎不能用。首先,click了google search按钮之后并没有按预期转到google的页面,而只是将本来的首页刷新了一遍似的。我在自己本地建了个测试页面,放上google的这段代码是可以work的,这说明可能是博客堂本身的代码与它有冲突;其次,google的站内搜索其实还是使用的site关键字,而这个site关键字搜索是不支持搜索类似http://blog.joycode.com/sam1111 这样的URL地址的,只支持类似blog.joycode.com这样的顶级域名,所以其实并不能按我的预期实现对http://blog.joycode.com/sam1111 的站内搜索;

虽说这段站内搜索不Work,我还是将那段代码留在那里了,主要是懒得去删了。刚才想起这会不会是引起不能submit comment的原因呢?因此去把它删了,现在submit comment果然可以用了。看来还真是google的search按钮与comment的submit按钮有冲突呢,难道是使用了相同的ID?

附:耽误了mvm的comment,特附在下面 :)

kaka, 居然不能在vpc里面运行sp的模拟器?

 

那能在vpc里面运行SFC模拟器么?

 

Btw, 无法在http://blog.joycode.com/sam1111/archive/2004/11/04/38033.aspx里面留言,本来想留在那个上面的。我这里居然click submit以后没有反应。很郁闷。

 

20:27更新:

SFC模拟器suppose应该是可以在VPC中运行的吧。SP的模拟器不能运行是因为SP的模拟器本质上是一个WinCE虚拟机,因此不能嵌在其他的Windows虚拟机中运行。虽然没试过,不过我想一定不能在一个Win2k3的虚拟机中再run一个WinXP的虚拟机。而SFC的模拟器应该与Windows虚拟机没什么关系。有空试试先。:)

 

21:05更新:

趁下班之前这段时间作了个测试,在虚拟机中安装VPC2004时报错无法安装虚拟网卡;能成功安装,但无法在WinXP虚拟机中运行,报与SP模拟器差不多的错,即无法在一个Virtual Machine中运行。SFC的模拟器倒是可以运行,只是声音似乎有点问题。

posted on 2004-11-04 20:08:00 by sam1111  评论(20) 阅读(9113)

NotesManager的小改进

作了个小升级,主要是界面上的:

??

新版本可以在这里下载。

原打算为Smartphone建个专门的VirtualPC环境来开发,down了个干净的WinXP SP2 Image,然后在上面一步一步装好了需要的所有软件。安装好了之后,写了个小程序作测试,发现Emulator无法运行起来,报个错,错误信息很具调侃性质,说,Emulator不能运行在另一个Emulator中,你只是试试对吧?一时摸不着头脑,上网查了一下发现,Emulator原来也是一种虚拟机,而两个虚拟机是无法嵌套使用的。等偶有空了倒要试试,看看能不能在一个VPC中run另外一个VPC。

posted on 2004-11-04 18:14:00 by sam1111  评论(20) 阅读(3618)

Powered by: Joycode.MVC引擎 0.5.2.0