摘要: 很早就听说了Windows Phone 7的发布,一直想玩一下,但是很郁闷,公司的电脑是Windows 2003操作系统,而家里的破电脑也只安装了Windows XP系统。但是Windows Phone 7的开发工具只能在Viata和Windows 7上安装。但是还好,经过多方面的努力,还是找到了再Windows 2003和Windows XP安装Windows Phone 7的安装方法,简述如下...阅读全文
posted @ 2010-10-15 13:30 萧萧空间 阅读(4225) 评论(32) 编辑
摘要: 在上一篇界面开发中,我讲解了将系统界面还原,还原窗体的本来面貌。但是有的博友提出窗体闪烁,这确实是个问题,原来自己开发的时候也是出现了这个问题。花了两天的时间,重要修改了个大概,将窗体绘画的次数和窗体的刷新程度进行了修改。首先看看效果: 这是主窗体,在主窗体中不仅修改了窗体的刷新率,而且添加了一个自定义的窗体按钮,使用了很多的颜色来显示,模仿了Foxmail的界面显示,但是对于除了主窗体外的其他...阅读全文
posted @ 2010-03-26 17:27 萧萧空间 阅读(2492) 评论(1) 编辑
摘要: 前一篇给窗体设置了Region,将窗体的FormBorderStyle设置成了None,然后修改了窗体的显示区域Region。一个本来完好的窗体让我们设置成为了一个空白的没有任何色彩的窗体,这对我们的界面开发好像是背到而行,有点南辕北辙了。其实不然,只有将窗体上的所有原有的信息给去除掉,才能还原窗体的本来面貌,给窗体一个新面貌。 这篇就对窗体的界面开发设计一个新面貌。 我在界面开篇的开篇就已经说过...阅读全文
posted @ 2010-03-24 13:48 萧萧空间 阅读(2765) 评论(2) 编辑
摘要: 经过上面两篇的界面开发,我们使用Windows的Hook技术,成功的将系统中的窗体的消息截取,并添加了自己的事件处理程序,这篇文章就是通过我们对这些消息的处理的第一步,设置窗体的样式和窗体的Region。Region对于窗体来说是一个非常重要的概念,他就是Windows分配给窗体显示的区域,所以,我们第一步就是根据我们的需要设计我们的窗体区域。而对于Windows窗体区域的设置,WndProc中的...阅读全文
posted @ 2010-03-22 13:17 萧萧空间 阅读(893) 评论(0) 编辑
摘要: NativeWindow是.net Framework提供的一个底层的类。微软官方的解释为:NativeWindow Provides a low-level encapsulation of a window handle and a window procedure.说道这些也相当于没有说,因为NativeWindow到底是干什么的也没有说清楚,意思就是一个低级别的对窗体句柄和窗体过程的一个封...阅读全文
posted @ 2010-03-19 16:26 萧萧空间 阅读(2612) 评论(1) 编辑
摘要: 上篇文章界面开发概述,讲了我开发界面的一些心得体会和一些基本的原理,从这篇开始,我开始讲解一下我的界面开发的全部过程,一步一步的讲解开发界面的过程,这篇主要讲解的是Hook编程,Hook所有的窗体。 Hook,对于大多数程序员来说,这个词并不陌生。对于Windows系统来说,消息Message的传递贯穿了整个系统,Message简单来说就是一个整数,它具有相应的意义。在C++的winuser.h中...阅读全文
posted @ 2010-03-18 14:18 萧萧空间 阅读(2976) 评论(1) 编辑
摘要: 这几天做一个Web项目,使用了ExtJs,其中有个像设计器一样的界面,选择界面上的内容,可以直接编辑内容的属性,这个原本来说对于使用ExtJs还是很简单的。ExtJs本身就提供了丰富的空间和良好的界面开发,就如同WinForm的开发一样。但是ExtJs的空间也有不完美的地方,但是有缺点也有他自己的弥补方法。ExtJs的良好的扩展性就是ExtJs自己控件不能实现的最好的方法。 这几个中使用最多的当属...阅读全文
posted @ 2010-03-05 18:56 萧萧空间 阅读(1582) 评论(1) 编辑
摘要: ExtJs是一个非常好的客户端JavaScript,他的很多空间都可以自定义而且也可以扩展。 在ExtJs的官方网站上有一个带图片的下拉列表,其中扩展了ExtJs的Combo,名称叫做IconCombox,官方地址为:http://www.extjs.com/learn/Tutorial:Extending_Ext_Class_Chinese 但是这个IconComboBox有个缺点,就是显示的图...阅读全文
posted @ 2010-03-03 17:43 萧萧空间 阅读(2055) 评论(1) 编辑
摘要: 今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值。 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家。 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。 解法1: 我们可以对...阅读全文
posted @ 2010-02-26 13:53 萧萧空间 阅读(5341) 评论(4) 编辑
摘要: 好久没有写博客了,今天闲下来无聊,就简单写了一个小程序,名称叫做ColorSpy。以前经常使用别人的ColorSpy进行取色,决定非常有意思,今天就自己简简单单的实现一个,也为自己练练手。 ColorSpy简单来说就是对屏幕的取色,其中有几个难点: 1、获取鼠标在屏幕上的位置: 2、获取鼠标在屏幕上位置的区域图片。 3、获取鼠标指向的颜色。 4、C#中使用Hook,来显示和拷贝颜色。 当然,为...阅读全文
posted @ 2010-02-09 12:12 萧萧空间 阅读(2102) 评论(7) 编辑
摘要: 以前反编译一个Jar文件时,都是使用XJad去做,但是对于有些文件来说,Xjad的反编译却是不尽人意,反编译的质量比较差,甚至出现一些文件没有反编译完全,造成文件不可使用,非常的麻烦。今天在网上搜索了一些,搜索到一个非常好的工具JD,这是一个独立的,不同于XJad的反编译工具,据说,是一个独立的内核,是法国人开发的,官方网站是:http://java.decompiler.free.fr/,JD除...阅读全文
posted @ 2009-12-08 12:31 萧萧空间 阅读(1885) 评论(5) 编辑
摘要: 上篇中写了一个ProgressWindowForm窗体,主要使用线程来处理系统中执行的大数据量操作的一个多线程解决方案,本次将其修改一下,使用线程去处理系统加载过程中的一些处理事项。 界面图如下: 这个Splash和原来的ProgressWindowForm的方式一样,只是修改了其中的少许代码,首先就是本窗体没有了以前的取消方法,删除取消的相关代码就可以了,第二就是窗体不能被强制关闭,也就是说不...阅读全文
posted @ 2009-11-30 17:11 萧萧空间 阅读(1744) 评论(2) 编辑
摘要: 前面写了几篇关于线程、BackGroundWorker等一下文章,现在主要对这些文章进行一个总结,写一篇关键异步窗体的,来实现操作的进度。 对于大型作业来说,循环处理是一件极其耗时的事情,如果都在Application的主线程中去执行,用户的界面感觉就如同死机一般,但是如果添加了进度窗体(ProcessWindow)来说,就不同了,程序会显示出一个新的窗体,而且给用户的效果是非常好的。 闲话少说...阅读全文
posted @ 2009-11-26 14:59 萧萧空间 阅读(2901) 评论(5) 编辑
摘要: 初见这个题目,许多人可能会对自己相当满意:“我还是很好学的”。真的是这样吗?个人之见,有不少人其实并不像他们想象的那么好学,尤其是那些有了一定经验,在某些方面有些过人之处的“聪明”之人,随着技术水平和自信心的积累,往往丢失了好学之心,而他们自己却浑然不知。对此,去年Infoq 刊登的一片新闻《初心,聆听之术》谈到了如何保持学习心态的问题。或许有人要说...阅读全文
posted @ 2009-11-03 15:52 萧萧空间 阅读(522) 评论(2) 编辑
摘要: 这是更加android开发文档,写的我的第一个Android开发项目,就是在屏幕上显示一个简单的Hello World。 首先介绍几个概念: AVD,AVD的全称为:AndroidVirtual Device,就是Android运行的虚拟设备,他是Android的模拟器识别,然后运行我们写的Android程序。我们建立的Android要运行,必须创建我们自己的AVD,每个AVD上可以配置很多的...阅读全文
posted @ 2009-07-29 13:41 萧萧空间 阅读(8243) 评论(4) 编辑
摘要: C# 使用Web页面对文件进行压缩和解压缩阅读全文
posted @ 2007-05-06 01:59 萧萧空间 阅读(106) 评论(1) 编辑

     很早就听说了Windows Phone 7的发布,一直想玩一下,但是很郁闷,公司的电脑是Windows 2003操作系统,而家里的破电脑也只安装了Windows XP系统。但是Windows Phone 7的开发工具只能在Viata和Windows 7上安装。但是还好,经过多方面的努力,还是找到了再Windows 2003和Windows XP安装Windows Phone 7的安装方法,简述如下:

     1、在微软官方网站下载Windows Phone Developer Tools RTW:

         官方下载地址为:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=04704acf-a63a-4f97-952c-8b51b34b00ce&displaylang=en

     2、将下载到的文件(vm_web.exe)解压。在命令行模式下,输入vm_web.exe /x,提示如下图,

         

          选择好文件解压的地址,我放在了E:\vm_web的目录下。

      3、打开E:\vm_web\baseline.dat文件,找到[gencomp7788]这个节点,将下面的内容修改如下:

          InstallOnAMD64=1
          InstallOnFutureNT=1
          InstallOnVista=0
          InstallOnWin7=0
          InstallOnLHS=0
          InstallOnIA64=1
          InstallOnNetServer=0
          InstallOnWin2k=0
          InstallOnWinNT4=0
          InstallOnWinXP=0

          其中,如果仅仅需要在Windows XP上安装,只需要修改InstallOnLHS和InstallOnWinXP,将值1改为值0。

      4、安装Windows Phone Developer Tools RTW。同样在命令行下,输入setup.exe /web。

      这样就可以正常安装了。

      安装完的效果如下:

     

posted @ 2010-10-15 13:30 萧萧空间 阅读(4225) 评论(32) 编辑
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 

关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。 

分析:明显是一道工程性很强的题目,和一般的查找中位数的题目有几点不同。 
1. 原数据不能读进内存,不然可以用快速选择,如果数的范围合适的话还可以考虑桶排序或者计数排序,但这里假设是32位整数,仍有4G种取值,需要一个16G大小的数组来计数。 

2. 若看成从N个数中找出第K大的数,如果K个数可以读进内存,可以利用最小或最大堆,但这里K=N/2,有5G个数,仍然不能读进内存。 

3. 接上,对于N个数和K个数都不能一次读进内存的情况,《编程之美》里给出一个方案:设k<K,且k个数可以完全读进内存,那么先构建k个数的堆,先找出第0到k大的数,再扫描一遍数组找出第k+1到2k的数,再扫描直到找出第K个数。虽然每次时间大约是nlog(k),但需要扫描ceil(K/k) 次,这里要扫描5次。 

解法:首先假设是32位无符号整数。 
1. 读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。 
说明:整数范围是0 - 2^32 - 1,一共有4G种取值,映射到256M个区段,则每个区段有16(4G/256M = 16)种值,每16个值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256M段。一个64位无符号整数最大值是0~8G-1,这里先不考虑溢出的情况。总共占用内存256M×8B=2GB。 

2. 从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。 

3. 再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。 

4. 对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。 

总结: 
1.以上方法只要读两遍整数,对每个整数也只是常数时间的操作,总体来说是线性时间。 

2. 考虑其他情况。 
若是有符号的整数,只需改变映射即可。若是64为整数,则增加每个区段的范围,那么在第二次读数时,要考虑更多的计数。若过某个计数溢出,那么可认定所在的区段或代表整数为所求,这里只需做好相应的处理。噢,忘了还要找第5G+1大的数了,相信有了以上的成果,找到这个数也不难了吧。 

3. 时空权衡。 
花费256个区段也许只是恰好配合2GB的内存(其实也不是,呵呵)。可以增大区段范围,减少区段数目,节省一些内存,虽然增加第二部分的对单个数值的计数,但第一部分对每个区段的计数加快了(总体改变??待测)。 

4. 映射时尽量用位操作,由于每个区段的起点都是2的整数幂,映射起来也很方便。  
posted @ 2010-05-19 11:09 萧萧空间 阅读(566) 评论(2) 编辑

     在上一篇界面开发中,我讲解了将系统界面还原,还原窗体的本来面貌。但是有的博友提出窗体闪烁,这确实是个问题,原来自己开发的时候也是出现了这个问题。花了两天的时间,重要修改了个大概,将窗体绘画的次数和窗体的刷新程度进行了修改。首先看看效果:

     

      这是主窗体,在主窗体中不仅修改了窗体的刷新率,而且添加了一个自定义的窗体按钮,使用了很多的颜色来显示,模仿了Foxmail的界面显示,但是对于除了主窗体外的其他窗体,这些是不存在的。如下图显示的子窗体:

     

     实现的原理和原来的一样,只不过在原来绘画的基础上减少了绘画的内容和绘画区域的大小,这样窗体的界面效果就好多了。下一期将使用上面那个彩色的俺就对窗体进行修改变色。

     本期代码如下:/Files/zhjp11/皮肤/SkinEngines20100326.rar

posted @ 2010-03-26 17:27 萧萧空间 阅读(2492) 评论(1) 编辑

     前一篇给窗体设置了Region,将窗体的FormBorderStyle设置成了None,然后修改了窗体的显示区域Region。一个本来完好的窗体让我们设置成为了一个空白的没有任何色彩的窗体,这对我们的界面开发好像是背到而行,有点南辕北辙了。其实不然,只有将窗体上的所有原有的信息给去除掉,才能还原窗体的本来面貌,给窗体一个新面貌。

     这篇就对窗体的界面开发设计一个新面貌。

     我在界面开篇的开篇就已经说过,界面开发其实就是修改窗体的两个区域,Client Area和None Client Area,如下图:

    

     而我们现在已经将窗体修改成了没有任何信息的窗体,如下图:

    

     现在我们要做的,就是在这个什么都没有的图上添加上我们自己的界面,将窗体的Client Area和None Client Area从新绘制让其有新的面貌。而他的绘制确实需要很多的GDI+知识。

     Client Area的绘画很简单,主要就是对窗体的背景色进行修改,这个对于C#开发人员就是一句话的事情,设置窗体的背景色就可以了。代码如下:

this._parentForm.BackColor = this._engine.SkinColor.Back;

 

     但是,对于None Client Area的绘画就比较麻烦,他不仅仅画的是颜色,还有窗体的标题栏、最大化、最小化、关闭按钮、窗体图标和窗体的边框,接下来就是一一对窗体的进行绘画。

     窗体的标题栏分为两大部分:窗体的图标和窗体的标题,绘画这些的第一步都是对窗体的绘画区域的设置。找到绘画的区域,然后使用GDI+进行绘画,具体的过程就是这样,代码如下:

#region NcPaint
/// <summary>
/// NcPaint
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
private bool NcPaint(SkinningForm form, SkinEngine engine)
{
    
// Declared Filed
    bool result = true;
    IntPtr hdc 
= (IntPtr)0;
    Graphics g 
= null;
    Region region 
= null;
    IntPtr hrgn 
= (IntPtr)0;

    
try
    {
        
// Get Rect
        RECT rectScreen = new RECT();
        NativeMethod.GetWindowRect(_parentForm.Handle, 
ref rectScreen);
        Rectangle rectBounds 
= rectScreen.ToRectangle();
        rectBounds.Offset(
-rectBounds.X, -rectBounds.Y);

        
// prepare clipping
        Rectangle rectClip = rectBounds;
        region 
= new Region(rectClip);
        rectClip.Inflate(
-engine.SkinAppearance.BorderWidth, -engine.SkinAppearance.BorderWidth);
        rectClip.Y 
+= engine.SkinAppearance.CaptionHeight;
        rectClip.Height 
-= engine.SkinAppearance.CaptionHeight;

        
// create graphics handle
        hdc = NativeMethod.GetDCEx(_parentForm.Handle, (IntPtr)0,
            (DCXFlags.DCX_CACHE 
| DCXFlags.DCX_CLIPSIBLINGS | DCXFlags.DCX_WINDOW));
        g 
= Graphics.FromHdc(hdc);

        
// Apply clipping
        region.Exclude(rectClip);
        hrgn 
= region.GetHrgn(g);
        NativeMethod.SelectClipRgn(hdc, hrgn);

        
if (_bufferGraphics == null || _currentCacheSize != rectBounds.Size)
        {
            
if (_bufferGraphics != null)
                _bufferGraphics.Dispose();

            _bufferGraphics 
= _bufferContext.Allocate(g, new Rectangle(00,
                        rectBounds.Width, rectBounds.Height));
            _currentCacheSize 
= rectBounds.Size;
        }

        
// Get Caption Bounds
        Rectangle captionBounds = rectBounds;
        captionBounds.Height 
= this._engine.SkinAppearance.BorderWidth + this._engine.SkinAppearance.CaptionHeight;

        
// Draw Caption
        engine.SkinAppearance.DrawCaptionBackground(g, captionBounds, this._formIsActive, this._engine);
        
// Draw Caption Icon
        if (this._parentForm.ShowIcon && this._parentForm.Icon != null)
        {
            DrawIcon(g);
        }
        
// Draw Caption Text
        DrawCaptionText(g, this._parentForm.Text, this._parentForm.Font);

        
// Draw Caption Button
        DrawCaptionControlBox(g);

        
// Draw Border
        engine.SkinAppearance.DrawBorder(g, rectBounds, engine);
    }
    
catch
    {
        result 
= false;
    }

    
// cleanup data
    if (hdc != (IntPtr)0)
    {
        NativeMethod.SelectClipRgn(hdc, (IntPtr)
0);
        NativeMethod.ReleaseDC(_parentForm.Handle, hdc);
    }
    
if (region != null && hrgn != (IntPtr)0)
        region.ReleaseHrgn(hrgn);

    
if (region != null)
        region.Dispose();

    
if (g != null)
        g.Dispose();
    
return result;
}
#endregion

 

      这个就完全绘制了窗体的边框。界面效果如下:

     

      代码下载地址:/Files/zhjp11/皮肤/SkinEngines20100324.rar

 

posted @ 2010-03-24 13:48 萧萧空间 阅读(2765) 评论(2) 编辑

     经过上面两篇的界面开发,我们使用Windows的Hook技术,成功的将系统中的窗体的消息截取,并添加了自己的事件处理程序,这篇文章就是通过我们对这些消息的处理的第一步,设置窗体的样式和窗体的Region。

     Region对于窗体来说是一个非常重要的概念,他就是Windows分配给窗体显示的区域,所以,我们第一步就是根据我们的需要设计我们的窗体区域。而对于Windows窗体区域的设置,WndProc中的STYLECHANGED,SHOWWINDOW,SIZE,WINDOWPOSCHANGED都有可能用到。这些方法都对窗体的样式或者窗体的大小就行了修改,所以我们也要对这几个消息进行处理。

     首先我们创建一个类用来设置窗体的显示,名称为SkinAppearance.cs,在这个文件中我添加了一个方法,叫做SetRegion,并且参数设置成为我们的窗体SkinningForm。SetRegion的代码如下:

/// <summary>
        
/// Set SkinningForm Region 
        
/// </summary>
        
/// <param name="from">form to set region</param>
        public void SetRegion(SkinningForm form)
        {
            
// Check Form
            if (form == null)
            {
                
return;
            }

            
// Get Form Size
            Size size = form.Size;
            
// Set Color Size
            Size cornerSize = new Size(9090);
            
// Create Region Handle
            IntPtr hRegion = NativeMethod.CreateRoundRectRgn(00, size.Width + 1, size.Height + 1, cornerSize.Width, cornerSize.Height);
            Region region 
= Region.FromHrgn(hRegion);
            
// Set Region
            form.Region = region;
            region.ReleaseHrgn(hRegion);
        }

 

      这样我们就设置了我们的窗体样式,其中cornerSize我设置的比较大,这样显示的效果比较明显。显示的窗体如下:

     

     这样的显示比较难看,这是因为我们还没有对窗体进行其他的绘画。当然我们也可以通过这个方法对窗体的显示进行其他的操作。下一篇将使用GDI+对窗体进行绘画,主要对窗体的边框进行设计。

     本篇代码下载:/Files/zhjp11/皮肤/SkinEngines20100322.rar

 

 

posted @ 2010-03-22 13:17 萧萧空间 阅读(893) 评论(0) 编辑
摘要: NativeWindow是.net Framework提供的一个底层的类。微软官方的解释为:NativeWindow Provides a low-level encapsulation of a window handle and a window procedure.说道这些也相当于没有说,因为NativeWindow到底是干什么的也没有说清楚,意思就是一个低级别的对窗体句柄和窗体过程的一个封...阅读全文
posted @ 2010-03-19 16:26 萧萧空间 阅读(2612) 评论(1) 编辑
摘要: 上篇文章界面开发概述,讲了我开发界面的一些心得体会和一些基本的原理,从这篇开始,我开始讲解一下我的界面开发的全部过程,一步一步的讲解开发界面的过程,这篇主要讲解的是Hook编程,Hook所有的窗体。 Hook,对于大多数程序员来说,这个词并不陌生。对于Windows系统来说,消息Message的传递贯穿了整个系统,Message简单来说就是一个整数,它具有相应的意义。在C++的winuser.h中...阅读全文
posted @ 2010-03-18 14:18 萧萧空间 阅读(2976) 评论(1) 编辑
摘要: 每个软件都要有自己的软件界面,对于软件开发来说,软件界面不一定是最重要的,但是也是相当重要的。一款软件要是可以在界面上做好,吸引了客户的眼球,那这款软件也就相对成功了一半。 现在各行各业的软件都添加了自己的皮肤色彩,显示出了不同的特点。例如QQ,MSN,Foxmail等等,这些软件都修改了自己软件的界面,将自己的界面化做的很完善,很漂亮。使用起来感觉很舒服。我也是一个做软件的,于是也打算将自己的软...阅读全文
posted @ 2010-03-17 18:02 萧萧空间 阅读(3456) 评论(11) 编辑
摘要: 这几天做一个Web项目,使用了ExtJs,其中有个像设计器一样的界面,选择界面上的内容,可以直接编辑内容的属性,这个原本来说对于使用ExtJs还是很简单的。ExtJs本身就提供了丰富的空间和良好的界面开发,就如同WinForm的开发一样。但是ExtJs的空间也有不完美的地方,但是有缺点也有他自己的弥补方法。ExtJs的良好的扩展性就是ExtJs自己控件不能实现的最好的方法。 这几个中使用最多的当属...阅读全文
posted @ 2010-03-05 18:56 萧萧空间 阅读(1582) 评论(1) 编辑
摘要: ExtJs是一个非常好的客户端JavaScript,他的很多空间都可以自定义而且也可以扩展。 在ExtJs的官方网站上有一个带图片的下拉列表,其中扩展了ExtJs的Combo,名称叫做IconCombox,官方地址为:http://www.extjs.com/learn/Tutorial:Extending_Ext_Class_Chinese 但是这个IconComboBox有个缺点,就是显示的图...阅读全文
posted @ 2010-03-03 17:43 萧萧空间 阅读(2055) 评论(1) 编辑