在圆上分若干个点,再以每个点为中心画矩形,用C#winform做,很急。求答案

如题所述

//原创,仅供参考,切勿照搬!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SplitRectangles
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        Graphics myGRA;
        private void Form1_Load(object sender, EventArgs e)
        {
            chkTop.Checked = true;
        }

        private double getY(double computerY)
        {
            return picMain.Height/2 - computerY;
        }
        private void btnOK_Click(object sender, EventArgs e)
        {
            int intVertices = Convert.ToInt32(txtVertices.Text);
            int intRadius = Convert.ToInt32(txtRadius.Text);
            int intRecLength = Convert.ToInt32(txtRecL.Text);
            int intRecWidth = Convert.ToInt32(txtRecW.Text);
            Pen cPen = new Pen(Color.Red, Convert.ToInt32(txtcPenW.Text));
            Pen vPen = new Pen(Color.Blue, Convert.ToInt32(txtvPenW.Text));
            Pen rPen = new Pen(Color.Green, Convert.ToInt32(txtrPenW.Text));
            double dblAngle = Math.PI*2 / intVertices;

            picMain.Image = new Bitmap(picMain.Width, picMain.Height);
            myGRA = Graphics.FromImage(picMain.Image);
                myGRA.TranslateTransform(picMain.Width/2, picMain.Height/2);
                myGRA.DrawEllipse(cPen, -intRadius, -intRadius, 2*intRadius, 2*intRadius);
            for (double i = 0; i < Math.PI*2; i+=dblAngle)
            {
                Single sngX = Convert.ToSingle(intRadius * Math.Cos(i));
                Single sngY = Convert.ToSingle(intRadius * Math.Sin(i));
                Single sngRecSX = Convert.ToSingle((intRadius - intRecLength / 2) * Math.Cos(i));
                Single sngRecSY = Convert.ToSingle((intRadius - intRecLength / 2) * Math.Sin(i));
                Single sngRecLX = Convert.ToSingle((intRadius + intRecLength / 2) * Math.Cos(i));
                Single sngRecLY = Convert.ToSingle((intRadius + intRecLength / 2) * Math.Sin(i));
                Single sngRecDX = Convert.ToSingle(intRecWidth / 2 * Math.Sin(i));
                Single sngRecDY = Convert.ToSingle(intRecWidth / 2 * Math.Cos(i));
                PointF ptfRecSXdn = new PointF(sngRecSX + sngRecDX, sngRecSY - sngRecDY);
                PointF ptfRecSXup = new PointF(sngRecSX - sngRecDX, sngRecSY + sngRecDY);
                PointF ptfRecLXdn = new PointF(sngRecLX + sngRecDX, sngRecLY - sngRecDY);
                PointF ptfRecLXup = new PointF(sngRecLX - sngRecDX, sngRecLY + sngRecDY);
                PointF[] ptfRec = new PointF[] { ptfRecSXup, ptfRecSXdn, ptfRecLXdn, ptfRecLXup,ptfRecSXup };
                myGRA.DrawEllipse(vPen, sngX, sngY, 1, 1);
                if (chkWorking.Checked)
                {
                    myGRA.DrawLine(rPen, sngRecSX, sngRecSY, sngRecLX, sngRecLY);
                }
                myGRA.DrawLines(rPen, ptfRec);
            }
            picMain.Refresh();
        }

        private void chkTop_CheckedChanged(object sender, EventArgs e)
        {
            this.TopMost = chkTop.Checked;
        }

        private void btnQuit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

界面设计如下:

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-07-30
 private const int _WIDTH = 200;
 private const int _HEIGHT = 200;
 private const int _WIDTH2 = 75;
 private const int _HEIGHT2=25;
 private const int _X = 50;
 private const int _Y = 50;
 private const int _SPW = 10;
 private const int _SPH = 10;
 private void Draw(){
            Graphics g = this.CreateGraphics();
            SolidBrush sb = new SolidBrush(Color.Black);
            Pen pen = new Pen(Color.Black);
            g.DrawEllipse(pen,new Rectangle(new Point(){X=_X,Y=_Y},new Size(){Height=_HEIGHT,Width=_WIDTH}));
            g.FillEllipse(new SolidBrush(Color.Red), new Rectangle(_X + _WIDTH / 2, _Y + _HEIGHT / 2 , _SPW, _SPH));

            g.FillEllipse(sb, new Rectangle(_X-_SPW/2, _Y+_HEIGHT/2-_SPH/2, _SPW,_SPH));
            g.DrawRectangle(pen, new Rectangle(_X / 2 - _SPW, _Y + _HEIGHT/2 - _SPH, _WIDTH2, _HEIGHT2));

            g.FillEllipse(sb, new Rectangle(_X+_WIDTH/2-_SPW/2, _Y + _HEIGHT-_SPH/2, _SPW, _SPH));
            g.DrawRectangle(pen, new Rectangle(_X + _WIDTH / 2 - _SPW, _Y + _HEIGHT - _HEIGHT2 - _SPH, _HEIGHT2, _WIDTH2));

            g.FillEllipse(sb, new Rectangle(_X + _WIDTH-_SPW/2, _Y + _HEIGHT/2-_SPH/2, _SPW, _SPH));
            g.DrawRectangle(pen, new Rectangle(_X + _WIDTH - _WIDTH2/2, _Y + _HEIGHT / 2 - _SPH, _WIDTH2, _HEIGHT2));

            g.FillEllipse(sb, new Rectangle(_X + _WIDTH/2-_SPW/2, _Y-_SPH/2, _SPW, _SPH));
            g.DrawRectangle(pen, new Rectangle(_X + _WIDTH / 2 - _SPW, _Y - _HEIGHT2 - _SPH, _HEIGHT2, _WIDTH2));
}

追问

谢谢

本回答被网友采纳

想用C#画一个矩形,点击这个矩形时有八个点能够调整其大小。求各位高手指...
方法一:用UserControl,在八个点的位置放八个空心的Label,然后再设置这些Label的MouseDown和MouseMove事件来控制 方法二:做成一个设计工具,类似于IDE的WinForm设计器,可参考以下链接,非常麻烦,但值得研究一下 http:\/\/support.microsoft.com\/?id=813808 看说明是使用了.NET Framework 1.1的,但代码...

winform中(C#):在图片上画了一个矩形,为什么非要刷新才能显示矩形?
在C#语言中几乎所有控件全部都是通过这个Paint事件来进行绘制的。想正确的使用Paint事件首先我们要先了解跟这个Paint事件有关联的PaintEventHandler委托,PaintEventHandler是定义在System.Windows.Forms名词空间下的委托,这个委托参数中有一个PaintEventArgs的类,而这个类呢就对我们进行绘制时相当有用了.你的矩...

请教C#中如何在 WinForm中画曲线图
Point[ ] 点组, float 张力) { 画纸.DrawCurve(钢笔, 点组, 张力); } public void 绘制曲线(Pen 钢笔, PointF[ ] 点组, int 偏移, int 段数)

C#WinForm如何在点击按钮获取数据后,将数据在按钮所在窗体上显示...
根据返回的数据行,动态计算出需要增加的高度,重新设置窗体的高度。再将数据显示到表格中即可。如果数据为空,则隐藏表格。

C# winform GDI 或者别的方法做出下图效果 扇形个数不确定的 求大神帮...
WinForm做这个可能比较难,不过可以考虑用MsChart实现,根据进度的值生成饼图,在数据变化后刷新;WPF应该要简单得多,特别是高光,半透明,实时刷新这些

寻高人!小弟想用C#做一个心形的窗体!
1.建立winform应用程序 2.找到窗体的Load事件,双击进行编辑 3.编写方法,主要的代码如下:代码 classBitmapRegion { publicBitmapRegion(){} \/\/\/ \/\/\/Createandapplytheregiononthesuppliedcontrol \/\/\/创建支持位图区域的控件(目前有button和form)\/\/\/ \/\/\/TheControlobjecttoapplytheregionto控件 \/\/...

C#(.net)(Winform的)关于两个控件之间连线的问题!!!急急!!!高分求解 ...
可以给你一个思路,在两个listview中间放一个panel作为画线的地方,用mousedown,mouseMove和mouseUp,这个对你来说应该不难了 关键是获取这两行数据 在listview里面有一个AutoScrollOffset判断当前滚动条所在位置,然后再结合你连线的起始点的位置(因为一样数据占的行距是一样的,根据你listview所在位置和你...

c#的 winform怎么使弹出的窗口在屏幕的正中间,就是当我点击链接弹出的窗...
首先,打开Visual Studio 2015,选择新建一个Windows窗体应用程序项目。启动后,你会看到一个空白的窗体界面。接下来,右键单击窗体,选择"属性"选项,这将打开窗体的属性面板。在众多属性中,找到并定位到"StartPosition"这一项。在这里,你需要将其设置为"CenterScreen",这意味着窗口将在屏幕中心位置打开。...

在c#winform里面怎么画波形图
public void 绘制曲线(Pen 钢笔, PointF[ ] 点组, int 偏移, int 段数){ 画纸.DrawCurve(钢笔, 点组, 偏移, 段数); } public void 绘制曲线(Pen 钢笔, PointF[ ] 点组, int 偏移, int 段数, float 张力){ 画纸.DrawCurve(钢笔, 点组, 偏移, 段数, 张力); } public void 绘制...

C# winform 窗体里 用GDI+画一条直线 怎么用鼠标点击这条直线,触发事件...
首先你需要先将这个直线的坐标记录下来,记录起点终点即可。在窗体或者是你画线的控件中捕获click事件,在click事件里面获取当前鼠标的坐标位置,根据此坐标计算此点到记录的直线之间的距离,如果小于一定值,比如小于2个像素就认为点中了此直线,就可一触发其他事件执行操作了。关键是如何判断鼠标点中的点在...

相似回答