我有一个win表单应用程序,用户希望有一个滚动消息(如新闻自动收报机)。
我可以使用自动收报机 - 客户希望信息在菜单栏的未使用区域中滚动 - 沿着主窗口的顶部。
我不确定您是否可以在菜单栏顶部堆叠控件。
有没有人知道这是否可以实现(在菜单栏上叠加),如果你这样做 - 请提供一些方向。 c#请
谢谢
答案 0 :(得分:2)
奇怪的要求。这是让你入门的东西:
public Form1() {
InitializeComponent();
menuStrip1.Paint += menuStrip1_Paint;
}
void menuStrip1_Paint(object sender, PaintEventArgs e) {
int startLeft = 0;
foreach (ToolStripMenuItem menu in menuStrip1.Items) {
startLeft = Math.Max(startLeft, menu.Bounds.Right);
}
startLeft += 16;
e.Graphics.DrawRectangle(Pens.Red,
new Rectangle(startLeft, 0,
menuStrip1.ClientSize.Width - startLeft - 1,
menuStrip1.ClientSize.Height - 1));
}
它找到可用的菜单条的一部分。这是你使用计时器绘制的矩形。可能会闪烁。
答案 1 :(得分:1)
这是我使用的课程....
它将在工具箱中创建一个自定义控件...将其拖动到您想要的控件上,并将其拖动到walla
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
namespace Winform_menu
{
internal class NewsTicker : Panel
{
private Timer mScroller; // Scroll timer
private int mOffset; // Offset of scrolled text
private string mText; // Text to scroll
private Size mPixels; // Width of text in pixels
private Bitmap mBuffer; // Double-buffering buffer
public NewsTicker()
{
mScroller = new Timer();
mScroller.Interval = 30;
mScroller.Enabled = false;
mScroller.Tick += DoScroll;
}
[Browsable(true)]
public override string Text
{
get { return mText; }
set
{
mText = value;
mScroller.Enabled = mText.Length > 0;
mPixels = TextRenderer.MeasureText(mText, this.Font);
mOffset = this.Width;
}
}
private void DoScroll(object sender, EventArgs e)
{
// Adjust offset and paint
mOffset -= 1;
if (mOffset < -mPixels.Width) mOffset = this.Width;
Invalidate();
}
protected override void OnPaintBackground(PaintEventArgs e)
{
// Do nothing
}
protected override void OnPaint(PaintEventArgs e)
{
if (mBuffer == null || mBuffer.Width != this.Width || mBuffer.Height != this.Height)
mBuffer = new Bitmap(this.Width, this.Height);
Graphics gr = Graphics.FromImage(mBuffer);
Brush bbr = new SolidBrush(this.BackColor);
Brush fbr = new SolidBrush(this.ForeColor);
gr.FillRectangle(bbr, new Rectangle(0, 0, this.Width, this.Height));
gr.DrawString(mText, this.Font, fbr, mOffset, 0);
e.Graphics.DrawImage(mBuffer, 0, 0);
bbr.Dispose();
fbr.Dispose();
gr.Dispose();
}
}
}