3

我正在制作一个基本上是位图的音频频谱图。为了显示轴(图表),我使用了 ZedGraph,它基本上只是为了显示轴,如前所述。一种辅助控件。然后我在上面显示位图。当窗口是默认大小时,这很好用 - 但是,当我最大化它时,我会失去比例(见下图)。使用锚定很难(不可能?)。

现在我想知道其他可以保持正确定位的选项。是否可以为控件设置 BackgroundImage(在我的情况下为 ZedGraphControl)并设置它的边距?如果没有,我最好的选择是什么?

默认窗口大小(一切正常): 在此处输入图像描述

最大化窗口(位图未填充 ZedGraphControl): 在此处输入图像描述

4

1 回答 1

1

在我看来,有两种解决方案。第一个是自己将波形位图绘制到控件上(因此使用了全部可用空间,但有点拉伸位图)。第二个是围绕您的控件构建一些面板并相应地调整它们的大小(使图形始终以正确的纵横比显示,但浪费屏幕空间并且更复杂)。

1我不知道 zedgraph 是如何工作的,但我提出以下建议。从您正在编写的内容来看,它是一个用户控件。我要做的是听它的 onPaint 方法。您将获得一个图形对象,您可以自由地使用它在控件上绘制任何东西(包括位图)。参考控件的大小,您可以轻松地绘制具有相应纵横比的位图。

2 创建一个容器来保存图形控件并添加四个面板,一个用于顶部、底部、左侧和右侧。就像在这张图片上一样:

您现在可以根据需要的纵横比调整这些大小。为此,您必须监听两个事件,一个是 ResizeEnd 事件(当用户完成调整控件大小时调用该事件)和一个在窗体最大化时监听的事件(示例)。需要执行的代码如下:

        private void AdjustPanels(object sender, EventArgs e)
        {
        double desiredAspectRatio = 1;

        // I am using the form itself as a reference to the size and aspect ration of the application.
        // you can, of course, use any other control instead (e.g. a panel where you stuff all the other panels
        int width = this.Width;
        int height = this.Height;
        double formAspectRatio = (double)width / (double)height;

        int marginLeft=0, marginRight=0, marginTop=0, marginBottom=0;

        if (desiredAspectRatio > formAspectRatio)
        {
            // high aspect ratios mean a wider picture -> the picture we want is wider than what it currently is
            // so we will need a margin on top and bottom
            marginLeft = 0; marginRight = 0;
            marginTop = (int)((height - desiredAspectRatio * width) / 2);
            marginBottom = (int)((height - desiredAspectRatio * width) / 2);
        }
        else
        {
            marginTop = 0; marginBottom = 0;
            marginLeft = (int)((width - desiredAspectRatio*height)/2);
            marginRight = (int)((width - desiredAspectRatio * height) / 2);
        }

        pnlTop.Height = marginTop;
        pnlBottom.Height = marginBottom;
        pnlLeft.Width = marginLeft;
        pnlRight.Width = marginRight;
    }

当然,您必须将“desiredAspectRation”的值替换为波形图像的纵横比。如果您需要进一步的帮助,只需向我发送包含您的电子邮件地址的私人消息,我将向您发送完整的 Visual Studio 解决方案。

于 2013-04-30T14:59:03.307 回答