一:项目结构


前端界面详情

二:项目分析

三:代码详情

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设计新体育彩票选号器相关推荐

  1. C#笔记——【面向对象实战】(一)基于OPP设计新体育彩票选号器

    (一)项目概述和效果展示 (二)项目面向对象分析 1)基于OOP(面向对象编程)设计项目的基本方法 项目的类型 基于OOP设计小型项目(可以使用数据库,也可以不使用数据库而采用其他数据源) 没有数据库 ...

  2. 基于Python实现体育彩票选号器功能代码实例

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接:好看站 http://www.nrso.net/ 高州阳光论坛https://www.hnthzk.com/ 一 ...

  3. 体彩python_【Python】体育彩票选号器

    from tkinter import * importtkinter.ttk as tkimportdatetimefrom tkinter.messagebox import * importtk ...

  4. java模拟电脑体育彩票的随机选号_利用JS来模拟体育彩票选号器

    利用JS来模拟体育彩票选号器_网页代码站(www.webdm.cn) function Quickpick() { var ball for( ball = 0; ball < 5; ball+ ...

  5. C#体育彩票选号器案例

    案例分析: 对象:选号器 属性:1.随机数   2.选号器集合(String数组的泛型集合) 要在LIstView中展示 方法:1.单组选号:随机生成7个随机数  2.随机单组:根据输入的组数,生成相 ...

  6. R语言dplyr包使用case_when函数和mutate函数生成新的数据列实战:基于单列生成新的数据列、基于多列生成新的数据列

    R语言dplyr包使用case_when函数和mutate函数生成新的数据列实战:基于单列生成新的数据列.基于多列生成新的数据列 目录

  7. 深度学习实战篇-基于RNN的中文分词探索

    深度学习实战篇-基于RNN的中文分词探索 近年来,深度学习在人工智能的多个领域取得了显著成绩.微软使用的152层深度神经网络在ImageNet的比赛上斩获多项第一,同时在图像识别中超过了人类的识别水平 ...

  8. 【NodeJs-5天学习】第三天实战篇③ ——基于MQTT的环境温度检测

    [NodeJs-5天学习]第三天实战篇③ --基于MQTT的环境温度检测 1. 前言 2.实现思路 2.1 NodeJs服务器代码 2.2.1 本地部署MQTT服务器,端口1883 2.2.1.1 用 ...

  9. 【物联网服务NodeJs-5天学习】第三天实战篇③ ——基于MQTT的环境温度检测

    [NodeJs-5天学习]第三天实战篇③ --基于MQTT的环境温度检测 1. 前言 2.实现思路 2.1 NodeJs服务器代码 2.2.1 本地部署MQTT服务器,端口1883 2.2.1.1 用 ...

  10. [嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计【2018年给力项目】

    [嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计[2018年给力项目]是[创科之龙]团队aiku嵌入式视频教程系列制作的现有的音乐播放器. 主要功能实现: 1.新建工程,基类选 ...

最新文章

  1. 企业级OpenCV、图像识别资料免费下载,仅此1天!
  2. [LintCode] Reverse Pairs 翻转对
  3. html5的修改滚动条滑块样式,修改element-ui滚动条样式
  4. 如何使用计算机管理来为硬盘分区,电脑如何硬盘分区合理_电脑硬盘分区的基本步骤-win7之家...
  5. 禁用 device/credential guard_iOS 13.3.1 Beta版中引入了禁用U1超宽带芯片的开关
  6. 少儿编程scratch系统介绍(附网站源码)
  7. 史上最全 | 编程入门指南
  8. 开启windows10系统组策略更新、开启Windows自动更新、关闭自动更新
  9. Java基础 - 替罪羊树(Scapegoat Tree)
  10. 利用R语言画简单时间序列图
  11. DAVINCI和OMAP架构的区别
  12. echarts3实现世界地图
  13. Programming In Scala笔记-第十五章、Case Classes和模式匹配
  14. 数字世界中的纸张——理解 PDF (转载)
  15. PN532NFC模块串口通信使用教程
  16. IPUDN(用于单幅图像去雾的透射图和大气光导迭代更新器网络)CVPR_2020
  17. 响铃:聚焦图片版权,百度区块链产品“图腾”如何打好这副牌
  18. 软件外包的五点管理技巧
  19. 红米note1s android5,绕晕了:红米Note、红米1S各版本差异详解
  20. arch linux 2014 安装教程,Arch Linux 2014.03.01 硬盘安装 Win + Grub4dos + Arch

热门文章

  1. 14个阿里高管的研发管理实践和思考 | 凌云时刻
  2. 各行各业有对象系列之三:对象存储与银行
  3. 计算机房选址,数据中心机房如何选址 数据中心机房如何日常维护
  4. 毕设题目:Matlab疾病识别与分类
  5. 2021全国大学生数学建模竞赛报名通知+试题+优秀论文
  6. python with as 用法_你在 Python 中常常写的 with..as.. 到底是个啥?
  7. 聊天工具机器人开发_聊天机器人-精致的交流工具? 还是您的客户服务团队不可或缺的成员?...
  8. 高新计算机考试1-8视频,最新版计算机高新考试 PS 第1单元1-8.doc
  9. oracle 泵备份,Oracle逻辑备份之数据泵(一)
  10. linux 5.8 设备的mac地址与预想的不符 已忽略,解决“eth0设备的MAC 址与预想的不符,忽略”...