昨天晚上看见了个帖子,野比小王子在2楼留下下了版主的http://blog.csdn.net/bdmh/article/details/7549140    ,今天下午没事做,自己也搞了一下,效果 不怎么好(窗体中有5个panel控件,设置其中4个的DOCK属性为TOP,具体见源码)。废话不多说,代码如下:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
      
        private Font ft = new Font("黑体",12);
        private static Panel iPanel= new Panel();
        private static PictureBox iPict =new PictureBox();        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Image = global::WindowsFormsApplication2.Properties.Resources.朝上按钮;
            pictureBox1.Size = global::WindowsFormsApplication2.Properties.Resources.朝上按钮.Size;
            pictureBox2.Image = global::WindowsFormsApplication2.Properties.Resources.朝上按钮;
            pictureBox2.Size = global::WindowsFormsApplication2.Properties.Resources.朝上按钮.Size;
            ft = label1.Font;
        }        private void label1_MouseEnter(object sender, EventArgs e)
        {
            ((Label)sender).ForeColor = Color.Red;//设置控件文字字颜色
            ((Label)sender).Font = new Font(ft, ft.Style | FontStyle.Underline);//设置控件字体
        }        private void label1_MouseLeave(object sender, EventArgs e)
        {
            ((Label)sender).ForeColor = Color.Black;//设置控件文字颜色
            ((Label)sender).Font = new Font(ft, ft.Style); //设置控件字体
        }        private void pictureBox1_Click(object sender, EventArgs e)
        {
            int i = Convert.ToInt16(((PictureBox)sender).Tag.ToString());
            switch (i)
            {
                case 1:
                    iPanel = panel2_1;
                    iPict = pictureBox1;
                    break;
                case 2:
                    iPanel = panel2_2;
                    iPict = pictureBox2;
                    break;
            }            if (Convert.ToInt16(iPanel.Tag.ToString()) == 1)
            {
                iPanel.Tag = 2;
                iPict.Image = Properties.Resources.朝上按钮;
                iPanel.Visible = true;
            }
            else
            {
                iPanel.Tag = 1;
                iPict.Image = Properties.Resources.朝下按钮;
                iPanel.Visible = false;
            }
        }
    }
}

解决方案 »

  1.   

    推荐哦
    推荐哦
    cao版主要推荐哦
      

  2.   

    下载地址http://download.csdn.net/detail/zhuankeshumo/4464748
    讨论一个问题:为什么腾讯QQ的截图工具截的图所占内存比我做的那个截图工具所占内存小呢?
    另外自己水平有限,无法对鼠标进行重绘,写的代码也就那几行,不像版主们那样潇潇洒洒的几百行,求指导
      

  3.   


    如果哪天我被关了xhw
    你记得要捞我出来
      

  4.   

    太幽默了   昨晚在论坛里闲逛   看见说你是JAVA之王小号那帖子把我逗笑了
      

  5.   

    简单遮罩效果初试,仅仅一个想法,有待改进,代码如下:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace imageuptodown
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            Bitmap bt;
            private void Form1_Load(object sender, EventArgs e)
            {
                Bitmap s = new Bitmap(@"C:\Users\Administrator\Desktop\1.png");
                bt = new Bitmap(s, panel1.Width, panel1.Height);
            }        private void button1_Click(object sender, EventArgs e)
            {
                int width = bt.Width;
                int height = bt.Height;
                Graphics g=this.panel1.CreateGraphics();
                for (int x = 1; x <= height; x++)
                {
                    Bitmap b = bt.Clone(new Rectangle(0, 0, width, x), System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    g.DrawImage(b, 0, 0);
                    System.Threading.Thread.Sleep(20);
                }
            }
        }
    }
    初始panel1的背景图像为点击按钮进行从上向下拉伸(效果似遮罩)最后如图。明天开始加工。今天很高兴,大家晚安
      

  6.   


    自己架设个Windows Media Encoder做网络电台
      

  7.   

    1. 安装Windows Media Services。   首先安装Windows 2000 Server或者Windows .Net Server,然后打开“开始-控制面板-管理工具-管理您的服务器”或“开始-控制面板-添加或删除程序-添加/删除Windows组件”(建议使用第二种),在其中勾取“Web应用程序服务器”,也就是2000 Server中的IIS服务器,单击“下一步”进行添加;   添加IIS完毕后,再次启动添加/删除Windows组件程序,并勾取Windows Media Service项,单击详细信息,在其中选择“用于Web的Windows Media Services Administrator”以启动Windows Media Services的Web管理功能(2000中可能没有这些选项,只需要安装Windows Media Services即可);   2. 安装Windows Media Encoder。   从微软网站下载Windows Media Encoder 7.1(由于Windows Media Encoder 9.0无法在.Net Server下工作)进行安装,至此,Windows Media服务的服务器和编码器都已经具备;  3. 从“开始-程序-Windows Media”  启动Windows Media Encoder,在出现的向导界面中根据自己的需要选择合适的选项,建议新手“使用新建会话向导广播、捕获或转换文件”,选择后单击确定;   4. 由于进行的是广播,所以在下一个弹出的画面中请选择“在附属设备或计算机屏幕广播实况事件”,这样的选择能够让Windows Media Encoder直接进行广播或者将其加入Windows Media Service服务;   5. 在下一个画面中选择您进行视频或音频捕获的设备,笔者没有视频卡,所以只能选择“屏幕捕获”,有视频卡的朋友请选择您的视频卡;  6. 广播信号必须通过一个有效的端口进行传输,因此必须对它进行设置。Windows Media Encoder默认的端口为8080,但由于这个端口经常被其它软件占用,所以建议朋友们单击“查找可用端口”以换成其它随机端口或者直接输入没有被占用的端口。我选择了“3170”端口;   7. 然后就开始选择我们进行广播的流媒体质量,有一个公式您可以参考:流媒体配置文件带宽×最大连接用户数=您的上行带宽(不是下载,是上传)。您如果有2Mbps的上行带宽,选择了100Kbps的配置文件,则允许同时20个观众看到您的广播,由此可见,流媒体服务对带宽的需求是巨大的;   8. 在这个窗口您可以选择将进行广播的流媒体存档,以便于以后观看或者进行点播,若只是作为实况广播服务,并且硬盘空间不大,您可以不选取;   9. “下一步”后,您可以选择是不是添加微软内置的欢迎、休息和再见文件,我就没要这些东西,谁给微软免费作广告,呵呵;   10. 然后,我们可以给我们的广播节目添加上版权信息,这些信息在播放时,会出现在Windows Media Player中;  11. 弹出最后一个确认窗口后,我们最终的广播界面就出现了,若是有视频捕捉设备,只要单击“开始”,我们的广播站就运行起来,只要在客户机IE中输入“mms://服务器的:端口值”就会弹出media player播放电视。如我建立的广播站地址就是“mms://192.168.0.1:3170,这些信息您也可以直接在此界面的连接标签中查看;   12. 若是您和我一样没有视频捕捉设置,或者想向用户播放一段录制好的视频,请点击“会话-属性”(此面板能够对所有设置过的数据进行调整),单击“更改”按钮,在弹出窗口中选择视频右边的下拉框,单击“查找文件”,找到您预先录制好的视频文件(支持asf、wmv、avi、mpg等格式);   13. 再回到广播界面,点击开始,您的文件就可以被网络上的兄弟姐妹看到了,   若是想添加更多的文件或设备,请在以上窗口单击“更改”旁的“新建”进行添加即可;  14. 您可能觉得到这里我们就大功告成了,实际上远远没有,这只是最基本的直播广播,我们还需要将其加入Windows Media Services的广播服务中,以实现更强大的功能。请将你的鼠标指向“开始-控制面板-管理工具-Windows Media Services”,打开Windows Media管理器(2000 Server应该是一个Web界面)。选择左边的服务器后,单击操作菜单中的“添加发布点(向导)”,经历欢迎页面后,会出现发布点命名窗口,在其中输入您愿意使用的名字,我输入的是“SOFTICP.COM_Broadcast”;   15. 在下一个窗口中,将让您选择所要发布的内容类型,如果只是单纯的进行流媒体直播,就选择“编码器(实况流)”,若是想在实况流中加入其它制作好的文件,请选择“播放列表”,若是想建立视频点播服务器,请选择“目录中的文件”。由于我有现成的制作好的文件,所以选择了“播放列表”;   16. 选择完了发布内容的类型,就要选择发布的方案,我们进行的是网络广播的服务,当然要选择“广播发布点”。在接下来的窗口中,我们要选择内容的传递方式,看到了吧,这次我们前面介绍的单播和组播的基本概念起了作用,我们的网络一般不支持组播,所以要选择“单播”;   17. 若是您以前有创建好的播放列表文件(wsx或htm文件),直接在下一个窗口中选择“现有播放列表”,若是没有,请跟我一样,“新建播放列表后进行添加”。在添加窗口中,可以添加文件、编码器的实况流、远程发布点的流媒体、ASP、CGI的动态源等多种媒体,并且还可以添加广告信息以及调整媒体的播放顺序;   18. 完成播放列表的编辑后,点击“下一步”将播放列表保存成文件,并且在下一个窗口中可以选择是否“循环播放”或“无序播放”这些流媒体。再经历几个确认框,您就完成了Windows Media流媒体广播服务器的建立,为了快捷,我们就将“完成此向导后启动其它向导”前面的对勾去掉吧!   19. 服务器启动后,您就可以在Windows Media Player中输入“mms://服务器IP/发布点名称”观看网络广播了。而在Windows Media Services的管理器中,我们可以随时监视流媒体的播放情况、添加/删除与调整播放列表、插入广告、发布公告(可以直接生成htm页面)、调整该广播站的属性等操作,并可以随时通过下面的按钮启动与停止广播站以及测试当前流媒体是否正常;   此图是使用公告向导建立的发布点公告网页,是不是非常方便?   20. 我们还可以通过在浏览器中输入管理器的网址或者直接启动管理工具中的“Windows Media Services(Web)”来对整个流媒体服务器进行Web管理以及远程管理,其管理界面与本地管理除了少几个功能外,几乎没有差别。   远程管理还可以对一个服务器组多台服务器进行管理。   至此,我们的Windows Media网络广播服务器已经完全建设完毕,您已经拥有了一个具有强大功能的网络广播站。
      

  8.   

    学习了 ps lz的 为.net放弃爱情值得吗?。支持你
      

  9.   


    这个主要是思路问题,比如普通的.NET小程序就要占用20MB以上的内存,虽然.NET程序吃内存是正常现象,但仍然可以通过代码来强制释放,另外,之所以说是思路问题,就是尽量避免在控件上重绘,脱离控件是最好的选择,当然,如果你用过我回复的那个截图示例的话,你可以自己去尝试一下.
      

  10.   

    谢啦!昨天下载了个截图的源码(动态截屏,API截屏,COPYFROMSCREEN截屏,还有上次提示的那种截屏。非常好的一个源码)看了,问题基本明了。
      

  11.   

    不要太在乎自己看到的东西,多想想你的用户可能看到的东西,多做试验,多理解思路,多对比结果,你用WIN7不表示你的用户也会是WIN7,有时冒然挑错反而自表其亏.
      

  12.   


    Sorry,我们正好全部用的win7,因为我们在给客户用的时候就说明了。我们的软件只能在win7下运行。谢谢。
    我们不做大众软件,所以不担忧这个问题
      

  13.   


    应你要求,在虚拟机的xp下写了个hello world,果断完爆你,你还要说什么?
    自己写的东西有问题不要怪.net本身,你加载了一大堆图片占内存吧?
      

  14.   


    最近.net黑太多,比较敏感
      

  15.   

    其实不必纠结内存消耗,就算多出20MB,如果你程序不耗内存,多这点系统完全承受得起。。如果你程序很耗内存,多的这点又根本不算个事了。。所以我觉得没必要动不动就拿内存说事。。另外麻烦dodducs帮我测试下XP下我发的那个Chrome进度条内存消耗多少,我比较想对比下,自己这没条件。测试前麻烦来回拖几遍进度条。多谢。
      

  16.   


    额,你把编译好的exe放到csdn上,我给你测下看看。不过今天不行了,要明天。一会儿下班了,我家电脑也没xp。公司的也是用的虚拟机。
      

  17.   

    http://download.csdn.net/detail/conmajia/4453015
      

  18.   

      try
                {
                    Bitmap myBitmap = new Bitmap(myBitmap1, this.Width, this.Height);
                    int intWidth = myBitmap.Width;//获取位图的宽度
                    int intHeight = myBitmap.Height / 20;//获取位图的高度
                    Graphics myGraphics = this.CreateGraphics();//创建画布对象
                    myGraphics.Clear(Color.WhiteSmoke);//清除整个画布并以指定背景色填充
                    Point[] myPoint = new Point[20];//创建一个Point类型的数组
                    for (int i = 0; i < 20; i++)//遍历myPoint数组中的元素
                    {
                        myPoint[i].X = 0;
                        myPoint[i].Y = i * intHeight;
                    }
                    Bitmap bitmap = new Bitmap(myBitmap.Width, myBitmap.Height);
                    for (int m = 0; m < intHeight; m++)
                    {
                        for (int n = 0; n < 20; n++)
                        {
                            for (int j = 0; j < intWidth; j++)
                            {
                                bitmap.SetPixel(myPoint[n].X + j, myPoint[n].Y + m, myBitmap.GetPixel(myPoint[n].X + j, myPoint[n].Y + m));
                            }
                        }
                        this.Refresh();
                        myGraphics.DrawImage(bitmap, 0, 0);
                        System.Threading.Thread.Sleep(50);
                    }百叶窗   很搓
      

  19.   

    不要用SetPixel这种方式,是极慢的,复制的动画要用LockBits来做.
      

  20.   


    既然你非要这么欠逼我彻底完爆你,我就让你心服口服。
    你连试都没试就敢叫喧,莫非你真以为你很牛?
    明知道自己的话已经出现问题不赶紧去求证,还来JJWW的,看来你真对不起你那两颗星。上图完爆你。
      

  21.   

    淡定,大家就事论事就好,克制下情绪。
    感谢dodducs帮忙测试。看来XP下的.NET的确要消耗较多的内存。设计和发布时需要加以注意。明白了。
    不过我还是维持52楼的观点。
      

  22.   


    哎,最近心情不太好,比较难克制。
    其实就像你说的,内存不重要,几十M而已,现在的内存都是单根2G了,而且我记得昨天看2G 1333才80多块一根。
    本来他如果说C#吃内存,这个我不会反驳,毕竟C#需要加载的辅助Dll很多。没有这些Dll,C#跑不起来。这是事实,不可否认。
    但是上来就说起码20M,这也太黑了。不过在这次验证中发现,win7针对.net framework是有了一定的优化。占用内存比以前小了很多。
    估计win8应该会更少,期待win8的出现,更期待win8手机系统。我就在等nokia的win8系统手机呢,哈哈。
      

  23.   

    谢啦     C#图像处理有三种方法,1是GetPixel,SetPixel方法,这种方法最慢,简直就是看幻灯片;2是内存法,就是你介绍的那个方法,这个方法比方法1快了N倍;3是指针法,虽然C#中指针属于不安全因素,但是,这种方法的速度确实是内存法的10倍以上!建议如果做大型图像处理操作,还是用指针法好!
      

  24.   

    哦,xp下比较耗内存,这点倒真没注意,幸好俺的net程序都在win7下跑
      

  25.   


    猜测win7应该是因为本身就已经加载了部分.net framework的dll,这样就没有必要再去让.net程序自己去加载。而这些dll所占用的内存也应该是属于系统某个进程的。
    win7其实算是比较年轻的改革性系统了,win8出来应该更成熟,.net程序占用内存更少才对。
    当然系统可能也会因此而变得吃内存点儿。不过这样起码解决了要安装.net framework的尴尬。
      

  26.   

    你可以参考我之前那个对Bitmap的性能测试。有兴趣的话可以继续优化,我实在优化不下去了。。
      

  27.   

    http://download.csdn.net/detail/zhuankeshumo/4476862截图所有资料]
      

  28.   

    http://download.csdn.net/detail/zhuankeshumo/4476792新链接
      

  29.   

    如果没有 学习操作系统原理, 没有看 window核心编程, 深入解析window, 以及各种深入.net解析...
    仅仅会些 .net 的皮毛,容易变得自大。
    其实, dylike(潜心研究GDI+) 明显高出个别人好几个级别。 他的话,还是很有道理的。 只是个别句子表达不够精确罢了-----------
    但如果要 回击dylike的这句“普通小程序都20M+” ,起码也要稍微有点 .net 的基础知识。 (如果hello world,都要占用 10M内存,实在是不合格的程序员。)野比的这个,稍微修改一下, 运行在XP, 就可以 3MB 左右的内存。
      

  30.   

    .net 在不同平台,内存占用的差异。简直就是老生常谈了。 居然还有在反复争论前辈们已经很清楚的结论....
    从这个角度看。  .net 用户, 非常参差不齐。 
      

  31.   

    其实。。我一直不在乎内存。。最多关心下速度。。dylike在群里属于90%埋头苦干,10%陪我们吹牛打屁的类型。。还蛮给力的。。 
      

  32.   


    我在win7下截图,他说让我看xp,我用xp也截图了,他人丢了。你出来装了?
    我哪个截图超过20M了?说话负点责任。
    还有我的那个程序是在debug模式下生成的,不是release,也没选择项目的代码优化。很多优化操作没处理。但就算这样也没有20M,ok?另外野比的程序我也没有生成直接用他的debug模式生成的exe直接运行。
    我只要验证了没到20M就行了,没有你老那么有闲心,证明了没到20M,还装作很厉害的样子说什么还可以再节省点内存。又说不要反驳某人。你自己打自己耳光么?你这逻辑真是,用你的话。跟正常人智商“参差不齐”
      

  33.   


    你学习操作系统原理, 看 window核心编程, 深入解析window, 以及各种深入.net解析...那你告诉我,你这些都做了, .net程序20M了么?你分析给我看看你都学的什么能让.net程序20M。
    我倒是觉得你这逻辑蛮有趣的。
      

  34.   

    codeproject 上有很多这种风格的开源控件。
      

  35.   

    一笑而过。
    dylike 水平挺高.
    dodducs 太过较真。