如何实现如下功能:
1.窗口的title上的字显示几种字体,其中一部分显示粗体,一部分细体(其中可能还包括显示颜色的不同),比如,"MainForm"用粗体显示size为9,接着的"....."用细体显示,且字size为8.
2.title颜色渐变,默认的都是蓝色,我如何让它的背景色变为渐变色,比如,"欢迎来到CSDN技术社区...",这个title的背景色,变为渐变色.
3.如何活得某个application的多个实例一共占用了多少虚拟内存.Thx

解决方案 »

  1.   

    在Window的标题上绘制的话,可能要用到API,可以用
    GetWindowDC得到关于整个窗体的DC,然后就可以在整个窗体上绘制了,当然也就可以在窗体的标题上绘制了,至于标题中的字体或颜色都可以用这个DC来操作,这个没有问题.
    GetWindowDC的API原型如下,在User32.dll中:HDC GetWindowDC(
      HWND hWnd   // handle to window
    );
      

  2.   

    在标题栏上写内容:
    [DllImport("user32.dll", EntryPoint = "GetWindowDC", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern IntPtr GetWindowDC(IntPtr hWnd);
    private void button1_Click(object sender, EventArgs e)
    {
    IntPtr hdc = GetWindowDC(this.Handle);
    Graphics g = Graphics.FromHdc(hdc);
    int width = 0;
    using (Font font = new Font("宋体", 9, FontStyle.Bold))
    {
    g.DrawString("MainForm", font, SystemBrushes.Window, 0,0);
    width = TextRenderer.MeasureText("MainForm", font).Width;
    }
    using (Font font = new Font("宋体", 9))
    {
    g.DrawString("...", font, SystemBrushes.Window, width, 0);
    }
    }
      

  3.   

    非常感谢hbxtlhx(平民百姓)的帮助,但是这个有个问题,一旦窗体发生变化,则消失了,如何让彻底取代原来的text,并达到那种效果,如果我在resize,resizeend事件中加入这个调用,那...
    还有就是这样的话,resize的时候他闪动.效果不好
      

  4.   

    repaint 这样的事件中重绘 
      
      

  5.   

    你要想做好,一定要重写WndProc这个方法并对WM_NCPAINT消息进行处理.除了这个消息外,你还要在窗体得到和失去焦点的时候处理等.
      

  6.   

    谢谢hbxtlhx(平民百姓)的耐心的帮助和提示,问题1已经基本解决.
    我想顺便请教一个问题,我现在自己重新写的内容,已经失去了原有内容的一些特性,比如,当我拖动的时候,form的最小化图标已经超过我重写的内容,如何让他动态的将不能显示的部分用"..."表示,我写过一个函数处理这种情况,但是效果不是很好.诚心请教.
      

  7.   

    我不太清楚你想要的结果,如果你只是想把一个长的字符串只显示一部分,其它的用...来显示,这倒好说,
    比如: string ="一个长的字符串只显示一部分";
    显示成 "一个长的字..."可以这样来做:
    StringFormat format = new StringFormat(StringFormatFlags.NoWrap);
    format.Trimming = StringTrimming.EllipsisCharacter;
    Rectangle rect = new Rectangle(0, 0, 50, 30);
    string str ="一个长的字符串只显示一部分";
    Graphics g = this.CreateGraphics();g.DrawString(str, this.Font, SystemBrushes.WindowText, rect, format);
      

  8.   

    这个如果我来具体描述可能描述不清楚,我还是用举例说明吧
    比如
    1.你打开了我这个页面,页面上的title显示"如何改变窗口title状态(具体如下) - internet Explorer"
    2.你拖拉页面,将页面变小,当最小化的图标可以掩盖最后title的最后一个字符"r"的时候,此时,标题栏内容变为"如何改变窗口title状态(具体如下) - internet Explo...", 如果你继续拖拉,则动态的变化,直到"如何改变窗口title..."为止,此时不能继续拖拉,使得width变小,内容不变.我采用的办法是实时截取相应的form的长度和字符长度的关系,然后截取对应的一段字符,然后补上"...",最后赋值.
    我觉得这个方法好像有点笨
      

  9.   

    我不是给了你自动的用...来显示的方法了吗?
    你只要给定了在字符串显示的Rectangle及StringFormat就可以自动的显示成带...的字符串.在你的问题中实际的情况是当窗体变化的时候标题的显示的区域(Rectangle)在不断的变小,而字符串的长度是不变的,正好用
    g.DrawString(str, this.Font, SystemBrushes.WindowText, rect, format);
    来显示,因为
    format.Trimming = StringTrimming.EllipsisCharacter;
    所以这个DrawString是自动的来显示最后的不可见的字符用...来表示了.
      

  10.   

    呵呵,老大不生气,我慢慢调调试,师父领进门,修行在个人!
    不能太懒了,哈哈哈哈,hbxtlhx(平民百姓) 赞!
      

  11.   

    请问如何取得处理后的的string,我需要记录这个处理后的string,我怎么得到这个呢?
      

  12.   

    处理后的string?不是这个概念,显示的...这样的只是一个显示而已,是用DrawString画出的效果,而那个字符串还是那个值没有变的.这只是一个显示.楼主的误区好像在字符是什么就显示什么,其实不是这样的,显示出来的可以和实际的字符串是不一样的.
      

  13.   

    恩,你说的这个我通过刚才的try,有一些了解了,但是我必须要记录这个处理后的字符串,因为别处还要用
      

  14.   

    我知道显示的其实不是实际的字符串,但是我现在就是要把它变成实际的串.因为这个关联的东西多,不光是为了显示所以必须要得到这个string
      

  15.   

    第二个问题可以参见这个用法:
    Graphics g = this.CreateGraphics();
    LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush(this.ClientRectangle, Color.Blue, Color.Green, LinearGradientMode.Horizontal);
    g.FillRectangle(myLinearGradientBrush, this.ClientRectangle);第三个问题可以参见这个用法(不知道这个对不对题):
    long totalMem =0;
    for(int i = 0;i<ps.Length;i++)
    {
    totalMem+=ps[i].PeakVirtualMemorySize64;
    }