繁体   English   中英

为什么我在 windows forms 中不显示信号?

[英]why I do not display signals in windows forms?

让我们编写一个类型为“Windows Forms Application”的 C# 程序来创建一个模拟信号传输 Analog 的调制和幅度解调的应用程序。 载波信号、调制器信号、调制信号将以图形方式显示/解调,信号的频谱密度为 function。 我试图给图片框上色并显示它们,但没有显示它们的内容。 我的目标是绘制要在 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 使用覆盖 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()

结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM