菜单栏中的股票消息

本文关键字:消息 菜单栏 | 更新日期: 2023-09-27 18:08:23

我有一个win forms应用程序,用户希望有一个滚动消息(像新闻提要)。

我对自动收报机本身很满意-客户希望信息在菜单栏的未使用区域滚动-沿着主窗口的顶部。

我不确定你是否可以在菜单栏上堆叠一个控件。

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

谢谢

菜单栏中的股票消息

奇怪的请求。这里有一些东西可以让你开始:

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));
}

查找菜单条中可用的部分。这是你用计时器画出来的矩形。可能会闪烁

下面是我使用的类....

它将在工具箱中创建一个自定义控件…将其拖到所需的控件上,并插入

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