在c#winform中如何做出导航菜单,其效果如下图:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c#winform中如何做出导航菜单,其效果如下图:相关的知识,希望对你有一定的参考价值。

急急急。。。。。求大神指点欢迎加载界面、登陆界面与主界面之间的转换,再加上欢迎加载界面的设计

自己画,再拖个timer,让他做出动画效果,无非4个按钮一个panle,pictureBox+lable。

你也可以不做成控件,直接窗体上画,简单得另人发指,拖一个Panle,N个按钮,N个子Panle,单击按钮,其他按钮名称写成变量,或者直接画按钮:

也可以直观理解为,先放好最下面一个按钮,上面的相隔按钮高度跌加

button10.Top = 最底下一个按钮高度;
button9.Top = button10.Top - button9.Height; 
...   //紧挨着排列按钮

子panle在按钮事件中触发显示、隐藏。当点按钮的时候显示为他设计的panle,定位在他正下方,容纳在空白区域,可以理解为:

panle1.visible=true;   //显示子菜单
panle2.visible=false; 
...
panle1.top=button1.top+button1.height;  //高度为button1之下
panle1.width=button1.width; //宽度和button1齐平
panle1.left=button1.left; //左边距跟button1对齐
panle1.height=button2.top-button1.top  //高度在button1和下一个按钮button2之间

这种说法理解吗?,再逼近一点我们的做法,把按钮、Panle方法写成类:

private void ReSize<T>(string name, int H, int W, int L, int TO) where T : Control
        
            T bu = (T)Controls[n];
            bu.Top = TO * this.Height / kuan;
            bu.Left = L * this.Width / chang;
            bu.Width = W * this.Width / chang;
            bu.Height = H * this.Height / kuan;    //按照软件长宽比例缩放
               
         
private void AddControl<T>(string name, int Height, int Width, int Left, int Top) where T : Control
        
            T bu = (T)Controls[name];
            bu.Top = Top             
            bu.Left = Left;
            bu.Width = Width;
            bu.Height = Height;    //调整属性               
        

上面是两个方法,一个是调整分辨率,一个是把控件作为变量处理,你会了吗?

参考技术A 你可以看看 easy_ui的导航就和这个差不多追问

不知道耶,能详细点么

追答

你说的是winform 我以为你说asp。这个用wpf可能能做,

参考技术B 自己用图片加一些位置计算的算法,处理一些事件,还是可以做出来的追问

我也知道要加位置计算法,那该如何做呢?能够详细点么。。。

追答

最近工作很忙,都没有登录上来看,你这个效果做出来了没

参考技术C 这个是第三方控件!C#的不带!追问

我知道啊,效果快出来了,只是没有这个好看。

参考技术D Dev GridControl貌似可以实现这种 估计要重写一点东西;这个东西有时间才能试试

C#,Winform如何做出显示文字没有焦点但是可以复制的效果?类似网页。

通常我都只是用个textbox,做成只读,但是很难看,类似网页上的文字显示是怎么做到的呢?或者.net有无自带的控件可以实现呢?

参考技术A using System.Runtime.InteropServices;//加这个命名空间
namespace SY1


public partial class Form1 : Form

[DllImport("user32.dll", EntryPoint = "HideCaret")]

public static extern bool HideCaret(IntPtr hWnd);//用这个API

public Form1()

InitializeComponent();

private void Form1_Load(object sender, EventArgs e)




private void textBox1_MouseDown(object sender, MouseEventArgs e)

IntPtr hWnd = textBox1.Handle;
HideCaret(hWnd);//获得焦点时调用





然后把TextBox的边框设成None ,改成只读就可以了。
还有一个不用API的变通的办法,
就是你再放一个隐藏的textBox2在form里
然后
private void textBox1_MouseUp(object sender, MouseEventArgs e)

textBox2.Focus();


private void textBox1_MouseClick(object sender, MouseEventArgs e)

textBox2.Focus();

也能达到你说的目的,但不是一个好办法。

另外不明白你为什么不用API现成的方法,而要自己去写。
说白textBox2.Focus()也是API,只不过.net给你封装好了可以直接用罢了。
参考技术B 非常简单,你直接放一个webBrowser1控件,然后
webBrowser1.DocumentText = "just a test";
webBrowser1.ScrollBarsEnabled = false;
就可以了。追问

那我就是问webBrowser的效果是怎么做出来的。

追答

WebBrowser是WinForm的控件之一,直接拉一个控件到WinForm窗体,加上上面的两句代码就可以达到你想要的效果。
其基本原理是把系统自带的IE窗口嵌入到webBrowser控件中,以呈现你所需的页面。
至于IE的解析过程,本身是极其复杂的,只不过它被优化到效率特别快而已。

追问

我没有说解析过程,只是想知道那种可以复制又没有焦点的文本是怎么实现。

追答

你的问题不是问.net有没自带控件可以实现么?WebBrowser就是.net的自带控件。
如果你非要自己写一个控件去实现这个功能的话,新建一个继承自System.Windows.Forms.Control的类。
使用MouseUp事件、MouseDown事件确定选择的起点和终点。
如果单用这两个事件的话,点击控件并移到控件之外放开鼠标会有bug,使用MouseEnter事件、MouseLeave事件可以解决这个问题。
重写OnPaint方法呈现选择(或者未被选择)的文本。

追问

麻烦你写个来看看?

追答

写这个太浪费时间了,因为它的实现一点也不轻松。
真有兴趣的话你可以自己写,遇到技术难题可以问我。
使用Graphics.MeasureString可以测量每个字符的大小,以便于确定选择的起点与终点。
说句难听点的,如果我给你提示你都实现不了,那么我写出来你也看不懂。

追问

那你何必来回答我的问题,我的问题已经问得非常清楚了,需要你说这么多废话吗?

追答

你的问题里面有一句“或者.net有无自带的控件可以实现呢?”
我以为只要有一个可以实现你需要的功能的控件就足够了,天知道你还想要源代码。
大概实现方式我已经告诉你了,再附赠一个小例子:
public class MyControl : Control

protected override void OnPaint(PaintEventArgs e)

e.Graphics.DrawString("这是一个测试", this.Font, new SolidBrush(this.ForeColor), new PointF(0, 0));


编译以后,它是一个可以直接放到WinForm上面的控件,它的效果是显示“这是一个测试”这样一行字。
你可以先使用e.Graphics.DrawRectangle绘制一个纯色背景,再在背景上绘制文字,那样就是选择的效果,至于绘制的坐标就需要你自己的计算了。
如果你还不满意,那我也没办法了。

追问

你这个是啥例子啊,以为我不懂基本的GDI+?

追答

那我就实在想不通了。
既然你对GDI+很熟悉的话,那么写这样一个控件对你来说应该是轻而易举的事情,你又何必让别人写源代码给你?
还是说你认为你花费了200积分,就应该获得一份别人写好的源代码?

追问

你不想写就不要回答,我问问题是我的自由,你管得着?

追答

回答问题,只是偶尔的无聊帮别人解答一下困惑而已。
有句话叫授之与鱼不如授之与渔,个人觉得,能够告诉别人一个实现的方向已经足够了。
如果对方遇到技术问题自然是要尽量想办法解决的,我也说过,如果你遇到技术难题可以再问我。
不过刚看了下,发现你的技术还是相当强大的,你回答的问题,比我还要多的多,应该足以实现你想要的控件了。
如果你是想用200分找免费劳力的话,我想应该没有人会愿意的吧,毕竟200积分大概1-4块钱就能买到。

参考技术C using System.Runtime.InteropServices;//加这个命名空间
namespace SY1


public partial class Form1 : Form

[DllImport("user32.dll", EntryPoint = "HideCaret")]

public static extern bool HideCaret(IntPtr hWnd);//用这个API

public Form1()

InitializeComponent();

private void Form1_Load(object sender, EventArgs e)




private void textBox1_MouseDown(object sender, MouseEventArgs e)

IntPtr hWnd = textBox1.Handle;
HideCaret(hWnd);//获得焦点时调用





然后把TextBox的边框设成None ,改成只读就可以了。
不谢~追问

请看我另外一个追问,虽然说你会用这个api说明你确实很厉害,但是我已经说了不要用api来修改textbox了,最好是继承自control的控件。

追答

还有一个不用API的变通的办法,
就是你再放一个隐藏的textBox2在form里
然后
private void textBox1_MouseUp(object sender, MouseEventArgs e)

textBox2.Focus();


private void textBox1_MouseClick(object sender, MouseEventArgs e)

textBox2.Focus();

也能达到你说的目的,但不是一个好办法。

另外不明白你为什么不用API现成的方法,而要自己去写。
说白textBox2.Focus()也是API,只不过.net给你封装好了可以直接用罢了。

追问

谢谢你写了这么多,因为我觉得网页上的文字应该不是用一个很大的textbox装着的或者是隐藏了一个,从浏览器的开发者角度来说应该是个小问题,难道C#就不能弄出这种效果?

追答

整个网页其实就是一个文本
HTML = 超文本标记语言。这个名字不是没有意义的!

参考技术D Form_Load 事件中,FORM并没有展现出来,只是加载相应的资源和组件。此时组件仍不可见,所以Focus事件不会生效。可以在 Shown 事件 或者 Actived 事件里,设置 focus 第5个回答  2013-09-25 lable 是可以做到复制的。。我给你写了一个demo 可以发给你看下。QQ: 953954891

以上是关于在c#winform中如何做出导航菜单,其效果如下图:的主要内容,如果未能解决你的问题,请参考以下文章

Delphi导航菜单

winform如何做出数据加载的效果

C#.NET winform treeview和panel导航效果

C#,Winform如何做出显示文字没有焦点但是可以复制的效果?类似网页。

如何实现winform 可隐藏导航栏

C#winform中父窗体打开后下面有一排导航,导航打开子窗体,子窗体停靠在父窗体中间