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