C#实战篇-基于OOP设计新体育彩票选号器
一:项目结构
前端界面详情
二:项目分析
三:代码详情
NumberSelector类:用于生成随机数(附加打印彩票,保存彩票信息)
/// <summary>/// 选号器类/// </summary>class NumberSelector{#region 属性和构造方法/// <summary>/// 组选:数据集合/// </summary>public List<string[]> SlectNumber { get; set; }/// <summary>/// 随机数/// </summary>private Random ran = new Random();/// <summary>/// /创建条码生成对象/// </summary>Fath.BarcodeX barCode = new Fath.BarcodeX();//方法(构造方法:初始化类,成员,实例方法)public NumberSelector(){this.SlectNumber = new List<string[]>();}#endregion#region 生成7个随机数/// <summary>/// 生成7个随机数/// </summary>/// <returns></returns>public string[] CreateNumber(){string[] str = new string[7];for (int i = 0; i < 7; i++){str[i] = ran.Next(10).ToString();}return str;}#endregion#region 生成几组随机数/// <summary>/// 生成几组随机数/// </summary>/// <param name="count"></param>public void CreateGroup(int count){for (int i = 0; i < count; i++){SlectNumber.Add(CreateNumber());//根据传递来的count组数,生成几组7个随机数}}#endregion#region 获取打印的数字/// <summary>/// 获取打印的数字/// </summary>/// <returns></returns>public List<string> GetPrintNumber(){List<string> listnumber = new List<string>();for (int i = 0; i < SlectNumber.Count; i++){string str = string.Empty;if(i<9)str = "第0"+(i+1)+"组: ";elsestr = "第" + (i + 1) + "组: ";for (int a = 0; a < SlectNumber[i].Length; a++){if(a==5)str += SlectNumber[i][a] + " ";elsestr += SlectNumber[i][a]+" ";}listnumber.Add(str);}return listnumber;}#endregion#region 打印彩票/// <summary>/// 打印彩票/// </summary>public void PrintLottery(System.Drawing.Printing.PrintPageEventArgs e, string serialNum, List<string> numList){//生成条形码barCode.Text = serialNum;//条码数据barCode.Symbology = Fath.bcType.Code128;//设置条码格式barCode.ShowText = true;//同时显示文本 e.Graphics.DrawImage(barCode.Image(240, 50), new Point(20, 5));//画条形码//生成彩票信息float left = 2; //打印区域的左边界float top = 70;//打印区域的上边界Font titlefont = new Font("仿宋", 10);//标题字体Font font = new Font("仿宋", 8);//内容字体 e.Graphics.DrawString("重庆千万奖彩票中心", titlefont, Brushes.Blue, left + 20, top, new StringFormat());//打印标题//画一条分界线Pen pen = new Pen(Color.Green, 1);e.Graphics.DrawLine(pen, new Point((int)left - 2, (int)top + 20), new Point((int)left + (int)180, (int)top + 20));//循环打印选号for (int i = 0; i < numList.Count; i++){e.Graphics.DrawString(numList[i], font, Brushes.Blue, left,top + titlefont.GetHeight(e.Graphics) + font.GetHeight(e.Graphics) * i + 12, new StringFormat());}//画一条分界线 float topPoint = titlefont.GetHeight(e.Graphics) + font.GetHeight(e.Graphics) * (numList.Count) + 22;e.Graphics.DrawLine(pen, new Point((int)left - 2, (int)top + (int)topPoint),new Point((int)left + (int)180, (int)top + (int)topPoint));//打印时间string time = "购买时间:" + DateTime.Now.ToString("yyy-MM-dd HH:mm:ss");e.Graphics.DrawString(time, font, Brushes.Blue, left, top + titlefont.GetHeight(e.Graphics)+ font.GetHeight(e.Graphics) * (numList.Count + 1) + 12, new StringFormat());//二维码图片left和top坐标int qrcodetop = (int)(top + titlefont.GetHeight(e.Graphics) + font.GetHeight(e.Graphics) * (numList.Count + 3) + 12);int qrcodeleft = (int)left + 32;//生成二维码图片//直接添加流水号,将来从网站直接查询Image bmp = QRcodeCreator.GetQRCodeBmp("http://www.itguye.top");//打印e.Graphics.DrawImage(bmp, new Point(qrcodeleft, qrcodetop));//不同的URL图片大小不同,可以根据需要调整left坐标e.Graphics.DrawString("扫描二维码可直接查询兑奖结果", font, Brushes.Blue, left, qrcodetop + bmp.Height + 10, new StringFormat());}#endregion#region 将打印的信息保存到文件中去/// <summary>/// 保存用户所选彩票信息(实际开发中,可以保存到数据库)/// </summary>/// <param name="serialNum"></param>public void Save(string serialNum){DirectoryInfo dir = new DirectoryInfo(@"D:\c#基础练习\课程三【1】必学】基于OOP设计新体育彩票选号器\");if (!dir.Exists){dir.Create();}string path = @"D:\c#基础练习\课程三【1】必学】基于OOP设计新体育彩票选号器\" + serialNum + ".num";FileStream fs = new FileStream(path, FileMode.Create);BinaryFormatter bf = new BinaryFormatter();bf.Serialize(fs, this.SlectNumber);fs.Close();}#endregion}
QRcodeCreator类:根据链接生成二维码
#region 根据链接生成二维码/// <summary>/// 根据链接获取二维码/// </summary>/// <param name="url">链接</param>/// <returns>返回二维码图片</returns>public static Image GetQRCodeBmp(string url){QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;qrCodeEncoder.QRCodeScale = 4;qrCodeEncoder.QRCodeVersion = 0;qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;return qrCodeEncoder.Encode(url);}#endregion
FormMain类:用户交互页面后端代码
public partial class FormMain : Form{//生成随机数NumberSelector numberselect = new NumberSelector();//【1】创建打印对象private PrintDocument printDoc = new PrintDocument();//创建打印对象public FormMain(){InitializeComponent();//禁用按钮btnConfirmationNumber.Enabled = false;btnPrintLotteryTickets.Enabled = false;btnEmptyNumber.Enabled = false;btnDeleteNumber.Enabled = false;//【2】关联事件//关联打印对象的事件this.printDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.LotteryPrintPage);}/*生成流水号*/private void LotteryPrintPage(object sender, PrintPageEventArgs e){string serialNum = DateTime.Now.ToString("yyyyMMddHHmmssms");//流水号(生成条码使用)this.numberselect.PrintLottery(e, serialNum, numberselect.GetPrintNumber());//调用前面编写的打印方法numberselect.Save(serialNum);//同时保存所选号码btnEmptyNumber_Click(null, null);//打印完毕后清空}#region 窗体关闭,最小化,最大化事件/// <summary>/// 关闭主窗体事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnClose_Click(object sender, EventArgs e){this.Close();}/// <summary>/// 最小化主窗体事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnMinimize_Click(object sender, EventArgs e){this.WindowState = FormWindowState.Minimized;}#endregion#region 窗体移动private Point mouseOff;//鼠标移动位置变量private bool leftFlag;//标签是否为左键private void FrmMain_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){mouseOff = new Point(-e.X, -e.Y); //得到变量的值leftFlag = true; //点击左键按下时标注为true;}}private void FrmMain_MouseMove(object sender, MouseEventArgs e){if (leftFlag){Point mouseSet = Control.MousePosition;mouseSet.Offset(mouseOff.X, mouseOff.Y); //设置移动后的位置Location = mouseSet;}}private void FrmMain_MouseUp(object sender, MouseEventArgs e){if (leftFlag){leftFlag = false;//释放鼠标后标注为false;}}#endregion/// <summary>/// 定时器事件,定时生成随机数/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void RandomTimer_Tick(object sender, EventArgs e){//生成随机数string[] str = numberselect.CreateNumber();//进行显示(大正方块lable标签从左到右n(1->7))n1.Text = str[0];n2.Text = str[1];n3.Text = str[2];n4.Text = str[3];n5.Text = str[4];n6.Text = str[5];n7.Text = str[6];}#region button相应的点击事件/// <summary>/// 随机组选事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnRandomGroup_Click(object sender, EventArgs e){RandomTimer.Stop();int countsum = 0;countsum = Convert.ToInt16(count.Text);if (countsum > 0){numberselect.CreateGroup(countsum);OBJshow();}elseMessageBox.Show("组数不能小于0","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Asterisk);}/// <summary>/// 手写号码事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnHandWrittenNumber_Click(object sender, EventArgs e){//小正方块lable从左到右t1到t7//获取数据List<string> li2 = new List<string>(){t1.Text,t2.Text,t3.Text,t4.Text,t5.Text,t6.Text,t7.Text};numberselect.SlectNumber.Add(li2.ToArray());OBJshow();}/// <summary>/// 随机选号事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnRandomSlectionNumber_Click(object sender, EventArgs e){//开始选号RandomTimer.Start();//禁用按钮btnRandomSlectionNumber.Enabled = false;btnConfirmationNumber.Enabled = true;}/// <summary>/// 确认选号事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnConfirmationNumber_Click(object sender, EventArgs e){//停止定时器this.RandomTimer.Stop();//禁用按钮btnRandomSlectionNumber.Enabled = true;btnConfirmationNumber.Enabled = false;//获取数据List<string> li = new List<string>(){n1.Text,n2.Text,n3.Text,n4.Text,n5.Text,n6.Text,n7.Text};numberselect.SlectNumber.Add(li.ToArray());OBJshow();}//生成随机数进行显示private void OBJshow(){//显示displayNumber.Items.Clear();displayNumber.Items.AddRange(numberselect.GetPrintNumber().ToArray());btnDeleteNumber.Enabled =btnEmptyNumber.Enabled =btnPrintLotteryTickets.Enabled = true;}/// <summary>/// 删除选号事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnDeleteNumber_Click(object sender, EventArgs e){//if (numberselect.SlectNumber.Count == 0)//判断内容是否为空if (this.displayNumber.Items.Count == 0 || displayNumber.SelectedItem == null)return;//获取索引int index = this.displayNumber.SelectedIndex;numberselect.SlectNumber.RemoveAt(index);OBJshow();if (numberselect.SlectNumber.Count == 0){btnDeleteNumber.Enabled= btnPrintLotteryTickets.Enabled = false;return;}}/// <summary>/// 清空选号事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnEmptyNumber_Click(object sender, EventArgs e){//清空显示信息displayNumber.Items.Clear();//清空数据numberselect.SlectNumber.Clear();//号码复位n1.Text = "0";n2.Text = "0";n3.Text = "0";n4.Text = "0";n5.Text = "0";n6.Text = "0";n7.Text = "0";if (numberselect.SlectNumber.Count == 0){btnDeleteNumber.Enabled = btnPrintLotteryTickets.Enabled=btnEmptyNumber.Enabled = false;return;}}/// <summary>/// 打印彩票事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnPrintLotteryTickets_Click(object sender, EventArgs e){this.printDoc.Print();//开始打印进程}#endregion}
四:运行效果
- 随机选号
- 随机组选
- 手动选号
- 打印彩票效果
五:项目相关资料
- 打印彩票dll库
打印彩票dll库 - 项目完整代码
基于oop体育彩票选号器
C#实战篇-基于OOP设计新体育彩票选号器相关推荐
- C#笔记——【面向对象实战】(一)基于OPP设计新体育彩票选号器
(一)项目概述和效果展示 (二)项目面向对象分析 1)基于OOP(面向对象编程)设计项目的基本方法 项目的类型 基于OOP设计小型项目(可以使用数据库,也可以不使用数据库而采用其他数据源) 没有数据库 ...
- 基于Python实现体育彩票选号器功能代码实例
更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接:好看站 http://www.nrso.net/ 高州阳光论坛https://www.hnthzk.com/ 一 ...
- 体彩python_【Python】体育彩票选号器
from tkinter import * importtkinter.ttk as tkimportdatetimefrom tkinter.messagebox import * importtk ...
- java模拟电脑体育彩票的随机选号_利用JS来模拟体育彩票选号器
利用JS来模拟体育彩票选号器_网页代码站(www.webdm.cn) function Quickpick() { var ball for( ball = 0; ball < 5; ball+ ...
- C#体育彩票选号器案例
案例分析: 对象:选号器 属性:1.随机数 2.选号器集合(String数组的泛型集合) 要在LIstView中展示 方法:1.单组选号:随机生成7个随机数 2.随机单组:根据输入的组数,生成相 ...
- R语言dplyr包使用case_when函数和mutate函数生成新的数据列实战:基于单列生成新的数据列、基于多列生成新的数据列
R语言dplyr包使用case_when函数和mutate函数生成新的数据列实战:基于单列生成新的数据列.基于多列生成新的数据列 目录
- 深度学习实战篇-基于RNN的中文分词探索
深度学习实战篇-基于RNN的中文分词探索 近年来,深度学习在人工智能的多个领域取得了显著成绩.微软使用的152层深度神经网络在ImageNet的比赛上斩获多项第一,同时在图像识别中超过了人类的识别水平 ...
- 【NodeJs-5天学习】第三天实战篇③ ——基于MQTT的环境温度检测
[NodeJs-5天学习]第三天实战篇③ --基于MQTT的环境温度检测 1. 前言 2.实现思路 2.1 NodeJs服务器代码 2.2.1 本地部署MQTT服务器,端口1883 2.2.1.1 用 ...
- 【物联网服务NodeJs-5天学习】第三天实战篇③ ——基于MQTT的环境温度检测
[NodeJs-5天学习]第三天实战篇③ --基于MQTT的环境温度检测 1. 前言 2.实现思路 2.1 NodeJs服务器代码 2.2.1 本地部署MQTT服务器,端口1883 2.2.1.1 用 ...
- [嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计【2018年给力项目】
[嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计[2018年给力项目]是[创科之龙]团队aiku嵌入式视频教程系列制作的现有的音乐播放器. 主要功能实现: 1.新建工程,基类选 ...
最新文章
- 企业级OpenCV、图像识别资料免费下载,仅此1天!
- [LintCode] Reverse Pairs 翻转对
- html5的修改滚动条滑块样式,修改element-ui滚动条样式
- 如何使用计算机管理来为硬盘分区,电脑如何硬盘分区合理_电脑硬盘分区的基本步骤-win7之家...
- 禁用 device/credential guard_iOS 13.3.1 Beta版中引入了禁用U1超宽带芯片的开关
- 少儿编程scratch系统介绍(附网站源码)
- 史上最全 | 编程入门指南
- 开启windows10系统组策略更新、开启Windows自动更新、关闭自动更新
- Java基础 - 替罪羊树(Scapegoat Tree)
- 利用R语言画简单时间序列图
- DAVINCI和OMAP架构的区别
- echarts3实现世界地图
- Programming In Scala笔记-第十五章、Case Classes和模式匹配
- 数字世界中的纸张——理解 PDF (转载)
- PN532NFC模块串口通信使用教程
- IPUDN(用于单幅图像去雾的透射图和大气光导迭代更新器网络)CVPR_2020
- 响铃:聚焦图片版权,百度区块链产品“图腾”如何打好这副牌
- 软件外包的五点管理技巧
- 红米note1s android5,绕晕了:红米Note、红米1S各版本差异详解
- arch linux 2014 安装教程,Arch Linux 2014.03.01 硬盘安装 Win + Grub4dos + Arch
热门文章
- 14个阿里高管的研发管理实践和思考 | 凌云时刻
- 各行各业有对象系列之三:对象存储与银行
- 计算机房选址,数据中心机房如何选址 数据中心机房如何日常维护
- 毕设题目:Matlab疾病识别与分类
- 2021全国大学生数学建模竞赛报名通知+试题+优秀论文
- python with as 用法_你在 Python 中常常写的 with..as.. 到底是个啥?
- 聊天工具机器人开发_聊天机器人-精致的交流工具? 还是您的客户服务团队不可或缺的成员?...
- 高新计算机考试1-8视频,最新版计算机高新考试 PS 第1单元1-8.doc
- oracle 泵备份,Oracle逻辑备份之数据泵(一)
- linux 5.8 设备的mac地址与预想的不符 已忽略,解决“eth0设备的MAC 址与预想的不符,忽略”...