【问题标题】:why I do not display signals in windows forms?为什么我不在 Windows 窗体中显示信号?
【发布时间】:2023-01-12 04:48:05
【问题描述】:

让我们编写一个“Windows 窗体应用程序”类型的 C# 程序来创建一个 模拟信号传输的调制和幅度解调的应用 模拟。 载波信号、调制器信号、调制信号将以图形方式显示/ 解调和信号频谱密度的函数。 我试图给图片框上色并显示它们,但没有显示它们的内容。 我的目标是绘制要在 4 个图片框中显示的 4 条线。

My code:
using System;
using System.Windows.Forms;
using System.Drawing;
using static System.Math;
static class Program
{
    [STAThread]
    public static void Main()
    {
        Application.SetCompatibleTextRenderingDefault(true);
        Application.Run(new ModulationDemodulationExample());
        Application.EnableVisualStyles();
    }
}


public class ModulationDemodulationExample : Form
{
    // Declare controls and variables
    private const int SignalLength = 100;
    private PictureBox carrierSignalBox = new PictureBox();
    private PictureBox modulatorSignalBox = new PictureBox();
    private PictureBox modulatedSignalBox = new PictureBox();
    private PictureBox demodulatedSignalBox = new PictureBox();
    private double[] carrierSignal = new double[SignalLength];
    private double[] modulatorSignal = new double[SignalLength];
    private double[] modulatedSignal = new double[SignalLength];
    private double[] demodulatedSignal = new double[SignalLength];
    private double carrierFrequency = 2.0;
    private Bitmap carrierSignalBmp;
    private Bitmap modulatorSignalBmp;
    private Bitmap modulatedSignalBmp;
    private Bitmap demodulatedSignalBmp;

    public ModulationDemodulationExample()
    {
        InitializeComponent();
    }
    private void InitializeComponent()
    {
        // Initialize form and controls
        Text = "Modulation and Demodulation Simulator";
        Size = new Size(800, 600);
        PictureBox carrierSignalBox = new PictureBox()
        {
            Location = new Point(10, 10),
            Size = new Size(360, 180),
            Visible = true,
            Name = "Carrier Signal"
        };
        PictureBox modulatorSignalBox = new PictureBox()
        {
            Location = new Point(10, 200),
            Size = new Size(360, 180),
            Visible = true,
            Name = "Modulator Signal"
        };
        PictureBox modulatedSignalBox = new PictureBox()
        {
            Location = new Point(400, 10),
            Size = new Size(360, 180),
            Visible = true,
            Name = "Modulated Signal"
        };
        PictureBox demodulatedSignalBox = new PictureBox()
        {
            Location = new Point(400, 200),
            Size = new Size(360, 180),
            Visible = true,
            Name = "Demodulated Signal"
        };
        Controls.Add(carrierSignalBox);
        Controls.Add(modulatorSignalBox);
        Controls.Add(modulatedSignalBox);
        Controls.Add(demodulatedSignalBox);

        GenerateSignal();
        CreateBitmaps();
        DrawSignals();
    }

    private void GenerateSignal()
    {
        for (int i = 0; i < SignalLength; i++)
        {
            carrierSignal[i] = Math.Sin(2 * Math.PI * carrierFrequency * i);
            modulatorSignal[i] = Math.Sin(2 * Math.PI * i);
            modulatedSignal[i] = carrierSignal[i] * modulatorSignal[i];
            demodulatedSignal[i] = modulatedSignal[i] * carrierSignal[i];
        }
    }

    private void CreateBitmaps()
    {
        carrierSignalBmp = new Bitmap(carrierSignalBox.Width, carrierSignalBox.Height);
        modulatorSignalBmp = new Bitmap(modulatorSignalBox.Width, modulatorSignalBox.Height);
        modulatedSignalBmp = new Bitmap(modulatedSignalBox.Width, modulatedSignalBox.Height);
        demodulatedSignalBmp = new Bitmap(demodulatedSignalBox.Width, demodulatedSignalBox.Height);
        //carrierSignalBox.Image = carrierSignalBmp;
        carrierSignalBox.DrawToBitmap(carrierSignalBmp, carrierSignalBox.ClientRectangle);
        modulatorSignalBox.Image = modulatorSignalBmp;
        modulatedSignalBox.Image = modulatedSignalBmp;
        demodulatedSignalBox.Image = demodulatedSignalBmp;
    }

    private void DrawSignals()
    {
        DrawSignal(carrierSignalBox, carrierSignal, Color.Blue);
        DrawSignal(modulatorSignalBox, modulatorSignal, Color.Red);
        DrawSignal(modulatedSignalBox, modulatedSignal, Color.Green);
        DrawSignal(demodulatedSignalBox, demodulatedSignal, Color.Black);
    }

    void DrawSignal(PictureBox pictureBox, double[] signal, Color color)
    {
        // Get the graphics object for the PictureBox
        var graphics = pictureBox.CreateGraphics();
        // Clear the PictureBox
        graphics.Clear(Color.White);
        // Set the pen color
        var pen = new Pen(color);
        // Scale the signal's values to the size of the PictureBox
        var yScale = (double)pictureBox.Height / 2.0;
        var xScale = (double)pictureBox.Width / (double)signal.Length;
        // Draw the signal
        for (int i = 0; i < signal.Length - 1; i++)

        {
            var x1 = (int)(i * xScale);
            var y1 = (int)(yScale + (signal[i] * yScale));
            var x2 = (int)((i + 1) * xScale);
            var y2 = (int)(yScale + (signal[i + 1] * yScale));
            graphics.DrawLine(pen, x1, y1, x2, y2);
        }

    }
}



我创建了 4 个信号,但我无法以形式显示它们,我希望每个信号都显示在 PictureBox 中。

【问题讨论】:

  • 如果不知道你现在遇到了什么问题,很难说。你什么都没看到吗?空白 PictureBox 控件?请使用更多信息编辑此问题。我的第一个直觉是 InitializeComponent 不是调用您的 3 种方法的正确位置。应该在初始化之后做好,也许在Form.Shown的handler中。
  • 欢迎来到堆栈溢出!您在哪一方面遇到了问题?创建一个仅关注该方面的 minimal reproducible example(例如,您在 PictureBoxes 上画线有困难吗?)并从问题中消除其他不相关的代码(例如,与信号和调制器有关的任何代码)不仅使问题更容易理解,而且答案,它可能会帮助您自己找出答案。或者至少这就是我多次成功的方式。
  • 我编辑了文本发布,我尝试为图片框着色并显示它们,但不是它们的内容。

标签: c# .net windows forms signals


【解决方案1】:

您可以像这样为每个 PictureBox 使用覆盖 Paint 方法来更改程序

   public partial class ModulationDemodulationExample : Form
    {
        // Declare controls and variables
        private const int SignalLength = 100;
        private PictureBox carrierSignalBox = new PictureBox();
        private PictureBox modulatorSignalBox = new PictureBox();
        private PictureBox modulatedSignalBox = new PictureBox();
        private PictureBox demodulatedSignalBox = new PictureBox();
        private double[] carrierSignal = new double[SignalLength];
        private double[] modulatorSignal = new double[SignalLength];
        private double[] modulatedSignal = new double[SignalLength];
        private double[] demodulatedSignal = new double[SignalLength];
        private double carrierFrequency = 2.0;
        public ModulationDemodulationExample()
        {
            InitializeComponent();
            // Initialize form and controls
            Text = "Modulation and Demodulation Simulator";
            Size = new Size(800, 600);
            PictureBox carrierSignalBox = new PictureBox()
            {
                Location = new Point(10, 10),
                Size = new Size(360, 180),
                Visible = true,
                Name = "Carrier Signal"
            };
            carrierSignalBox.Paint += new PaintEventHandler(carrierSignalBox_Paint);
            PictureBox modulatorSignalBox = new PictureBox()
            {
                Location = new Point(10, 200),
                Size = new Size(360, 180),
                Visible = true,
                Name = "Modulator Signal"
            };
            modulatorSignalBox.Paint += new PaintEventHandler(modulatorSignalBox_Paint);
            PictureBox modulatedSignalBox = new PictureBox()
            {
                Location = new Point(400, 10),
                Size = new Size(360, 180),
                Visible = true,
                Name = "Modulated Signal"
            };
            modulatedSignalBox.Paint += new PaintEventHandler(modulatedSignalBox_Paint);
            PictureBox demodulatedSignalBox = new PictureBox()
            {
                Location = new Point(400, 200),
                Size = new Size(360, 180),
                Visible = true,
                Name = "Demodulated Signal"
            };
            demodulatedSignalBox.Paint += new PaintEventHandler(demodulatedSignalBox_Paint);
            Controls.Add(carrierSignalBox);
            Controls.Add(modulatorSignalBox);
            Controls.Add(modulatedSignalBox);
            Controls.Add(demodulatedSignalBox);

            GenerateSignal();
        }
        
        private void GenerateSignal()
        {
            for (int i = 0; i < SignalLength; i++)
            {
                carrierSignal[i] = Math.Sin(2 * Math.PI * carrierFrequency * i);
                modulatorSignal[i] = Math.Sin(2 * Math.PI * i);
                modulatedSignal[i] = carrierSignal[i] * modulatorSignal[i];
                demodulatedSignal[i] = modulatedSignal[i] * carrierSignal[i];
            }
        }

        private void carrierSignalBox_Paint(object? sender, PaintEventArgs e)
        {
            DrawSignal(e.Graphics, carrierSignalBox, carrierSignal, Color.Blue);
        }
        private void modulatorSignalBox_Paint(object? sender, PaintEventArgs e)
        {
            DrawSignal(e.Graphics, modulatorSignalBox, modulatorSignal, Color.Red);
        }
        private void modulatedSignalBox_Paint(object? sender, PaintEventArgs e)
        {
            DrawSignal(e.Graphics, modulatedSignalBox, modulatedSignal, Color.Green);
        }
        private void demodulatedSignalBox_Paint(object? sender, PaintEventArgs e)
        {
            DrawSignal(e.Graphics, demodulatedSignalBox, demodulatedSignal, Color.Black);
        }

        void DrawSignal(Graphics graphics, PictureBox pictureBox, double[] signal, Color color)
        {
            // Get the graphics object for the PictureBox
            //var graphics = pictureBox.CreateGraphics();
            // Clear the PictureBox
            graphics.Clear(Color.White);
            // Set the pen color
            var pen = new Pen(color);
            // Scale the signal's values to the size of the PictureBox
            var yScale = (double)pictureBox.Height / 2.0;
            var xScale = (double)pictureBox.Width / (double)signal.Length;
            // Draw the signal
            for (int i = 0; i < signal.Length - 1; i++)

            {
                var x1 = (int)(i * xScale);
                var y1 = (int)(yScale + (signal[i] * yScale));
                var x2 = (int)((i + 1) * xScale);
                var y2 = (int)(yScale + (signal[i + 1] * yScale));
                graphics.DrawLine(pen, x1, y1, x2, y2);
            }
        }
    }

当你想重绘 PictureBox 时,只要调用 Invalidate 方法,Paint 事件就会自动调用。例子:

carrierSignalBox.Invalidate()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多