在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 : ControlT 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块钱就能买到。
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 = 超文本标记语言。这个名字不是没有意义的!
以上是关于在c#winform中如何做出导航菜单,其效果如下图:的主要内容,如果未能解决你的问题,请参考以下文章
C#.NET winform treeview和panel导航效果