我有一个 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));
}
它会找到可用的菜单条部分。那就是您将使用计时器绘制的矩形。大概会闪烁。
这是我使用的课程....
它将在工具箱中创建一个自定义控件...将其拖到您想要的控件上,然后 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();
}
}
}