菜单栏中的自动收报机消息

时间:2013-04-09 18:15:39

标签: c# menubar

我有一个win表单应用程序,用户希望有一个滚动消息(如新闻自动收报机)。

我可以使用自动收报机 - 客户希望信息在菜单栏的未使用区域中滚动 - 沿着主窗口的顶部。

我不确定您是否可以在菜单栏顶部堆叠控件。

有没有人知道这是否可以实现(在菜单栏上叠加),如果你这样做 - 请提供一些方向。 c#请

谢谢

2 个答案:

答案 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();
     }
    }
 }