Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据窗体上的视图大小缩放矩形和位置?_C#_Winforms - Fatal编程技术网

C# 如何根据窗体上的视图大小缩放矩形和位置?

C# 如何根据窗体上的视图大小缩放矩形和位置?,c#,winforms,C#,Winforms,我有一个项目,我在那里工作的用户输入了详细信息后,一个设计为他们创建。最初的版本只是在一英寸为72像素的基础上设计的。我是在同样的基础上工作的。然而,我想扩大我的设计,无论大小的形式 我已经成功地创建了与原始设计完全相同的设计,并且我还成功地正确缩放了大矩形(红色),但我不知道如何将较小的矩形(黑色)向下缩放,以使它们与彼此之间的正确空间量相适应 它应该是这样的: 但当我尝试时,我得到了: 正如你所看到的,我的小矩形没有在正确的x或y位置,也没有像设计那样分开 这是我的代码: priva

我有一个项目,我在那里工作的用户输入了详细信息后,一个设计为他们创建。最初的版本只是在一英寸为72像素的基础上设计的。我是在同样的基础上工作的。然而,我想扩大我的设计,无论大小的形式

我已经成功地创建了与原始设计完全相同的设计,并且我还成功地正确缩放了大矩形(红色),但我不知道如何将较小的矩形(黑色)向下缩放,以使它们与彼此之间的正确空间量相适应

它应该是这样的:

但当我尝试时,我得到了:

正如你所看到的,我的小矩形没有在正确的x或y位置,也没有像设计那样分开

这是我的代码:

  private void ValidateFormBeforeDiagram(object sedner, OptionOneCheckedEventArgs e) {
    try {
        //Create variables
        int pagesUp = e.IsOptionOneChecked ? view.OptionOneAround : view.OptionTwoAround;
        int pagesAcross = e.IsOptionOneChecked ? view.OptionOneAcross : view.OptionTwoAcross;
        float pageWidth = e.IsOptionOneChecked ? view.PageSizeLength : view.PageSizeWidth;
        float pageLength = e.IsOptionOneChecked ? view.PageSizeWidth : view.PageSizeLength;


        ParametersToCreatePrintingDiagram parameters = new ParametersToCreatePrintingDiagram(view.SheetSizeAcross, view.SheetSizeAround,
            pagesUp, pagesAcross, pageWidth, pageLength);

        //Check if form is open, if so close it

        if (Application.OpenForms.OfType<PrintingDesignForm>().Any()) {
            Application.OpenForms.OfType<PrintingDesignForm>().First().Close();
        }

        //Create a new instance of the form
        PrintingDesignForm form = new PrintingDesignForm();
        float ratio = 0;

        //If rectangle is larger than the client viewable size then scale the rectangle so it will fit.
        if (parameters.RectangleHeight > form.ClientRectangle.Height || parameters.RectangleWidth > form.ClientRectangle.Height) {
            var ratioX = form.ClientRectangle.Height / parameters.RectangleHeight;
            var ratioY = form.ClientRectangle.Width / parameters.RectangleWidth;

            ratio = Math.Min(ratioX, ratioY);

            parameters.RectangleHeight = parameters.RectangleHeight * ratio - parameters.RectangleXPosition;
            parameters.RectangleWidth = parameters.RectangleWidth * ratio - parameters.RectangleYPosition;
        }

        //Draw the main rectangle
        form.Paint += (se, pe) => {
            var r = new Rectangle(parameters.RectangleXPosition, parameters.RectangleYPosition,
                (int)Math.Round(parameters.RectangleWidth), (int)Math.Round(parameters.RectangleHeight));

            var brush = new SolidBrush(Color.FromArgb(255, 255, 204));

            pe.Graphics.FillRectangle(brush, r);
            using (var pen = new Pen(brush.Color, 2))
                pe.Graphics.DrawRectangle(pen, r);
        };

        float leftXInches;
        float topYInches;
        float xInch = 0;
        float yInch = 0;
        List<Rectangle> liRect = new List<Rectangle>();


        //Calculate the smaller rectangle sizes and positions
        for (int i = 1; i < parameters.PagesUp; i++) {
            for (int j = 1; j < parameters.PagesAcross; j++) {
                if (e.IsOptionOneChecked) {
                    leftXInches = parameters.RectangleXPosition
                    + ((view.SheetSizeAcross - (view.PageSizeLength * view.OptionOneAcross) - (view.OptionOneAcross - 1) * view.Bleeds) / 2)
                    + ((j - 1) * parameters.PageWidth)
                    + ((j - 1) * view.Bleeds);

                    topYInches = parameters.RectangleYPosition
                    + ((view.SheetSizeAround - (view.PageSizeLength * view.OptionOneAround) - (view.OptionOneAround - 1) * view.Bleeds) / 2)
                    + ((i - 1) * parameters.PageHeight)
                    + ((i - 1) * view.Bleeds);

                }
                else {

                    leftXInches = parameters.RectangleXPosition
                 + ((view.SheetSizeAcross - (view.PageSizeWidth * view.OptionTwoAcross) - (view.OptionTwoAcross - 1) * view.Bleeds) / 2)
                 + ((j - 1) * parameters.PageWidth)
                 + ((j - 1) * view.Bleeds);

                    topYInches = parameters.RectangleYPosition
                 + ((view.SheetSizeAround - (view.PageSizeLength * view.OptionTwoAround) - (view.OptionTwoAround - 1) * view.Bleeds) / 2)
                 + ((i - 1) * parameters.PageHeight)
                 + ((i - 1) * view.Bleeds);
                }

                var width = (Math.Round(parameters.PageWidth) * 72);
                var height = (Math.Round(parameters.PageHeight) * 72);

                yInch = (topYInches * 72);

                xInch = (leftXInches * 72);

                liRect.Add(new Rectangle((int)Math.Round(xInch * ratio), (int)Math.Round(yInch * ratio), (int)Math.Round(width * ratio),
                    (int)Math.Round(height * ratio)));
            }
        }

        //Paint the smaller rectangles onto the form
        for (int i = 0; i < liRect.Count; i++) {
            //Have to use x as i will only be the last increment of i due to form.Paint being an event.
            int x = i;

            form.Paint += (se, pe) => {
                var r = liRect[x];

                var brush = new SolidBrush(Color.FromArgb(255, 0, 0));

                pe.Graphics.FillRectangle(brush, r);
                using (var pen = new Pen(brush.Color, 2))
                    pe.Graphics.DrawRectangle(pen, r);
            };
        }

        form.Show();
    }
    catch (Exception ex) {
        LogErrorToView(this, new ErrorEventArgs(ex.Message));
    }
}
private void validateFormBeForEdigram(对象sedner,选项neCheckedEventArgs e){
试一试{
//创建变量
int pagesUp=e.IsOptionOneChecked?view.OptionNearound:view.OptionWoaround;
int pagesAcross=e.IsOptionOneChecked?view.optionOneCross:view.optionWoCross;
float pageWidth=e.IsOptionOneChecked?view.PageSizeLength:view.PageSizeWidth;
float pageLength=e.IsOptionOneChecked?view.PageSizeWidth:view.PageSizeLength;
ParametersToCreatePrintingDiagram parameters=新参数ToCreatePrintingDiagram(view.SheetSizeAcross,view.SheetSizeAround,
pagesUp、pagesAcross、pageWidth、pageLength);
//检查表单是否打开,如果打开,请将其关闭
if(Application.OpenForms.OfType().Any()){
Application.OpenForms.OfType().First().Close();
}
//创建表单的新实例
PrintingDesignForm表单=新的PrintingDesignForm();
浮动比率=0;
//如果矩形大于客户端可视大小,则缩放矩形,使其适合。
if(parameters.RectangleHeight>form.ClientRectangle.Height | | parameters.RectangleWidth>form.ClientRectangle.Height){
var ratioX=form.ClientRectangle.Height/parameters.RectangleHeight;
var ratioY=form.ClientRectangle.Width/parameters.RectangleWidth;
比率=数学最小值(ratioX,ratioY);
parameters.RectangleHeight=parameters.RectangleHeight*比率-parameters.RectangleXPosition;
parameters.RectangleWidth=parameters.RectangleWidth*比率-parameters.RectanglePosition;
}
//绘制主矩形
form.Paint+=(se、pe)=>{
var r=新矩形(parameters.RectangleXPosition,parameters.RectangleYPosition,
(int)Math.Round(参数.矩形宽度),(int)Math.Round(参数.矩形高度));
var brush=新的SolidBrush(Color.FromArgb(255、255、204));
图形填充矩形(画笔,r);
使用(变量笔=新笔(画笔颜色,2))
pe。图形。绘图矩形(钢笔,r);
};
浮雕;
浮雕;
浮动xInch=0;
浮动yInch=0;
List liRect=新列表();
//计算较小的矩形尺寸和位置
对于(int i=1;i{
var r=liRect[x];
var brush=新的SolidBrush(Color.FromArgb(255,0,0));
图形填充矩形(画笔,r);
使用(变量笔=新笔(画笔颜色,2))
pe。图形。绘图矩形(钢笔,r);
};
}
form.Show();
}
捕获(例外情况除外){
LogErrorToView(这是新的ErrorEventArgs(例如Message));
}
}
那么,如何调整较小矩形的大小,使其与较大矩形之间具有正确的间距

我在这个问题上纠缠了一段时间