0

我有一个 win forms 应用程序,并且用户想要一个滚动消息(如新闻自动收报机)。

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

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

有谁知道这是否可以完成(在菜单栏上堆叠),如果您这样做 - 请提供一些指导。c# 请

谢谢你

4

2 回答 2

1

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

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

它会找到可用的菜单条部分。那就是您将使用计时器绘制的矩形。大概会闪烁。

于 2013-04-09T19:02:57.130 回答
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();
     }
    }
 }
于 2013-04-18T18:14:51.863 回答