问题一:
    QQ里的菜单是在QQ的下面,而且向上拉的,左侧还定制图案!
请问在C#中怎么做到??有什么良策?
问题二:
    写传送文件的时候,有什么高招能时速度加快,比如QQ2003和QQ2005版本在局域网内传送文件的速度就相差很多!
问题三:
    分组后选择分组的下拉动作怎么做的?
    QQ好友是用什么控件做的?listbox??那么在listbox中怎么贴图(好友都在图案)??
其他问题:
    大家还有什么想法??和需求也可以提.

解决方案 »

  1.   

    楼主的问题很多
    问题1:可以使用快捷菜单来做,自己绘制显示的方式
    问题2:需要判定传输文件的两台计算机是否是在同一网段内,要是在同一网段内就使用内网IP进行数据传输,如果不在同一网段内才使用公网IP进行传输.使用内网IP当然快.
    问题3:C#中没有类似控件,需要自己制定这个控件
      

  2.   

    zhiang75
    问题1:可以使用快捷菜单来做,自己绘制显示的方式
    能不能找个例子看看??问题2:需要判定传输文件的两台计算机是否是在同一网段内,要是在同一网段内就使用内网IP进行数据传输,如果不在同一网段内才使用公网IP进行传输.使用内网IP当然快.
    那QQ2003和QQ2005版本在局域网内传送文件的速度就相差很多!是怎么回事?
    还有就是我都说了是局域网QQ了当然是内网了!
      

  3.   

    zhiang75(zhiang75) 
    不知道您有什么想法?
    请赐教!
      

  4.   

    第2个问题我不清楚QQ里面是怎么实现的,不过QQ2003可能没有使用P2P,传送文件时即使在同一局域网内也要通过服务器中转,而QQ2005可能是直接连接,P2P的.
    加快速度也可以使用多线程来进行
      

  5.   

    System.Windows.Forms.MenuItem 对象有个事件 menuItem1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)  可以自定义菜单的显示方式
      

  6.   

    问题2:需要判定传输文件的两台计算机是否是在同一网段内,要是在同一网段内就使用内网IP进行数据传输,如果不在同一网段内才使用公网IP进行传输.使用内网IP当然快.
    那QQ2003和QQ2005版本在局域网内传送文件的速度就相差很多!是怎么回事?
    还有就是我都说了是局域网QQ了当然是内网了!对因此优化很困难 ,当然多点同时传输例外QQ2003 没有考虑我说的优化方式
      

  7.   

    要是在同一网段内就使用内网IP进行数据?
    是什么意思??
    就一个网卡还用考虑内网公网吗?
    怎么样才算用了内网IP?比方说我的IP为192.168.0.2 给192.168.0.3发文件,难道除了直接连接IP外还有什么技巧?还会使速度加快?
    小弟实在是不理解,还望大哥能指点迷津.
    ^_^!
      

  8.   

    fengxuehan(风雪) :
    局域网内根本就用不着P2P!!!
      

  9.   

    第三方控件XtraNavBar可以做好友的分组.和QQ差不多
      

  10.   

    在菜单里加图标:
    /*
     * by Mattias Sj鰃ren
     * [email protected]
     * http://www.msjogren.net/dotnet/
     *
     */using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Text;
    using System.Reflection;
    using System.Resources;
    using System.Windows.Forms;
    public class IconMenuItem : MenuItem
    {  Icon m_Icon;
      Font m_Font;
      public IconMenuItem() : this( "", null, null, Shortcut.None ) { }
      public IconMenuItem(string text, Icon icon, EventHandler onClick, Shortcut shortcut) :
                                                           base( text, onClick, shortcut )
      {
        OwnerDraw = true;
        m_Font = new Font( "Comic Sans MS", 8 );
        m_Icon = icon;
      }  public override void Dispose()
      {
        m_Font.Dispose();
        m_Font = null;
        m_Icon.Dispose();
        m_Icon = null;
        base.Dispose();
      }  public Icon Icon
      {
        get { return m_Icon; }
        set { m_Icon = value; }
      }  protected override void OnMeasureItem(MeasureItemEventArgs e)
      {
        StringFormat sf = new StringFormat();
            
        sf.HotkeyPrefix = HotkeyPrefix.Show;
        sf.SetTabStops( 60, new float[] { 0 } );    base.OnMeasureItem( e );    e.ItemHeight = 22;
        e.ItemWidth = (int) e.Graphics.MeasureString( GetRealText(), m_Font, 10000, sf ).Width + 10;
        sf.Dispose();
        sf = null;
      }  protected override void OnDrawItem(DrawItemEventArgs e)
      {
        base.OnDrawItem( e );    Brush br;
        bool fDisposeBrush = false;    
        if ( m_Icon != null )
          e.Graphics.DrawIcon( m_Icon, e.Bounds.Left + 2, e.Bounds.Top + 2 );    Rectangle rcBk = e.Bounds;
        rcBk.X += 24;    if ( (e.State & DrawItemState.Selected) != 0 ) {
          br = new LinearGradientBrush( rcBk, SystemColors.Highlight, SystemColors.Control, 0f );
          fDisposeBrush = true;
        }
        else
          br = SystemBrushes.Control;    e.Graphics.FillRectangle( br, rcBk );
        // Only Dispose the brush if we created it, not if it was retrieved from SystemBrushes
        if ( fDisposeBrush )
          br.Dispose();    br = null;    StringFormat sf = new StringFormat();
        sf.HotkeyPrefix = HotkeyPrefix.Show;
        sf.SetTabStops( 60, new float[] { 0 } );
        br = new SolidBrush( e.ForeColor );
        e.Graphics.DrawString( GetRealText(), m_Font, br, e.Bounds.Left + 25, e.Bounds.Top + 2, sf );
        br.Dispose();
        br = null;
        sf.Dispose();
        sf = null;  }  private string GetRealText()
      {
        string s = Text;    // Append shortcut if one is set and it should be visible
        if ( ShowShortcut && (Shortcut != Shortcut.None) ) {
          // To get a string representation of a Shortcut value, cast
          // it into a Keys value and use the KeysConverter class (via TypeDescriptor).
          Keys k = (Keys) Shortcut;
          s += "\t" + TypeDescriptor.GetConverter( typeof(Keys) ).ConvertToString( k );
        }
      
        return s;
      }}  // class IconMenuItem
    public class TestForm : Form
    {  public static void Main()
      {
        Application.Run( new TestForm() );
      }  public TestForm()
      {
        Text = "IconMenu sample";
        InitMenu();
      }  private void InitMenu()
      {    ResourceManager rm = new ResourceManager( "iconmenu", Assembly.GetExecutingAssembly() );
        MainMenu mm = new MainMenu();
        MenuItem fm = new MenuItem( "&File" );
        EventHandler handler = new EventHandler( OnMenuItemClick );
            Menu = mm;
        mm.MenuItems.Add( fm );    fm.MenuItems.Add( new IconMenuItem( "&Open...", (Icon)rm.GetObject( "icon_open" ), handler, Shortcut.CtrlO ) );
        fm.MenuItems.Add( new IconMenuItem( "&Save", (Icon)rm.GetObject("icon_save"), handler, Shortcut.CtrlS ) );
        fm.MenuItems.Add( new MenuItem("-") );
        fm.MenuItems.Add( new IconMenuItem( "&Exit", (Icon)rm.GetObject("icon_exit"), handler, Shortcut.None ) );  }  private void OnMenuItemClick(object sender, EventArgs e)
      {    switch ( ((MenuItem)sender).Index ) {
          case 0:    // Open
            MessageBox.Show( "Open selected" ); break;
          case 1:    // Save
            MessageBox.Show( "Save selected" ); break;
          case 3:    // Exit
            Close(); break;
        }  }}   // TestForm
      

  11.   

    using System.Drawing;
    using System.Resources;public class CreateResources
    {  public static void Main()
      {    ResourceWriter rw = new ResourceWriter( "iconmenu.resources" );    rw.AddResource( "icon_open", new Icon( @"..\open.ico" ) );
        rw.AddResource( "icon_save", new Icon( @"..\save.ico" ) );
        rw.AddResource( "icon_exit", new Icon( @"..\exit.ico" ) );    rw.Close();  }}
      

  12.   

    谢谢 黑郁金香 ^_^
    不过还有个问题就是怎么把菜单放倒Winform的任意位置,QQ菜单是放在下面的,怎么才能做到呢?
    再次谢谢 黑郁金香 非常感谢!
    答完这题马上结帖.
      

  13.   

    下载个免费的软件看看,CICO可以
      

  14.   

    研究它CICO有什么用?
    又没有提供源代码,还不如研究QQ呢.
      

  15.   

    网络问题是这样:一个简单的内网有一个路由和两台计算机,路由的内网IP是192.168.0.1 ,外网IP是61.1.1.1,两台计算机的内网IP分别是192.168.0.2,192.168.0.3
    假设192.168.0.2要发送文件给192.168.0.3
    QQ2003的数据传输方式是
    192.168.0.2->192.168.0.1->61.1.1.1->QQ服务器->61.1.1.1->192.168.0.1->192.168.0.3
    QQ2004的数据传输方式是
    if(QQ服务器协调->是否是在同一内网内)
    {
       192.168.0.2->192.168.0.3 
    }
    else
    {
       192.168.0.2->192.168.0.1->61.1.1.1->QQ服务器->61.1.1.1->192.168.0.1->192.168.0.3}
    希望楼主可以明白
      

  16.   

    我说了我做的是局域网QQ没有服务器那种,局域网QQ本身具有自动搜索网络邻居功能,既然没有服务器怎么会有 QQ服务器 中转操作,所以没有内网外网之说,只有内网!
    不过还是谢谢zhiang75(zhiang75)仁兄!